diff options
| -rw-r--r-- | source3/utils/net_help.c | 1 | ||||
| -rw-r--r-- | source3/utils/net_rpc.c | 88 | 
2 files changed, 89 insertions, 0 deletions
diff --git a/source3/utils/net_help.c b/source3/utils/net_help.c index c688beef72..059da4740b 100644 --- a/source3/utils/net_help.c +++ b/source3/utils/net_help.c @@ -93,6 +93,7 @@ int net_help_group(int argc, const char **argv)  		 "\n\tDelete specified group\n");  	d_printf("\nnet [<method>] group ADD <name> [-C comment] [-c container]"\  		 " [misc. options] [targets]\n\tCreate specified group\n"); +	d_printf("\nnet rpc group MEMBERS <name>\n\tList Group Members\n\n");  	net_common_methods_usage(argc, argv);  	net_common_flags_usage(argc, argv);  	d_printf("\t-C or --comment=<comment>\tdescriptive comment (for add only)\n"); diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c index 747fc63e23..af575d9585 100644 --- a/source3/utils/net_rpc.c +++ b/source3/utils/net_rpc.c @@ -1064,6 +1064,93 @@ rpc_group_list_internals(const DOM_SID *domain_sid, struct cli_state *cli,  	return result;  } +static NTSTATUS  +rpc_group_members_internals(const DOM_SID *domain_sid, struct cli_state *cli, +			    TALLOC_CTX *mem_ctx, int argc, const char **argv) +{ +	NTSTATUS result; +	POLICY_HND connect_pol, domain_pol, group_pol; +	uint32 num_rids, *rids, *rid_types; +	uint32 num_members, *group_rids, *group_attrs; +	uint32 num_names; +	char **names; +	uint32 *name_types; +	int i; + +	/* Get sam policy handle */ +	 +	result = cli_samr_connect(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS,  +				  &connect_pol); +	if (!NT_STATUS_IS_OK(result)) { +		goto done; +	} +	 +	/* Get domain policy handle */ +	 +	result = cli_samr_open_domain(cli, mem_ctx, &connect_pol, +				      MAXIMUM_ALLOWED_ACCESS, +				      domain_sid, &domain_pol); +	if (!NT_STATUS_IS_OK(result)) { +		goto done; +	} + +	result = cli_samr_lookup_names(cli, mem_ctx, &domain_pol, 1000, +				       1, argv, &num_rids, &rids, &rid_types); + +	if (!NT_STATUS_IS_OK(result)) { +		goto done; +	} + +	if (num_rids != 1) { +		d_printf("Could not find group %s\n", argv[0]); +		goto done; +	} + +	if (rid_types[0] != SID_NAME_DOM_GRP) { +		d_printf("%s is not a domain group\n", argv[0]); +		goto done; +	} + +	result = cli_samr_open_group(cli, mem_ctx, &domain_pol, +				     MAXIMUM_ALLOWED_ACCESS, +				     rids[0], &group_pol); + +	if (!NT_STATUS_IS_OK(result)) +		goto done; + +	result = cli_samr_query_groupmem(cli, mem_ctx, &group_pol, +					 &num_members, &group_rids, +					 &group_attrs); + +	if (!NT_STATUS_IS_OK(result)) +		goto done; + +	result = cli_samr_lookup_rids(cli, mem_ctx, &domain_pol, 1000, +				      num_members, group_rids, +				      &num_names, &names, &name_types); + +	if (!NT_STATUS_IS_OK(result)) +		goto done; + +	for (i = 0; i < num_members; i++) { +		printf("%s\n", names[i]); +	} + + done: +	return result; +} + +static int rpc_group_members(int argc, const char **argv) +{ +	if (argc != 1) { +		return rpc_group_usage(argc, argv); +	} + +	return run_rpc_command(NULL, PI_SAMR, 0, +			       rpc_group_members_internals, +			       argc, argv); +} +  /**    * 'net rpc group' entrypoint.   * @param argc  Standard main() style argc @@ -1078,6 +1165,7 @@ int net_rpc_group(int argc, const char **argv)  		{"add", rpc_group_add},  		{"delete", rpc_group_delete},  #endif +		{"members", rpc_group_members},  		{NULL, NULL}  	};  | 
