diff options
-rw-r--r-- | source3/rpcclient/cmd_samr.c | 17 | ||||
-rw-r--r-- | source3/utils/net_rpc.c | 45 | ||||
-rw-r--r-- | source3/winbindd/winbindd_rpc.c | 10 |
3 files changed, 42 insertions, 30 deletions
diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c index ccea73e5a1..4ea436dc92 100644 --- a/source3/rpcclient/cmd_samr.c +++ b/source3/rpcclient/cmd_samr.c @@ -792,12 +792,13 @@ static NTSTATUS cmd_samr_query_groupmem(struct rpc_pipe_client *cli, { POLICY_HND connect_pol, domain_pol, group_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; - uint32 num_members, *group_rids, *group_attrs, group_rid; + uint32 group_rid; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; int i; fstring server; unsigned int old_timeout; - + struct samr_RidTypeArray *rids = NULL; + if ((argc < 2) || (argc > 3)) { printf("Usage: %s rid [access mask]\n", argv[0]); return NT_STATUS_OK; @@ -838,18 +839,18 @@ static NTSTATUS cmd_samr_query_groupmem(struct rpc_pipe_client *cli, /* Make sure to wait for our DC's reply */ old_timeout = cli_set_timeout(cli->cli, MAX(cli->cli->timeout,30000)); /* 30 seconds. */ - result = rpccli_samr_query_groupmem(cli, mem_ctx, &group_pol, - &num_members, &group_rids, - &group_attrs); + result = rpccli_samr_QueryGroupMember(cli, mem_ctx, + &group_pol, + &rids); cli_set_timeout(cli->cli, old_timeout); if (!NT_STATUS_IS_OK(result)) goto done; - for (i = 0; i < num_members; i++) { - printf("\trid:[0x%x] attr:[0x%x]\n", group_rids[i], - group_attrs[i]); + for (i = 0; i < rids->count; i++) { + printf("\trid:[0x%x] attr:[0x%x]\n", rids->rids[i], + rids->types[i]); } rpccli_samr_Close(cli, mem_ctx, &group_pol); diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c index 7887960a60..3dac937f36 100644 --- a/source3/utils/net_rpc.c +++ b/source3/utils/net_rpc.c @@ -1787,8 +1787,8 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, bool group_is_primary = False; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; - uint32 *group_rids, num_rids, *name_types, num_members, - *group_attrs, group_rid; + uint32 *group_rids, num_rids, *name_types, group_rid; + struct samr_RidTypeArray *rids = NULL; uint32 flags = 0x000003e8; /* Unknown */ /* char **names; */ int i; @@ -1847,11 +1847,11 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, } group_rid = group_rids[0]; - - result = rpccli_samr_query_groupmem(pipe_hnd, mem_ctx, &group_pol, - &num_members, &group_rids, - &group_attrs); - + + result = rpccli_samr_QueryGroupMember(pipe_hnd, mem_ctx, + &group_pol, + &rids); + if (!NT_STATUS_IS_OK(result)) { d_fprintf(stderr, "Unable to query group members of %s",argv[0]); goto done; @@ -1859,20 +1859,21 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, if (opt_verbose) { d_printf("Domain Group %s (rid: %d) has %d members\n", - argv[0],group_rid,num_members); + argv[0],group_rid, rids->count); } /* Check if group is anyone's primary group */ - for (i = 0; i < num_members; i++) + for (i = 0; i < rids->count; i++) { result = rpccli_samr_OpenUser(pipe_hnd, mem_ctx, &domain_pol, MAXIMUM_ALLOWED_ACCESS, - group_rids[i], + rids->rids[i], &user_pol); if (!NT_STATUS_IS_OK(result)) { - d_fprintf(stderr, "Unable to open group member %d\n",group_rids[i]); + d_fprintf(stderr, "Unable to open group member %d\n", + rids->rids[i]); goto done; } @@ -1882,7 +1883,8 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, 21, &user_ctr); if (!NT_STATUS_IS_OK(result)) { - d_fprintf(stderr, "Unable to lookup userinfo for group member %d\n",group_rids[i]); + d_fprintf(stderr, "Unable to lookup userinfo for group member %d\n", + rids->rids[i]); goto done; } @@ -1905,13 +1907,14 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, } /* remove all group members */ - for (i = 0; i < num_members; i++) + for (i = 0; i < rids->count; i++) { if (opt_verbose) - d_printf("Remove group member %d...",group_rids[i]); + d_printf("Remove group member %d...", + rids->rids[i]); result = rpccli_samr_DeleteGroupMember(pipe_hnd, mem_ctx, &group_pol, - group_rids[i]); + rids->rids[i]); if (NT_STATUS_IS_OK(result)) { if (opt_verbose) @@ -2801,11 +2804,12 @@ static NTSTATUS rpc_list_group_members(struct rpc_pipe_client *pipe_hnd, { NTSTATUS result; POLICY_HND group_pol; - uint32 num_members, *group_rids, *group_attrs; + uint32 num_members, *group_rids; uint32 num_names; char **names; uint32 *name_types; int i; + struct samr_RidTypeArray *rids = NULL; fstring sid_str; sid_to_fstring(sid_str, domain_sid); @@ -2819,13 +2823,16 @@ static NTSTATUS rpc_list_group_members(struct rpc_pipe_client *pipe_hnd, if (!NT_STATUS_IS_OK(result)) return result; - result = rpccli_samr_query_groupmem(pipe_hnd, mem_ctx, &group_pol, - &num_members, &group_rids, - &group_attrs); + result = rpccli_samr_QueryGroupMember(pipe_hnd, mem_ctx, + &group_pol, + &rids); if (!NT_STATUS_IS_OK(result)) return result; + num_members = rids->count; + group_rids = rids->rids; + while (num_members > 0) { int this_time = 512; diff --git a/source3/winbindd/winbindd_rpc.c b/source3/winbindd/winbindd_rpc.c index 7e35759348..a318199b62 100644 --- a/source3/winbindd/winbindd_rpc.c +++ b/source3/winbindd/winbindd_rpc.c @@ -691,6 +691,7 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, unsigned int j; struct rpc_pipe_client *cli; unsigned int orig_timeout; + struct samr_RidTypeArray *rids = NULL; DEBUG(10,("rpc: lookup_groupmem %s sid=%s\n", domain->name, sid_string_dbg(group_sid))); @@ -727,9 +728,9 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, orig_timeout = cli_set_timeout(cli->cli, 35000); - result = rpccli_samr_query_groupmem(cli, mem_ctx, - &group_pol, num_names, &rid_mem, - name_types); + result = rpccli_samr_QueryGroupMember(cli, mem_ctx, + &group_pol, + &rids); /* And restore our original timeout. */ cli_set_timeout(cli->cli, orig_timeout); @@ -739,6 +740,9 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, if (!NT_STATUS_IS_OK(result)) return result; + *num_names = rids->count; + rid_mem = rids->rids; + if (!*num_names) { names = NULL; name_types = NULL; |