s3-talloc Change TALLOC_ZERO_P() to talloc_zero()
[nivanova/samba-autobuild/.git] / source3 / lib / netapi / localgroup.c
index 811e7e8ab6ea99875b6e23a2b1055bba414a135a..54ec14eb84dec970152180c342557b1ed811140c 100644 (file)
 #include "lib/netapi/netapi.h"
 #include "lib/netapi/netapi_private.h"
 #include "lib/netapi/libnetapi.h"
+#include "rpc_client/rpc_client.h"
+#include "../librpc/gen_ndr/ndr_samr_c.h"
+#include "../librpc/gen_ndr/ndr_lsa_c.h"
+#include "rpc_client/cli_lsarpc.h"
+#include "rpc_client/init_lsa.h"
+#include "../libcli/security/security.h"
 
 static NTSTATUS libnetapi_samr_lookup_and_open_alias(TALLOC_CTX *mem_ctx,
                                                     struct rpc_pipe_client *pipe_cli,
@@ -31,22 +37,27 @@ static NTSTATUS libnetapi_samr_lookup_and_open_alias(TALLOC_CTX *mem_ctx,
                                                     uint32_t access_rights,
                                                     struct policy_handle *alias_handle)
 {
-       NTSTATUS status;
+       NTSTATUS status, result;
 
        struct lsa_String lsa_account_name;
        struct samr_Ids user_rids, name_types;
+       struct dcerpc_binding_handle *b = pipe_cli->binding_handle;
 
        init_lsa_String(&lsa_account_name, group_name);
 
-       status = rpccli_samr_LookupNames(pipe_cli, mem_ctx,
+       status = dcerpc_samr_LookupNames(b, mem_ctx,
                                         domain_handle,
                                         1,
                                         &lsa_account_name,
                                         &user_rids,
-                                        &name_types);
+                                        &name_types,
+                                        &result);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               return result;
+       }
 
        switch (name_types.ids[0]) {
                case SID_NAME_ALIAS:
@@ -56,11 +67,17 @@ static NTSTATUS libnetapi_samr_lookup_and_open_alias(TALLOC_CTX *mem_ctx,
                        return NT_STATUS_INVALID_SID;
        }
 
-       return rpccli_samr_OpenAlias(pipe_cli, mem_ctx,
-                                    domain_handle,
-                                    access_rights,
-                                    user_rids.ids[0],
-                                    alias_handle);
+       status = dcerpc_samr_OpenAlias(b, mem_ctx,
+                                      domain_handle,
+                                      access_rights,
+                                      user_rids.ids[0],
+                                      alias_handle,
+                                      &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       return result;
 }
 
 /****************************************************************
@@ -74,34 +91,45 @@ static NTSTATUS libnetapi_samr_open_alias_queryinfo(TALLOC_CTX *mem_ctx,
                                                    enum samr_AliasInfoEnum level,
                                                    union samr_AliasInfo **alias_info)
 {
-       NTSTATUS status;
+       NTSTATUS status, result;
        struct policy_handle alias_handle;
        union samr_AliasInfo *_alias_info = NULL;
+       struct dcerpc_binding_handle *b = pipe_cli->binding_handle;
 
        ZERO_STRUCT(alias_handle);
 
-       status = rpccli_samr_OpenAlias(pipe_cli, mem_ctx,
+       status = dcerpc_samr_OpenAlias(b, mem_ctx,
                                       handle,
                                       access_rights,
                                       rid,
-                                      &alias_handle);
+                                      &alias_handle,
+                                      &result);
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               status = result;
+               goto done;
+       }
 
-       status = rpccli_samr_QueryAliasInfo(pipe_cli, mem_ctx,
+       status = dcerpc_samr_QueryAliasInfo(b, mem_ctx,
                                            &alias_handle,
                                            level,
-                                           &_alias_info);
+                                           &_alias_info,
+                                           &result);
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               status = result;
+               goto done;
+       }
 
        *alias_info = _alias_info;
 
  done:
        if (is_valid_policy_hnd(&alias_handle)) {
-               rpccli_samr_Close(pipe_cli, mem_ctx, &alias_handle);
+               dcerpc_samr_Close(b, mem_ctx, &alias_handle, &result);
        }
 
        return status;
@@ -113,14 +141,14 @@ static NTSTATUS libnetapi_samr_open_alias_queryinfo(TALLOC_CTX *mem_ctx,
 WERROR NetLocalGroupAdd_r(struct libnetapi_ctx *ctx,
                          struct NetLocalGroupAdd *r)
 {
-       struct cli_state *cli = NULL;
        struct rpc_pipe_client *pipe_cli = NULL;
-       NTSTATUS status;
+       NTSTATUS status, result;
        WERROR werr;
        struct lsa_String lsa_account_name;
        struct policy_handle connect_handle, domain_handle, builtin_handle, alias_handle;
        struct dom_sid2 *domain_sid = NULL;
        uint32_t rid;
+       struct dcerpc_binding_handle *b = NULL;
 
        struct LOCALGROUP_INFO_0 *info0 = NULL;
        struct LOCALGROUP_INFO_1 *info1 = NULL;
@@ -150,19 +178,17 @@ WERROR NetLocalGroupAdd_r(struct libnetapi_ctx *ctx,
        ZERO_STRUCT(domain_handle);
        ZERO_STRUCT(alias_handle);
 
-       werr = libnetapi_open_ipc_connection(ctx, r->in.server_name, &cli);
-       if (!W_ERROR_IS_OK(werr)) {
-               goto done;
-       }
-
-       werr = libnetapi_open_pipe(ctx, cli, &ndr_table_samr.syntax_id,
+       werr = libnetapi_open_pipe(ctx, r->in.server_name,
+                                  &ndr_table_samr.syntax_id,
                                   &pipe_cli);
        if (!W_ERROR_IS_OK(werr)) {
                goto done;
        }
 
+       b = pipe_cli->binding_handle;
+
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -187,7 +213,7 @@ WERROR NetLocalGroupAdd_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_CREATE_ALIAS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
@@ -199,17 +225,23 @@ WERROR NetLocalGroupAdd_r(struct libnetapi_ctx *ctx,
 
        init_lsa_String(&lsa_account_name, alias_name);
 
-       status = rpccli_samr_CreateDomAlias(pipe_cli, ctx,
+       status = dcerpc_samr_CreateDomAlias(b, talloc_tos(),
                                            &domain_handle,
                                            &lsa_account_name,
                                            SEC_STD_DELETE |
                                            SAMR_ALIAS_ACCESS_SET_INFO,
                                            &alias_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;
+       }
+
 
        if (r->in.level == 1 && info1->lgrpi1_comment) {
 
@@ -217,25 +249,26 @@ WERROR NetLocalGroupAdd_r(struct libnetapi_ctx *ctx,
 
                init_lsa_String(&alias_info.description, info1->lgrpi1_comment);
 
-               status = rpccli_samr_SetAliasInfo(pipe_cli, ctx,
+               status = dcerpc_samr_SetAliasInfo(b, talloc_tos(),
                                                  &alias_handle,
                                                  ALIASINFODESCRIPTION,
-                                                 &alias_info);
+                                                 &alias_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;
+               }
        }
 
        werr = WERR_OK;
 
  done:
-       if (!cli) {
-               return werr;
-       }
-
        if (is_valid_policy_hnd(&alias_handle)) {
-               rpccli_samr_Close(pipe_cli, ctx, &alias_handle);
+               dcerpc_samr_Close(b, talloc_tos(), &alias_handle, &result);
        }
 
        if (ctx->disable_policy_handle_cache) {
@@ -263,12 +296,12 @@ WERROR NetLocalGroupAdd_l(struct libnetapi_ctx *ctx,
 WERROR NetLocalGroupDel_r(struct libnetapi_ctx *ctx,
                          struct NetLocalGroupDel *r)
 {
-       struct cli_state *cli = NULL;
        struct rpc_pipe_client *pipe_cli = NULL;
-       NTSTATUS status;
+       NTSTATUS status, result;
        WERROR werr;
        struct policy_handle connect_handle, domain_handle, builtin_handle, alias_handle;
        struct dom_sid2 *domain_sid = NULL;
+       struct dcerpc_binding_handle *b = NULL;
 
        if (!r->in.group_name) {
                return WERR_INVALID_PARAM;
@@ -279,19 +312,17 @@ WERROR NetLocalGroupDel_r(struct libnetapi_ctx *ctx,
        ZERO_STRUCT(domain_handle);
        ZERO_STRUCT(alias_handle);
 
-       werr = libnetapi_open_ipc_connection(ctx, r->in.server_name, &cli);
-       if (!W_ERROR_IS_OK(werr)) {
-               goto done;
-       }
-
-       werr = libnetapi_open_pipe(ctx, cli, &ndr_table_samr.syntax_id,
+       werr = libnetapi_open_pipe(ctx, r->in.server_name,
+                                  &ndr_table_samr.syntax_id,
                                   &pipe_cli);
        if (!W_ERROR_IS_OK(werr)) {
                goto done;
        }
 
+       b = pipe_cli->binding_handle;
+
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -316,7 +347,7 @@ WERROR NetLocalGroupDel_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_CREATE_ALIAS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
@@ -343,24 +374,25 @@ WERROR NetLocalGroupDel_r(struct libnetapi_ctx *ctx,
 
 
  delete_alias:
-       status = rpccli_samr_DeleteDomAlias(pipe_cli, ctx,
-                                           &alias_handle);
+       status = dcerpc_samr_DeleteDomAlias(b, talloc_tos(),
+                                           &alias_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(alias_handle);
 
        werr = WERR_OK;
 
  done:
-       if (!cli) {
-               return werr;
-       }
-
        if (is_valid_policy_hnd(&alias_handle)) {
-               rpccli_samr_Close(pipe_cli, ctx, &alias_handle);
+               dcerpc_samr_Close(b, talloc_tos(), &alias_handle, &result);
        }
 
        if (ctx->disable_policy_handle_cache) {
@@ -433,14 +465,14 @@ static WERROR map_alias_info_to_buffer(TALLOC_CTX *mem_ctx,
 WERROR NetLocalGroupGetInfo_r(struct libnetapi_ctx *ctx,
                              struct NetLocalGroupGetInfo *r)
 {
-       struct cli_state *cli = NULL;
        struct rpc_pipe_client *pipe_cli = NULL;
-       NTSTATUS status;
+       NTSTATUS status, result;
        WERROR werr;
        struct policy_handle connect_handle, domain_handle, builtin_handle, alias_handle;
        struct dom_sid2 *domain_sid = NULL;
        union samr_AliasInfo *alias_info = NULL;
        uint32_t entries_read = 0;
+       struct dcerpc_binding_handle *b = NULL;
 
        if (!r->in.group_name) {
                return WERR_INVALID_PARAM;
@@ -460,19 +492,17 @@ WERROR NetLocalGroupGetInfo_r(struct libnetapi_ctx *ctx,
        ZERO_STRUCT(domain_handle);
        ZERO_STRUCT(alias_handle);
 
-       werr = libnetapi_open_ipc_connection(ctx, r->in.server_name, &cli);
-       if (!W_ERROR_IS_OK(werr)) {
-               goto done;
-       }
-
-       werr = libnetapi_open_pipe(ctx, cli, &ndr_table_samr.syntax_id,
+       werr = libnetapi_open_pipe(ctx, r->in.server_name,
+                                  &ndr_table_samr.syntax_id,
                                   &pipe_cli);
        if (!W_ERROR_IS_OK(werr)) {
                goto done;
        }
 
+       b = pipe_cli->binding_handle;
+
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -497,7 +527,7 @@ WERROR NetLocalGroupGetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_CREATE_ALIAS |
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
@@ -523,14 +553,19 @@ WERROR NetLocalGroupGetInfo_r(struct libnetapi_ctx *ctx,
        }
 
  query_alias:
-       status = rpccli_samr_QueryAliasInfo(pipe_cli, ctx,
+       status = dcerpc_samr_QueryAliasInfo(b, talloc_tos(),
                                            &alias_handle,
                                            ALIASINFOALL,
-                                           &alias_info);
+                                           &alias_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;
+       }
 
        werr = map_alias_info_to_buffer(ctx,
                                        r->in.group_name,
@@ -539,12 +574,8 @@ WERROR NetLocalGroupGetInfo_r(struct libnetapi_ctx *ctx,
                                        r->out.buffer);
 
  done:
-       if (!cli) {
-               return werr;
-       }
-
        if (is_valid_policy_hnd(&alias_handle)) {
-               rpccli_samr_Close(pipe_cli, ctx, &alias_handle);
+               dcerpc_samr_Close(b, talloc_tos(), &alias_handle, &result);
        }
 
        if (ctx->disable_policy_handle_cache) {
@@ -579,7 +610,7 @@ static WERROR map_buffer_to_alias_info(TALLOC_CTX *mem_ctx,
        struct LOCALGROUP_INFO_1002 *info1002;
        union samr_AliasInfo *info = NULL;
 
-       info = TALLOC_ZERO_P(mem_ctx, union samr_AliasInfo);
+       info = talloc_zero(mem_ctx, union samr_AliasInfo);
        W_ERROR_HAVE_NO_MEMORY(info);
 
        switch (level) {
@@ -612,15 +643,15 @@ static WERROR map_buffer_to_alias_info(TALLOC_CTX *mem_ctx,
 WERROR NetLocalGroupSetInfo_r(struct libnetapi_ctx *ctx,
                              struct NetLocalGroupSetInfo *r)
 {
-       struct cli_state *cli = NULL;
        struct rpc_pipe_client *pipe_cli = NULL;
-       NTSTATUS status;
+       NTSTATUS status, result;
        WERROR werr;
        struct lsa_String lsa_account_name;
        struct policy_handle connect_handle, domain_handle, builtin_handle, alias_handle;
        struct dom_sid2 *domain_sid = NULL;
        enum samr_AliasInfoEnum alias_level = 0;
        union samr_AliasInfo *alias_info = NULL;
+       struct dcerpc_binding_handle *b = NULL;
 
        if (!r->in.group_name) {
                return WERR_INVALID_PARAM;
@@ -640,19 +671,17 @@ WERROR NetLocalGroupSetInfo_r(struct libnetapi_ctx *ctx,
        ZERO_STRUCT(domain_handle);
        ZERO_STRUCT(alias_handle);
 
-       werr = libnetapi_open_ipc_connection(ctx, r->in.server_name, &cli);
-       if (!W_ERROR_IS_OK(werr)) {
-               goto done;
-       }
-
-       werr = libnetapi_open_pipe(ctx, cli, &ndr_table_samr.syntax_id,
+       werr = libnetapi_open_pipe(ctx, r->in.server_name,
+                                  &ndr_table_samr.syntax_id,
                                   &pipe_cli);
        if (!W_ERROR_IS_OK(werr)) {
                goto done;
        }
 
+       b = pipe_cli->binding_handle;
+
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -679,7 +708,7 @@ WERROR NetLocalGroupSetInfo_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -710,24 +739,25 @@ WERROR NetLocalGroupSetInfo_r(struct libnetapi_ctx *ctx,
                goto done;
        }
 
-       status = rpccli_samr_SetAliasInfo(pipe_cli, ctx,
+       status = dcerpc_samr_SetAliasInfo(b, talloc_tos(),
                                          &alias_handle,
                                          alias_level,
-                                         alias_info);
+                                         alias_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;
+       }
 
        werr = WERR_OK;
 
  done:
-       if (!cli) {
-               return werr;
-       }
-
        if (is_valid_policy_hnd(&alias_handle)) {
-               rpccli_samr_Close(pipe_cli, ctx, &alias_handle);
+               dcerpc_samr_Close(b, talloc_tos(), &alias_handle, &result);
        }
 
        if (ctx->disable_policy_handle_cache) {
@@ -754,9 +784,8 @@ WERROR NetLocalGroupSetInfo_l(struct libnetapi_ctx *ctx,
 WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
                           struct NetLocalGroupEnum *r)
 {
-       struct cli_state *cli = NULL;
        struct rpc_pipe_client *pipe_cli = NULL;
-       NTSTATUS status;
+       NTSTATUS status, result;
        WERROR werr;
        struct policy_handle connect_handle, domain_handle, builtin_handle, alias_handle;
        struct dom_sid2 *domain_sid = NULL;
@@ -766,6 +795,7 @@ WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
        struct samr_SamArray *domain_sam_array = NULL;
        struct samr_SamArray *builtin_sam_array = NULL;
        int i;
+       struct dcerpc_binding_handle *b = NULL;
 
        if (!r->out.buffer) {
                return WERR_INVALID_PARAM;
@@ -791,19 +821,17 @@ WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
        ZERO_STRUCT(domain_handle);
        ZERO_STRUCT(alias_handle);
 
-       werr = libnetapi_open_ipc_connection(ctx, r->in.server_name, &cli);
-       if (!W_ERROR_IS_OK(werr)) {
-               goto done;
-       }
-
-       werr = libnetapi_open_pipe(ctx, cli, &ndr_table_samr.syntax_id,
+       werr = libnetapi_open_pipe(ctx, r->in.server_name,
+                                  &ndr_table_samr.syntax_id,
                                   &pipe_cli);
        if (!W_ERROR_IS_OK(werr)) {
                goto done;
        }
 
+       b = pipe_cli->binding_handle;
+
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2 |
                                                  SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS |
@@ -815,7 +843,7 @@ WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
        }
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
-                                         SAMR_ACCESS_OPEN_DOMAIN |
+                                         SAMR_ACCESS_LOOKUP_DOMAIN |
                                          SAMR_ACCESS_ENUM_DOMAINS,
                                          SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2 |
                                          SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS |
@@ -827,42 +855,57 @@ WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
                goto done;
        }
 
-       status = rpccli_samr_QueryDomainInfo(pipe_cli, ctx,
+       status = dcerpc_samr_QueryDomainInfo(b, talloc_tos(),
                                             &builtin_handle,
                                             2,
-                                            &builtin_info);
+                                            &builtin_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 += builtin_info->info2.num_aliases;
+               *r->out.total_entries += builtin_info->general.num_aliases;
        }
 
-       status = rpccli_samr_QueryDomainInfo(pipe_cli, ctx,
+       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->info2.num_aliases;
+               *r->out.total_entries += domain_info->general.num_aliases;
        }
 
-       status = rpccli_samr_EnumDomainAliases(pipe_cli, ctx,
+       status = dcerpc_samr_EnumDomainAliases(b, talloc_tos(),
                                               &builtin_handle,
                                               r->in.resume_handle,
                                               &builtin_sam_array,
                                               r->in.prefmaxlen,
-                                              &entries_read);
+                                              &entries_read,
+                                              &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<builtin_sam_array->count; i++) {
                union samr_AliasInfo *alias_info = NULL;
@@ -889,16 +932,21 @@ WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
                                                r->out.buffer);
        }
 
-       status = rpccli_samr_EnumDomainAliases(pipe_cli, ctx,
+       status = dcerpc_samr_EnumDomainAliases(b, talloc_tos(),
                                               &domain_handle,
                                               r->in.resume_handle,
                                               &domain_sam_array,
                                               r->in.prefmaxlen,
-                                              &entries_read);
+                                              &entries_read,
+                                              &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<domain_sam_array->count; i++) {
 
@@ -926,10 +974,6 @@ WERROR NetLocalGroupEnum_r(struct libnetapi_ctx *ctx,
        }
 
  done:
-       if (!cli) {
-               return werr;
-       }
-
        if (ctx->disable_policy_handle_cache) {
                libnetapi_samr_close_domain_handle(ctx, &domain_handle);
                libnetapi_samr_close_builtin_handle(ctx, &builtin_handle);
@@ -956,8 +1000,9 @@ static NTSTATUS libnetapi_lsa_lookup_names3(TALLOC_CTX *mem_ctx,
                                            const char *name,
                                            struct dom_sid *sid)
 {
-       NTSTATUS status;
+       NTSTATUS status, result;
        struct policy_handle lsa_handle;
+       struct dcerpc_binding_handle *b = lsa_pipe->binding_handle;
 
        struct lsa_RefDomainList *domains = NULL;
        struct lsa_TransSidArray3 sids;
@@ -976,13 +1021,13 @@ static NTSTATUS libnetapi_lsa_lookup_names3(TALLOC_CTX *mem_ctx,
 
        status = rpccli_lsa_open_policy2(lsa_pipe, mem_ctx,
                                         false,
-                                        STD_RIGHT_READ_CONTROL_ACCESS |
+                                        SEC_STD_READ_CONTROL |
                                         LSA_POLICY_VIEW_LOCAL_INFORMATION |
                                         LSA_POLICY_LOOKUP_NAMES,
                                         &lsa_handle);
        NT_STATUS_NOT_OK_RETURN(status);
 
-       status = rpccli_lsa_LookupNames3(lsa_pipe, mem_ctx,
+       status = dcerpc_lsa_LookupNames3(b, mem_ctx,
                                         &lsa_handle,
                                         num_names,
                                         &names,
@@ -990,8 +1035,10 @@ static NTSTATUS libnetapi_lsa_lookup_names3(TALLOC_CTX *mem_ctx,
                                         &sids,
                                         LSA_LOOKUP_NAMES_ALL, /* sure ? */
                                         &count,
-                                        0, 0);
+                                        0, 0,
+                                        &result);
        NT_STATUS_NOT_OK_RETURN(status);
+       NT_STATUS_NOT_OK_RETURN(result);
 
        if (count != 1 || sids.count != 1) {
                return NT_STATUS_NONE_MAPPED;
@@ -1012,10 +1059,9 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
 {
        struct NetLocalGroupAddMembers *r = NULL;
 
-       struct cli_state *cli = NULL;
        struct rpc_pipe_client *pipe_cli = NULL;
        struct rpc_pipe_client *lsa_pipe = NULL;
-       NTSTATUS status;
+       NTSTATUS status, result;
        WERROR werr;
        struct lsa_String lsa_account_name;
        struct policy_handle connect_handle, domain_handle, builtin_handle, alias_handle;
@@ -1028,8 +1074,9 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
 
        struct dom_sid *add_sids = NULL;
        struct dom_sid *del_sids = NULL;
-       size_t num_add_sids = 0;
-       size_t num_del_sids = 0;
+       uint32_t num_add_sids = 0;
+       uint32_t num_del_sids = 0;
+       struct dcerpc_binding_handle *b = NULL;
 
        if ((!add && !del && !set) || (add && del && set)) {
                return WERR_INVALID_PARAM;
@@ -1086,13 +1133,9 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
                        break;
        }
 
-       werr = libnetapi_open_ipc_connection(ctx, r->in.server_name, &cli);
-       if (!W_ERROR_IS_OK(werr)) {
-               goto done;
-       }
-
        if (r->in.level == 3) {
-               werr = libnetapi_open_pipe(ctx, cli, &ndr_table_lsarpc.syntax_id,
+               werr = libnetapi_open_pipe(ctx, r->in.server_name,
+                                          &ndr_table_lsarpc.syntax_id,
                                           &lsa_pipe);
                if (!W_ERROR_IS_OK(werr)) {
                        goto done;
@@ -1110,14 +1153,17 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
                TALLOC_FREE(lsa_pipe);
        }
 
-       werr = libnetapi_open_pipe(ctx, cli, &ndr_table_samr.syntax_id,
+       werr = libnetapi_open_pipe(ctx, r->in.server_name,
+                                  &ndr_table_samr.syntax_id,
                                   &pipe_cli);
        if (!W_ERROR_IS_OK(werr)) {
                goto done;
        }
 
+       b = pipe_cli->binding_handle;
+
        werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli,
-                                                 SAMR_ACCESS_OPEN_DOMAIN |
+                                                 SAMR_ACCESS_LOOKUP_DOMAIN |
                                                  SAMR_ACCESS_ENUM_DOMAINS,
                                                  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                                  &connect_handle,
@@ -1147,7 +1193,7 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
 
        werr = libnetapi_samr_open_domain(ctx, pipe_cli,
                                          SAMR_ACCESS_ENUM_DOMAINS |
-                                         SAMR_ACCESS_OPEN_DOMAIN,
+                                         SAMR_ACCESS_LOOKUP_DOMAIN,
                                          SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                          &connect_handle,
                                          &domain_handle,
@@ -1203,20 +1249,25 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
 
                struct lsa_SidArray current_sids;
 
-               status = rpccli_samr_GetMembersInAlias(pipe_cli, ctx,
+               status = dcerpc_samr_GetMembersInAlias(b, talloc_tos(),
                                                       &alias_handle,
-                                                      &current_sids);
+                                                      &current_sids,
+                                                      &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 */
 
                for (i=0; i < r->in.total_entries; i++) {
                        bool already_member = false;
                        for (k=0; k < current_sids.num_sids; k++) {
-                               if (sid_equal(&member_sids[i],
+                               if (dom_sid_equal(&member_sids[i],
                                              current_sids.sids[k].sid)) {
                                        already_member = true;
                                        break;
@@ -1238,7 +1289,7 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
                for (k=0; k < current_sids.num_sids; k++) {
                        bool keep_member = false;
                        for (i=0; i < r->in.total_entries; i++) {
-                               if (sid_equal(&member_sids[i],
+                               if (dom_sid_equal(&member_sids[i],
                                              current_sids.sids[k].sid)) {
                                        keep_member = true;
                                        break;
@@ -1259,36 +1310,42 @@ static WERROR NetLocalGroupModifyMembers_r(struct libnetapi_ctx *ctx,
        /* add list */
 
        for (i=0; i < num_add_sids; i++) {
-               status = rpccli_samr_AddAliasMember(pipe_cli, ctx,
+               status = dcerpc_samr_AddAliasMember(b, talloc_tos(),
                                                    &alias_handle,
-                                                   &add_sids[i]);
+                                                   &add_sids[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;
+               }
        }
 
        /* del list */
 
        for (i=0; i < num_del_sids; i++) {
-               status = rpccli_samr_DeleteAliasMember(pipe_cli, ctx,
+               status = dcerpc_samr_DeleteAliasMember(b, talloc_tos(),
                                                       &alias_handle,
-                                                      &del_sids[i]);
+                                                      &del_sids[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 (!cli) {
-               return werr;
-       }
-
-       if (is_valid_policy_hnd(&alias_handle)) {
-               rpccli_samr_Close(pipe_cli, ctx, &alias_handle);
+       if (b && is_valid_policy_hnd(&alias_handle)) {
+               dcerpc_samr_Close(b, talloc_tos(), &alias_handle, &result);
        }
 
        if (ctx->disable_policy_handle_cache) {
@@ -1371,4 +1428,3 @@ WERROR NetLocalGroupSetMembers_l(struct libnetapi_ctx *ctx,
 {
        LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetLocalGroupSetMembers);
 }
-