diff options
-rw-r--r-- | source3/lib/netapi/group.c | 487 |
1 files changed, 367 insertions, 120 deletions
diff --git a/source3/lib/netapi/group.c b/source3/lib/netapi/group.c index b9dd1e9872..5507f71d30 100644 --- a/source3/lib/netapi/group.c +++ b/source3/lib/netapi/group.c @@ -23,7 +23,7 @@ #include "lib/netapi/netapi.h" #include "lib/netapi/netapi_private.h" #include "lib/netapi/libnetapi.h" -#include "../librpc/gen_ndr/cli_samr.h" +#include "../librpc/gen_ndr/ndr_samr_c.h" #include "rpc_client/init_lsa.h" #include "../libcli/security/security.h" @@ -34,12 +34,13 @@ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx, struct NetGroupAdd *r) { struct rpc_pipe_client *pipe_cli = NULL; - NTSTATUS status; + NTSTATUS status, result; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name; struct dom_sid2 *domain_sid = NULL; uint32_t rid = 0; + struct dcerpc_binding_handle *b = NULL; struct GROUP_INFO_0 *info0 = NULL; struct GROUP_INFO_1 *info1 = NULL; @@ -80,6 +81,8 @@ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -107,18 +110,23 @@ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx, break; } - status = rpccli_samr_CreateDomainGroup(pipe_cli, talloc_tos(), + status = dcerpc_samr_CreateDomainGroup(b, talloc_tos(), &domain_handle, &lsa_group_name, SEC_STD_DELETE | SAMR_GROUP_ACCESS_SET_INFO, &group_handle, - &rid); + &rid, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } switch (r->in.level) { case 1: @@ -126,10 +134,11 @@ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx, init_lsa_String(&info.description, info1->grpi1_comment); - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFODESCRIPTION, - &info); + &info, + &result); } break; case 2: @@ -137,22 +146,28 @@ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx, init_lsa_String(&info.description, info2->grpi2_comment); - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFODESCRIPTION, - &info); + &info, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto failed; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto failed; + } } if (info2->grpi2_attributes != 0) { info.attributes.attributes = info2->grpi2_attributes; - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOATTRIBUTES, - &info); + &info, + &result); } break; @@ -161,22 +176,28 @@ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx, init_lsa_String(&info.description, info3->grpi3_comment); - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFODESCRIPTION, - &info); + &info, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto failed; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto failed; + } } if (info3->grpi3_attributes != 0) { info.attributes.attributes = info3->grpi3_attributes; - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOATTRIBUTES, - &info); + &info, + &result); } break; default: @@ -187,17 +208,21 @@ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx, werr = ntstatus_to_werror(status); goto failed; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto failed; + } werr = WERR_OK; goto done; failed: - rpccli_samr_DeleteDomainGroup(pipe_cli, talloc_tos(), - &group_handle); + dcerpc_samr_DeleteDomainGroup(b, talloc_tos(), + &group_handle, &result); done: if (is_valid_policy_hnd(&group_handle)) { - rpccli_samr_Close(pipe_cli, talloc_tos(), &group_handle); + dcerpc_samr_Close(b, talloc_tos(), &group_handle, &result); } if (ctx->disable_policy_handle_cache) { @@ -224,12 +249,13 @@ WERROR NetGroupDel_r(struct libnetapi_ctx *ctx, struct NetGroupDel *r) { struct rpc_pipe_client *pipe_cli = NULL; - NTSTATUS status; + NTSTATUS status, result; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name; struct dom_sid2 *domain_sid = NULL; int i = 0; + struct dcerpc_binding_handle *b = NULL; struct samr_Ids rids; struct samr_Ids types; @@ -251,6 +277,8 @@ WERROR NetGroupDel_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -264,23 +292,28 @@ WERROR NetGroupDel_r(struct libnetapi_ctx *ctx, init_lsa_String(&lsa_group_name, r->in.group_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_group_name, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } if (types.ids[0] != SID_NAME_DOM_GRP) { werr = WERR_INVALID_DATATYPE; goto done; } - status = rpccli_samr_OpenGroup(pipe_cli, talloc_tos(), + status = dcerpc_samr_OpenGroup(b, talloc_tos(), &domain_handle, SEC_STD_DELETE | SAMR_GROUP_ACCESS_GET_MEMBERS | @@ -288,20 +321,30 @@ WERROR NetGroupDel_r(struct libnetapi_ctx *ctx, SAMR_GROUP_ACCESS_ADD_MEMBER | SAMR_GROUP_ACCESS_LOOKUP_INFO, rids.ids[0], - &group_handle); + &group_handle, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } - status = rpccli_samr_QueryGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_QueryGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOATTRIBUTES, - &info); + &info, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } #if 0 /* breaks against NT4 */ @@ -310,47 +353,67 @@ WERROR NetGroupDel_r(struct libnetapi_ctx *ctx, goto done; } #endif - status = rpccli_samr_QueryGroupMember(pipe_cli, talloc_tos(), + status = dcerpc_samr_QueryGroupMember(b, talloc_tos(), &group_handle, - &rid_array); + &rid_array, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } { struct lsa_Strings names; struct samr_Ids member_types; - status = rpccli_samr_LookupRids(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupRids(b, talloc_tos(), &domain_handle, rid_array->count, rid_array->rids, &names, - &member_types); + &member_types, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } } for (i=0; i < rid_array->count; i++) { - status = rpccli_samr_DeleteGroupMember(pipe_cli, talloc_tos(), + status = dcerpc_samr_DeleteGroupMember(b, talloc_tos(), &group_handle, - rid_array->rids[i]); + rid_array->rids[i], + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } } - status = rpccli_samr_DeleteDomainGroup(pipe_cli, talloc_tos(), - &group_handle); + status = dcerpc_samr_DeleteDomainGroup(b, talloc_tos(), + &group_handle, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } ZERO_STRUCT(group_handle); @@ -358,7 +421,7 @@ WERROR NetGroupDel_r(struct libnetapi_ctx *ctx, done: if (is_valid_policy_hnd(&group_handle)) { - rpccli_samr_Close(pipe_cli, talloc_tos(), &group_handle); + dcerpc_samr_Close(b, talloc_tos(), &group_handle, &result); } if (ctx->disable_policy_handle_cache) { @@ -385,11 +448,12 @@ WERROR NetGroupSetInfo_r(struct libnetapi_ctx *ctx, struct NetGroupSetInfo *r) { struct rpc_pipe_client *pipe_cli = NULL; - NTSTATUS status; + NTSTATUS status, result; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name; struct dom_sid2 *domain_sid = NULL; + struct dcerpc_binding_handle *b = NULL; struct samr_Ids rids; struct samr_Ids types; @@ -416,6 +480,8 @@ WERROR NetGroupSetInfo_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -429,99 +495,127 @@ WERROR NetGroupSetInfo_r(struct libnetapi_ctx *ctx, init_lsa_String(&lsa_group_name, r->in.group_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_group_name, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } if (types.ids[0] != SID_NAME_DOM_GRP) { werr = WERR_INVALID_DATATYPE; goto done; } - status = rpccli_samr_OpenGroup(pipe_cli, talloc_tos(), + status = dcerpc_samr_OpenGroup(b, talloc_tos(), &domain_handle, SAMR_GROUP_ACCESS_SET_INFO | SAMR_GROUP_ACCESS_LOOKUP_INFO, rids.ids[0], - &group_handle); + &group_handle, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } switch (r->in.level) { case 0: g0 = (struct GROUP_INFO_0 *)r->in.buffer; init_lsa_String(&info.name, g0->grpi0_name); - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFONAME, - &info); + &info, + &result); break; case 1: g1 = (struct GROUP_INFO_1 *)r->in.buffer; init_lsa_String(&info.description, g1->grpi1_comment); - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFODESCRIPTION, - &info); + &info, + &result); break; case 2: g2 = (struct GROUP_INFO_2 *)r->in.buffer; init_lsa_String(&info.description, g2->grpi2_comment); - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFODESCRIPTION, - &info); + &info, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } + info.attributes.attributes = g2->grpi2_attributes; - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOATTRIBUTES, - &info); + &info, + &result); break; case 3: g3 = (struct GROUP_INFO_3 *)r->in.buffer; init_lsa_String(&info.description, g3->grpi3_comment); - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFODESCRIPTION, - &info); + &info, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } + info.attributes.attributes = g3->grpi3_attributes; - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOATTRIBUTES, - &info); + &info, + &result); break; case 1002: g1002 = (struct GROUP_INFO_1002 *)r->in.buffer; init_lsa_String(&info.description, g1002->grpi1002_comment); - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFODESCRIPTION, - &info); + &info, + &result); break; case 1005: g1005 = (struct GROUP_INFO_1005 *)r->in.buffer; info.attributes.attributes = g1005->grpi1005_attributes; - status = rpccli_samr_SetGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_SetGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOATTRIBUTES, - &info); + &info, + &result); break; default: status = NT_STATUS_INVALID_LEVEL; @@ -532,12 +626,16 @@ WERROR NetGroupSetInfo_r(struct libnetapi_ctx *ctx, werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { - rpccli_samr_Close(pipe_cli, talloc_tos(), &group_handle); + dcerpc_samr_Close(b, talloc_tos(), &group_handle, &result); } if (ctx->disable_policy_handle_cache) { @@ -625,11 +723,12 @@ WERROR NetGroupGetInfo_r(struct libnetapi_ctx *ctx, struct NetGroupGetInfo *r) { struct rpc_pipe_client *pipe_cli = NULL; - NTSTATUS status; + NTSTATUS status, result; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name; struct dom_sid2 *domain_sid = NULL; + struct dcerpc_binding_handle *b = NULL; struct samr_Ids rids; struct samr_Ids types; @@ -651,6 +750,8 @@ WERROR NetGroupGetInfo_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -664,46 +765,67 @@ WERROR NetGroupGetInfo_r(struct libnetapi_ctx *ctx, init_lsa_String(&lsa_group_name, r->in.group_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_group_name, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } if (types.ids[0] != SID_NAME_DOM_GRP) { werr = WERR_INVALID_DATATYPE; goto done; } - status = rpccli_samr_OpenGroup(pipe_cli, talloc_tos(), + status = dcerpc_samr_OpenGroup(b, talloc_tos(), &domain_handle, SAMR_GROUP_ACCESS_LOOKUP_INFO, rids.ids[0], - &group_handle); + &group_handle, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } - status = rpccli_samr_QueryGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_QueryGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOALL2, - &info); - if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS)) { - status = rpccli_samr_QueryGroupInfo(pipe_cli, talloc_tos(), + &info, + &result); + if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } + + if (NT_STATUS_EQUAL(result, NT_STATUS_INVALID_INFO_CLASS)) { + status = dcerpc_samr_QueryGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOALL, - &info); + &info, + &result); group_info_all = true; + if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } } - if (!NT_STATUS_IS_OK(status)) { - werr = ntstatus_to_werror(status); + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); goto done; } @@ -716,7 +838,7 @@ WERROR NetGroupGetInfo_r(struct libnetapi_ctx *ctx, } done: if (is_valid_policy_hnd(&group_handle)) { - rpccli_samr_Close(pipe_cli, talloc_tos(), &group_handle); + dcerpc_samr_Close(b, talloc_tos(), &group_handle, &result); } if (ctx->disable_policy_handle_cache) { @@ -743,11 +865,12 @@ WERROR NetGroupAddUser_r(struct libnetapi_ctx *ctx, struct NetGroupAddUser *r) { struct rpc_pipe_client *pipe_cli = NULL; - NTSTATUS status; + NTSTATUS status, result; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name, lsa_user_name; struct dom_sid2 *domain_sid = NULL; + struct dcerpc_binding_handle *b = NULL; struct samr_Ids rids; struct samr_Ids types; @@ -767,6 +890,8 @@ WERROR NetGroupAddUser_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -780,13 +905,18 @@ WERROR NetGroupAddUser_r(struct libnetapi_ctx *ctx, init_lsa_String(&lsa_group_name, r->in.group_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_group_name, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } + if (!NT_STATUS_IS_OK(result)) { werr = WERR_GROUPNOTFOUND; goto done; } @@ -796,25 +926,35 @@ WERROR NetGroupAddUser_r(struct libnetapi_ctx *ctx, goto done; } - status = rpccli_samr_OpenGroup(pipe_cli, talloc_tos(), + status = dcerpc_samr_OpenGroup(b, talloc_tos(), &domain_handle, SAMR_GROUP_ACCESS_ADD_MEMBER, rids.ids[0], - &group_handle); + &group_handle, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } init_lsa_String(&lsa_user_name, r->in.user_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_user_name, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } + if (!NT_STATUS_IS_OK(result)) { werr = WERR_USER_NOT_FOUND; goto done; } @@ -824,20 +964,25 @@ WERROR NetGroupAddUser_r(struct libnetapi_ctx *ctx, goto done; } - status = rpccli_samr_AddGroupMember(pipe_cli, talloc_tos(), + status = dcerpc_samr_AddGroupMember(b, talloc_tos(), &group_handle, rids.ids[0], - 7); /* why ? */ + 7, /* why ? */ + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { - rpccli_samr_Close(pipe_cli, talloc_tos(), &group_handle); + dcerpc_samr_Close(b, talloc_tos(), &group_handle, &result); } if (ctx->disable_policy_handle_cache) { @@ -864,11 +1009,12 @@ WERROR NetGroupDelUser_r(struct libnetapi_ctx *ctx, struct NetGroupDelUser *r) { struct rpc_pipe_client *pipe_cli = NULL; - NTSTATUS status; + NTSTATUS status, result; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name, lsa_user_name; struct dom_sid2 *domain_sid = NULL; + struct dcerpc_binding_handle *b = NULL; struct samr_Ids rids; struct samr_Ids types; @@ -888,6 +1034,8 @@ WERROR NetGroupDelUser_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -901,13 +1049,18 @@ WERROR NetGroupDelUser_r(struct libnetapi_ctx *ctx, init_lsa_String(&lsa_group_name, r->in.group_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_group_name, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } + if (!NT_STATUS_IS_OK(result)) { werr = WERR_GROUPNOTFOUND; goto done; } @@ -917,25 +1070,36 @@ WERROR NetGroupDelUser_r(struct libnetapi_ctx *ctx, goto done; } - status = rpccli_samr_OpenGroup(pipe_cli, talloc_tos(), + status = dcerpc_samr_OpenGroup(b, talloc_tos(), &domain_handle, SAMR_GROUP_ACCESS_REMOVE_MEMBER, rids.ids[0], - &group_handle); + &group_handle, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } init_lsa_String(&lsa_user_name, r->in.user_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_user_name, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } + + if (!NT_STATUS_IS_OK(result)) { werr = WERR_USER_NOT_FOUND; goto done; } @@ -945,19 +1109,24 @@ WERROR NetGroupDelUser_r(struct libnetapi_ctx *ctx, goto done; } - status = rpccli_samr_DeleteGroupMember(pipe_cli, talloc_tos(), + status = dcerpc_samr_DeleteGroupMember(b, talloc_tos(), &group_handle, - rids.ids[0]); + rids.ids[0], + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { - rpccli_samr_Close(pipe_cli, talloc_tos(), &group_handle); + dcerpc_samr_Close(b, talloc_tos(), &group_handle, &result); } if (ctx->disable_policy_handle_cache) { @@ -1139,10 +1308,12 @@ WERROR NetGroupEnum_r(struct libnetapi_ctx *ctx, struct policy_handle domain_handle; union samr_DispInfo info; union samr_DomainInfo *domain_info = NULL; + struct dcerpc_binding_handle *b = NULL; uint32_t total_size = 0; uint32_t returned_size = 0; + NTSTATUS result = NT_STATUS_OK; NTSTATUS status = NT_STATUS_OK; WERROR werr, tmp_werr; @@ -1166,6 +1337,8 @@ WERROR NetGroupEnum_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -1179,20 +1352,25 @@ WERROR NetGroupEnum_r(struct libnetapi_ctx *ctx, goto done; } - status = rpccli_samr_QueryDomainInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_QueryDomainInfo(b, talloc_tos(), &domain_handle, 2, - &domain_info); + &domain_info, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } if (r->out.total_entries) { *r->out.total_entries = domain_info->general.num_groups; } - status = rpccli_samr_QueryDisplayInfo2(pipe_cli, + status = dcerpc_samr_QueryDisplayInfo2(b, ctx, &domain_handle, 3, @@ -1202,9 +1380,15 @@ WERROR NetGroupEnum_r(struct libnetapi_ctx *ctx, r->in.prefmaxlen, &total_size, &returned_size, - &info); - werr = ntstatus_to_werror(status); - if (NT_STATUS_IS_ERR(status)) { + &info, + &result); + if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } + + werr = ntstatus_to_werror(result); + if (NT_STATUS_IS_ERR(result)) { goto done; } @@ -1226,8 +1410,8 @@ WERROR NetGroupEnum_r(struct libnetapi_ctx *ctx, done: /* if last query */ - if (NT_STATUS_IS_OK(status) || - NT_STATUS_IS_ERR(status)) { + if (NT_STATUS_IS_OK(result) || + NT_STATUS_IS_ERR(result)) { if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); @@ -1263,11 +1447,13 @@ WERROR NetGroupGetUsers_r(struct libnetapi_ctx *ctx, struct samr_RidAttrArray *rid_array = NULL; struct lsa_Strings names; struct samr_Ids member_types; + struct dcerpc_binding_handle *b = NULL; int i; uint32_t entries_read = 0; NTSTATUS status = NT_STATUS_OK; + NTSTATUS result = NT_STATUS_OK; WERROR werr; ZERO_STRUCT(connect_handle); @@ -1297,6 +1483,8 @@ WERROR NetGroupGetUsers_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -1310,45 +1498,65 @@ WERROR NetGroupGetUsers_r(struct libnetapi_ctx *ctx, init_lsa_String(&lsa_account_name, r->in.group_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_account_name, &group_rids, - &name_types); + &name_types, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } - status = rpccli_samr_OpenGroup(pipe_cli, talloc_tos(), + status = dcerpc_samr_OpenGroup(b, talloc_tos(), &domain_handle, SAMR_GROUP_ACCESS_GET_MEMBERS, group_rids.ids[0], - &group_handle); + &group_handle, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } - status = rpccli_samr_QueryGroupMember(pipe_cli, talloc_tos(), + status = dcerpc_samr_QueryGroupMember(b, talloc_tos(), &group_handle, - &rid_array); + &rid_array, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } - status = rpccli_samr_LookupRids(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupRids(b, talloc_tos(), &domain_handle, rid_array->count, rid_array->rids, &names, - &member_types); + &member_types, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } for (i=0; i < names.count; i++) { @@ -1375,7 +1583,7 @@ WERROR NetGroupGetUsers_r(struct libnetapi_ctx *ctx, done: if (is_valid_policy_hnd(&group_handle)) { - rpccli_samr_Close(pipe_cli, talloc_tos(), &group_handle); + dcerpc_samr_Close(b, talloc_tos(), &group_handle, &result); } if (ctx->disable_policy_handle_cache) { @@ -1410,6 +1618,7 @@ WERROR NetGroupSetUsers_r(struct libnetapi_ctx *ctx, struct samr_Ids group_rids, group_types; struct samr_RidAttrArray *rid_array = NULL; struct lsa_String *lsa_names = NULL; + struct dcerpc_binding_handle *b = NULL; uint32_t *add_rids = NULL; uint32_t *del_rids = NULL; @@ -1424,6 +1633,7 @@ WERROR NetGroupSetUsers_r(struct libnetapi_ctx *ctx, int i, k; NTSTATUS status = NT_STATUS_OK; + NTSTATUS result = NT_STATUS_OK; WERROR werr; ZERO_STRUCT(connect_handle); @@ -1448,6 +1658,8 @@ WERROR NetGroupSetUsers_r(struct libnetapi_ctx *ctx, goto done; } + b = pipe_cli->binding_handle; + werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -1461,38 +1673,53 @@ WERROR NetGroupSetUsers_r(struct libnetapi_ctx *ctx, init_lsa_String(&lsa_account_name, r->in.group_name); - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &lsa_account_name, &group_rids, - &group_types); + &group_types, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } - status = rpccli_samr_OpenGroup(pipe_cli, talloc_tos(), + status = dcerpc_samr_OpenGroup(b, talloc_tos(), &domain_handle, SAMR_GROUP_ACCESS_GET_MEMBERS | SAMR_GROUP_ACCESS_ADD_MEMBER | SAMR_GROUP_ACCESS_REMOVE_MEMBER | SAMR_GROUP_ACCESS_LOOKUP_INFO, group_rids.ids[0], - &group_handle); + &group_handle, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } - status = rpccli_samr_QueryGroupInfo(pipe_cli, talloc_tos(), + status = dcerpc_samr_QueryGroupInfo(b, talloc_tos(), &group_handle, GROUPINFOATTRIBUTES, - &group_info); + &group_info, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } switch (r->in.level) { case 0: @@ -1523,26 +1750,36 @@ WERROR NetGroupSetUsers_r(struct libnetapi_ctx *ctx, } } - status = rpccli_samr_LookupNames(pipe_cli, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, r->in.num_entries, lsa_names, &user_rids, - &name_types); + &name_types, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } member_rids = user_rids.ids; - status = rpccli_samr_QueryGroupMember(pipe_cli, talloc_tos(), + status = dcerpc_samr_QueryGroupMember(b, talloc_tos(), &group_handle, - &rid_array); + &rid_array, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } /* add list */ @@ -1587,33 +1824,43 @@ WERROR NetGroupSetUsers_r(struct libnetapi_ctx *ctx, /* add list */ for (i=0; i < num_add_rids; i++) { - status = rpccli_samr_AddGroupMember(pipe_cli, talloc_tos(), + status = dcerpc_samr_AddGroupMember(b, talloc_tos(), &group_handle, add_rids[i], - 7 /* ? */); + 7 /* ? */, + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } } /* del list */ for (i=0; i < num_del_rids; i++) { - status = rpccli_samr_DeleteGroupMember(pipe_cli, talloc_tos(), + status = dcerpc_samr_DeleteGroupMember(b, talloc_tos(), &group_handle, - del_rids[i]); + del_rids[i], + &result); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } + if (!NT_STATUS_IS_OK(result)) { + werr = ntstatus_to_werror(result); + goto done; + } } werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { - rpccli_samr_Close(pipe_cli, talloc_tos(), &group_handle); + dcerpc_samr_Close(b, talloc_tos(), &group_handle, &result); } if (ctx->disable_policy_handle_cache) { |