Merge commit 'release-4-0-0alpha15' into master4-tmp
[amitay/samba.git] / source3 / smbd / lanman.c
index 3045d392cea08e926f48de7e539ff6276849425f..dac91b2a40b988c1628796c6b27fb84c487671f3 100644 (file)
    */
 
 #include "includes.h"
+#include "smbd/smbd.h"
 #include "smbd/globals.h"
-#include "../librpc/gen_ndr/cli_samr.h"
+#include "rpc_client/rpc_client.h"
+#include "../librpc/gen_ndr/ndr_samr_c.h"
 #include "../librpc/gen_ndr/ndr_spoolss_c.h"
 #include "rpc_client/cli_spoolss.h"
 #include "rpc_client/init_spoolss.h"
 #include "../librpc/gen_ndr/ndr_srvsvc_c.h"
-#include "../librpc/gen_ndr/srv_samr.h"
-#include "../librpc/gen_ndr/srv_srvsvc.h"
 #include "../librpc/gen_ndr/rap.h"
 #include "../lib/util/binsearch.h"
 #include "../libcli/auth/libcli_auth.h"
 #include "rpc_client/init_lsa.h"
-#include "rpc_server/rpc_ncacn_np.h"
 #include "../libcli/security/security.h"
+#include "printing.h"
+#include "passdb/machine_sid.h"
+#include "auth.h"
+#include "rpc_server/rpc_ncacn_np.h"
 
 #ifdef CHECK_TYPES
 #undef CHECK_TYPES
@@ -114,11 +117,11 @@ static int CopyExpanded(connection_struct *conn,
        }
        buf = talloc_sub_advanced(ctx,
                                lp_servicename(SNUM(conn)),
-                               conn->server_info->unix_name,
+                               conn->session_info->unix_name,
                                conn->connectpath,
-                               conn->server_info->utok.gid,
-                               conn->server_info->sanitized_username,
-                               conn->server_info->info3->base.domain.string,
+                               conn->session_info->utok.gid,
+                               conn->session_info->sanitized_username,
+                               conn->session_info->info3->base.domain.string,
                                buf);
        if (!buf) {
                *p_space_remaining = 0;
@@ -165,11 +168,11 @@ static int StrlenExpanded(connection_struct *conn, int snum, char *s)
        }
        buf = talloc_sub_advanced(ctx,
                                lp_servicename(SNUM(conn)),
-                               conn->server_info->unix_name,
+                               conn->session_info->unix_name,
                                conn->connectpath,
-                               conn->server_info->utok.gid,
-                               conn->server_info->sanitized_username,
-                               conn->server_info->info3->base.domain.string,
+                               conn->session_info->utok.gid,
+                               conn->session_info->sanitized_username,
+                               conn->session_info->info3->base.domain.string,
                                buf);
        if (!buf) {
                return 0;
@@ -609,9 +612,9 @@ static void fill_printq_info_52(struct spoolss_DriverInfo3 *driver,
 {
        int                             i;
        fstring                         location;
-       trim_string((char *)driver->driver_path, "\\print$\\WIN40\\0\\", 0);
-       trim_string((char *)driver->data_file, "\\print$\\WIN40\\0\\", 0);
-       trim_string((char *)driver->help_file, "\\print$\\WIN40\\0\\", 0);
+       trim_string(discard_const_p(char, driver->driver_path), "\\print$\\WIN40\\0\\", 0);
+       trim_string(discard_const_p(char, driver->data_file), "\\print$\\WIN40\\0\\", 0);
+       trim_string(discard_const_p(char, driver->help_file), "\\print$\\WIN40\\0\\", 0);
 
        PACKI(desc, "W", 0x0400);                     /* don't know */
        PACKS(desc, "z", driver->driver_name);        /* long printer name */
@@ -638,7 +641,7 @@ static void fill_printq_info_52(struct spoolss_DriverInfo3 *driver,
 
        for ( i=0; i<count && driver->dependent_files && *driver->dependent_files[i]; i++)
        {
-               trim_string((char *)driver->dependent_files[i], "\\print$\\WIN40\\0\\", 0);
+               trim_string(discard_const_p(char, driver->dependent_files[i]), "\\print$\\WIN40\\0\\", 0);
                PACKS(desc,"z",driver->dependent_files[i]);         /* driver files to copy */
                DEBUG(3,("Dependent File: %s:\n", driver->dependent_files[i]));
        }
@@ -830,7 +833,7 @@ static bool api_DosPrintQGetInfo(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -1027,7 +1030,7 @@ static bool api_DosPrintQEnum(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -1144,9 +1147,7 @@ static bool api_DosPrintQEnum(struct smbd_server_connection *sconn,
                subcntarr[i] = num_jobs;
                subcnt += subcntarr[i];
 
-               if (b && is_valid_policy_hnd(&handle)) {
-                       dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
-               }
+               dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
        }
 
        if (init_package(&desc,queuecnt,subcnt)) {
@@ -1184,7 +1185,7 @@ static bool api_DosPrintQEnum(struct smbd_server_connection *sconn,
  Get info level for a server list query.
 ****************************************************************************/
 
-static bool check_server_info(int uLevel, char* id)
+static bool check_session_info(int uLevel, char* id)
 {
        switch( uLevel ) {
                case 0:
@@ -1216,7 +1217,7 @@ struct srv_info_struct {
  number of entries.
 ******************************************************************/
 
-static int get_server_info(uint32 servertype,
+static int get_session_info(uint32 servertype,
                           struct srv_info_struct **servers,
                           const char *domain)
 {
@@ -1257,7 +1258,7 @@ static int get_server_info(uint32 servertype,
                        alloced += 10;
                        *servers = SMB_REALLOC_ARRAY(*servers,struct srv_info_struct, alloced);
                        if (!*servers) {
-                               DEBUG(0,("get_server_info: failed to enlarge servers info struct!\n"));
+                               DEBUG(0,("get_session_info: failed to enlarge servers info struct!\n"));
                                TALLOC_FREE(lines);
                                return 0;
                        }
@@ -1426,7 +1427,7 @@ static int fill_srv_info(struct srv_info_struct *service,
 
 static int srv_comp(struct srv_info_struct *s1,struct srv_info_struct *s2)
 {
-       return StrCaseCmp(s1->name,s2->name);
+       return strcasecmp_m(s1->name,s2->name);
 }
 
 /****************************************************************************
@@ -1487,7 +1488,7 @@ static bool api_RNetServerEnum2(struct smbd_server_connection *sconn,
        if (!prefix_ok(str1,"WrLehD")) {
                return False;
        }
-       if (!check_server_info(uLevel,str2)) {
+       if (!check_session_info(uLevel,str2)) {
                return False;
        }
 
@@ -1507,7 +1508,7 @@ static bool api_RNetServerEnum2(struct smbd_server_connection *sconn,
        DEBUG(4, ("domain [%s]\n", domain));
 
        if (lp_browse_list()) {
-               total = get_server_info(servertype,&servers,domain);
+               total = get_session_info(servertype,&servers,domain);
        }
 
        data_len = fixed_len = string_len = 0;
@@ -1595,7 +1596,7 @@ static int srv_name_match(const char *n1, const char *n2)
         *  the server will return a list of servers that exist on
         *  the network greater than or equal to the FirstNameToReturn.
         */
-       int ret = StrCaseCmp(n1, n2);
+       int ret = strcasecmp_m(n1, n2);
 
        if (ret <= 0) {
                return 0;
@@ -1658,7 +1659,7 @@ static bool api_RNetServerEnum3(struct smbd_server_connection *sconn,
        if (strcmp(str1, "WrLehDzz") != 0) {
                return false;
        }
-       if (!check_server_info(uLevel,str2)) {
+       if (!check_session_info(uLevel,str2)) {
                return False;
        }
 
@@ -1683,7 +1684,7 @@ static bool api_RNetServerEnum3(struct smbd_server_connection *sconn,
                  domain, first_name));
 
        if (lp_browse_list()) {
-               total = get_server_info(servertype,&servers,domain);
+               total = get_session_info(servertype,&servers,domain);
        }
 
        data_len = fixed_len = string_len = 0;
@@ -1707,7 +1708,7 @@ static bool api_RNetServerEnum3(struct smbd_server_connection *sconn,
                         */
                        for (;first > 0;) {
                                int ret;
-                               ret = StrCaseCmp(first_name,
+                               ret = strcasecmp_m(first_name,
                                                 servers[first-1].name);
                                if (ret > 0) {
                                        break;
@@ -2004,7 +2005,7 @@ static bool api_RNetShareGetInfo(struct smbd_server_connection *sconn,
        int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
        int snum;
 
-       if (!str1 || !str2 || !netname || !p) {
+       if (!str1 || !str2 || !netname_in || !p) {
                return False;
        }
 
@@ -2091,7 +2092,7 @@ static bool api_RNetShareEnum(struct smbd_server_connection *sconn,
        /* Ensure all the usershares are loaded. */
        become_root();
        load_registry_shares();
-       count = load_usershare_shares();
+       count = load_usershare_shares(sconn);
        unbecome_root();
 
        data_len = fixed_len = string_len = 0;
@@ -2253,8 +2254,8 @@ static bool api_RNetShareAdd(struct smbd_server_connection *sconn,
                return false;
        }
 
-       status = rpc_pipe_open_internal(mem_ctx, &ndr_table_srvsvc.syntax_id,
-                                       conn->server_info,
+       status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc.syntax_id,
+                                       conn->session_info,
                                        &conn->sconn->client_id,
                                        conn->sconn->msg_ctx,
                                        &cli);
@@ -2341,7 +2342,8 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn,
        uint32_t resume_handle;
        struct rpc_pipe_client *samr_pipe;
        struct policy_handle samr_handle, domain_handle;
-       NTSTATUS status;
+       NTSTATUS status, result;
+       struct dcerpc_binding_handle *b;
 
        if (!str1 || !str2 || !p) {
                return False;
@@ -2363,9 +2365,9 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn,
                return False;
        }
 
-       status = rpc_pipe_open_internal(
+       status = rpc_pipe_open_interface(
                talloc_tos(), &ndr_table_samr.syntax_id,
-               conn->server_info, &conn->sconn->client_id,
+               conn->session_info, &conn->sconn->client_id,
                conn->sconn->msg_ctx, &samr_pipe);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
@@ -2373,21 +2375,36 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn,
                return false;
        }
 
-       status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
-                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
+       b = samr_pipe->binding_handle;
+
+       status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(),
+                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
+                                     &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
                          nt_errstr(status)));
                return false;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
+                         nt_errstr(result)));
+               return false;
+       }
 
-       status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
+       status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
                                        SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-                                       get_global_sam_sid(), &domain_handle);
+                                       get_global_sam_sid(), &domain_handle,
+                                       &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
                          nt_errstr(status)));
-               rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+               dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
+               return false;
+       }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
+                         nt_errstr(result)));
+               dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
                return false;
        }
 
@@ -2412,19 +2429,26 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn,
                struct samr_SamArray *sam_entries;
                uint32_t num_entries;
 
-               status = rpccli_samr_EnumDomainGroups(samr_pipe, talloc_tos(),
+               status = dcerpc_samr_EnumDomainGroups(b, talloc_tos(),
                                                      &domain_handle,
                                                      &resume_handle,
                                                      &sam_entries, 1,
-                                                     &num_entries);
+                                                     &num_entries,
+                                                     &result);
                if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(10, ("rpccli_samr_EnumDomainGroups returned "
+                       DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
                                   "%s\n", nt_errstr(status)));
                        break;
                }
+               if (!NT_STATUS_IS_OK(result)) {
+                       status = result;
+                       DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
+                                  "%s\n", nt_errstr(result)));
+                       break;
+               }
 
                if (num_entries == 0) {
-                       DEBUG(10, ("rpccli_samr_EnumDomainGroups returned "
+                       DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
                                   "no entries -- done\n"));
                        break;
                }
@@ -2459,8 +2483,8 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn,
                TALLOC_FREE(sam_entries);
        }
 
-       rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
-       rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+       dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
+       dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
 
        *rdata_len = PTR_DIFF(p,*rdata);
 
@@ -2506,7 +2530,8 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn,
        struct lsa_Strings names;
        struct samr_Ids type, rid;
        struct samr_RidWithAttributeArray *rids;
-       NTSTATUS status;
+       NTSTATUS status, result;
+       struct dcerpc_binding_handle *b;
 
        if (!str1 || !str2 || !UserName || !p) {
                return False;
@@ -2546,9 +2571,9 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn,
        p = *rdata;
        endp = *rdata + *rdata_len;
 
-       status = rpc_pipe_open_internal(
+       status = rpc_pipe_open_interface(
                talloc_tos(), &ndr_table_samr.syntax_id,
-               conn->server_info, &conn->sconn->client_id,
+               conn->session_info, &conn->sconn->client_id,
                conn->sconn->msg_ctx, &samr_pipe);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
@@ -2556,33 +2581,53 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn,
                return false;
        }
 
-       status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
-                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
+       b = samr_pipe->binding_handle;
+
+       status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(),
+                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
+                                     &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
                          nt_errstr(status)));
                return false;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
+                         nt_errstr(result)));
+               return false;
+       }
 
-       status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
+       status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
                                        SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
-                                       get_global_sam_sid(), &domain_handle);
+                                       get_global_sam_sid(), &domain_handle,
+                                       &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
                          nt_errstr(status)));
                goto close_sam;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
+                         nt_errstr(result)));
+               goto close_sam;
+       }
 
        name.string = UserName;
 
-       status = rpccli_samr_LookupNames(samr_pipe, talloc_tos(),
+       status = dcerpc_samr_LookupNames(b, talloc_tos(),
                                         &domain_handle, 1, &name,
-                                        &rid, &type);
+                                        &rid, &type,
+                                        &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
                          nt_errstr(status)));
                goto close_domain;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
+                         nt_errstr(result)));
+               goto close_domain;
+       }
 
        if (type.ids[0] != SID_NAME_USER) {
                DEBUG(10, ("%s is a %s, not a user\n", UserName,
@@ -2590,31 +2635,44 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn,
                goto close_domain;
        }
 
-       status = rpccli_samr_OpenUser(samr_pipe, talloc_tos(),
+       status = dcerpc_samr_OpenUser(b, talloc_tos(),
                                      &domain_handle,
                                      SAMR_USER_ACCESS_GET_GROUPS,
-                                     rid.ids[0], &user_handle);
+                                     rid.ids[0], &user_handle,
+                                     &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
                          nt_errstr(status)));
                goto close_domain;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
+                         nt_errstr(result)));
+               goto close_domain;
+       }
 
-       status = rpccli_samr_GetGroupsForUser(samr_pipe, talloc_tos(),
-                                             &user_handle, &rids);
+       status = dcerpc_samr_GetGroupsForUser(b, talloc_tos(),
+                                             &user_handle, &rids,
+                                             &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
                          nt_errstr(status)));
                goto close_user;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
+                         nt_errstr(result)));
+               goto close_user;
+       }
 
        for (i=0; i<rids->count; i++) {
 
-               status = rpccli_samr_LookupRids(samr_pipe, talloc_tos(),
+               status = dcerpc_samr_LookupRids(b, talloc_tos(),
                                                &domain_handle,
                                                1, &rids->rids[i].rid,
-                                               &names, &type);
-               if (NT_STATUS_IS_OK(status) && (names.count == 1)) {
+                                               &names, &type,
+                                               &result);
+               if (NT_STATUS_IS_OK(status) && NT_STATUS_IS_OK(result) && (names.count == 1)) {
                        strlcpy(p, names.names[0].string, PTR_DIFF(endp,p));
                        p += 21;
                        count++;
@@ -2629,11 +2687,11 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn,
        ret = True;
 
  close_user:
-       rpccli_samr_Close(samr_pipe, talloc_tos(), &user_handle);
+       dcerpc_samr_Close(b, talloc_tos(), &user_handle, &result);
  close_domain:
-       rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
+       dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
  close_sam:
-       rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+       dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
 
        return ret;
 }
@@ -2658,13 +2716,15 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn,
 
        struct rpc_pipe_client *samr_pipe;
        struct policy_handle samr_handle, domain_handle;
-       NTSTATUS status;
+       NTSTATUS status, result;
 
        char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
        char *str2 = skip_string(param,tpscnt,str1);
        char *p = skip_string(param,tpscnt,str2);
        char *endp = NULL;
 
+       struct dcerpc_binding_handle *b;
+
        if (!str1 || !str2 || !p) {
                return False;
        }
@@ -2703,9 +2763,9 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn,
        p = *rdata;
        endp = *rdata + *rdata_len;
 
-       status = rpc_pipe_open_internal(
+       status = rpc_pipe_open_interface(
                talloc_tos(), &ndr_table_samr.syntax_id,
-               conn->server_info, &conn->sconn->client_id,
+               conn->session_info, &conn->sconn->client_id,
                conn->sconn->msg_ctx, &samr_pipe);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
@@ -2713,21 +2773,36 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn,
                return false;
        }
 
-       status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
-                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
+       b = samr_pipe->binding_handle;
+
+       status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(),
+                                     SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
+                                     &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
                          nt_errstr(status)));
                return false;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
+                         nt_errstr(result)));
+               return false;
+       }
 
-       status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
+       status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
                                        SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
-                                       get_global_sam_sid(), &domain_handle);
+                                       get_global_sam_sid(), &domain_handle,
+                                       &result);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
                          nt_errstr(status)));
-               rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+               dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
+               return false;
+       }
+       if (!NT_STATUS_IS_OK(result)) {
+               DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
+                         nt_errstr(result)));
+               dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
                return false;
        }
 
@@ -2739,20 +2814,26 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn,
                struct samr_SamArray *sam_entries;
                uint32_t num_entries;
 
-               status = rpccli_samr_EnumDomainUsers(samr_pipe, talloc_tos(),
+               status = dcerpc_samr_EnumDomainUsers(b, talloc_tos(),
                                                     &domain_handle,
                                                     &resume_handle,
                                                     0, &sam_entries, 1,
-                                                    &num_entries);
+                                                    &num_entries,
+                                                    &result);
 
                if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(10, ("rpccli_samr_EnumDomainUsers returned "
+                       DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
                                   "%s\n", nt_errstr(status)));
                        break;
                }
+               if (!NT_STATUS_IS_OK(result)) {
+                       DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
+                                  "%s\n", nt_errstr(result)));
+                       break;
+               }
 
                if (num_entries == 0) {
-                       DEBUG(10, ("rpccli_samr_EnumDomainUsers returned "
+                       DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
                                   "no entries -- done\n"));
                        break;
                }
@@ -2785,8 +2866,8 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn,
                TALLOC_FREE(sam_entries);
        }
 
-       rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
-       rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+       dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
+       dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
 
        *rdata_len = PTR_DIFF(p,*rdata);
 
@@ -2874,7 +2955,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn,
        fstring user;
        fstring pass1,pass2;
        TALLOC_CTX *mem_ctx = talloc_tos();
-       NTSTATUS status;
+       NTSTATUS status, result;
        struct rpc_pipe_client *cli = NULL;
        struct policy_handle connect_handle, domain_handle, user_handle;
        struct lsa_String domain_name;
@@ -2888,6 +2969,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn,
        uint32_t rid;
        int encrypted;
        int min_pwd_length;
+       struct dcerpc_binding_handle *b = NULL;
 
        /* Skip 2 strings. */
        p = skip_string(param,tpscnt,np);
@@ -2947,8 +3029,8 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn,
        ZERO_STRUCT(domain_handle);
        ZERO_STRUCT(user_handle);
 
-       status = rpc_pipe_open_internal(mem_ctx, &ndr_table_samr.syntax_id,
-                                       conn->server_info,
+       status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
+                                       conn->session_info,
                                        &conn->sconn->client_id,
                                        conn->sconn->msg_ctx,
                                        &cli);
@@ -2959,50 +3041,72 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn,
                goto out;
        }
 
-       status = rpccli_samr_Connect2(cli, mem_ctx,
-                                     global_myname(),
+       b = cli->binding_handle;
+
+       status = dcerpc_samr_Connect2(b, mem_ctx,
+                                     lp_netbios_name(),
                                      SAMR_ACCESS_CONNECT_TO_SERVER |
                                      SAMR_ACCESS_ENUM_DOMAINS |
                                      SAMR_ACCESS_LOOKUP_DOMAIN,
-                                     &connect_handle);
+                                     &connect_handle,
+                                     &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        init_lsa_String(&domain_name, get_global_sam_name());
 
-       status = rpccli_samr_LookupDomain(cli, mem_ctx,
+       status = dcerpc_samr_LookupDomain(b, mem_ctx,
                                          &connect_handle,
                                          &domain_name,
-                                         &domain_sid);
+                                         &domain_sid,
+                                         &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
-       status = rpccli_samr_OpenDomain(cli, mem_ctx,
+       status = dcerpc_samr_OpenDomain(b, mem_ctx,
                                        &connect_handle,
                                        SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                        domain_sid,
-                                       &domain_handle);
+                                       &domain_handle,
+                                       &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        init_lsa_String(&names, user);
 
-       status = rpccli_samr_LookupNames(cli, mem_ctx,
+       status = dcerpc_samr_LookupNames(b, mem_ctx,
                                         &domain_handle,
                                         1,
                                         &names,
                                         &rids,
-                                        &types);
+                                        &types,
+                                        &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        if (rids.count != 1) {
                errcode = W_ERROR_V(WERR_NO_SUCH_USER);
@@ -3019,15 +3123,20 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn,
 
        rid = rids.ids[0];
 
-       status = rpccli_samr_OpenUser(cli, mem_ctx,
+       status = dcerpc_samr_OpenUser(b, mem_ctx,
                                      &domain_handle,
                                      SAMR_USER_ACCESS_CHANGE_PASSWORD,
                                      rid,
-                                     &user_handle);
+                                     &user_handle,
+                                     &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        if (encrypted == 0) {
                E_deshash(pass1, old_lm_hash.hash);
@@ -3039,7 +3148,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn,
                memcpy(new_lm_hash.hash, pass1, MIN(strlen(pass2), 16));
        }
 
-       status = rpccli_samr_ChangePasswordUser(cli, mem_ctx,
+       status = dcerpc_samr_ChangePasswordUser(b, mem_ctx,
                                                &user_handle,
                                                true, /* lm_present */
                                                &old_lm_hash,
@@ -3050,23 +3159,28 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn,
                                                false, /* cross1_present */
                                                NULL, /* nt_cross */
                                                false, /* cross2_present */
-                                               NULL); /* lm_cross */
+                                               NULL, /* lm_cross */
+                                               &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        errcode = NERR_Success;
  out:
 
-       if (cli && is_valid_policy_hnd(&user_handle)) {
-               rpccli_samr_Close(cli, mem_ctx, &user_handle);
+       if (b && is_valid_policy_hnd(&user_handle)) {
+               dcerpc_samr_Close(b, mem_ctx, &user_handle, &result);
        }
-       if (cli && is_valid_policy_hnd(&domain_handle)) {
-               rpccli_samr_Close(cli, mem_ctx, &domain_handle);
+       if (b && is_valid_policy_hnd(&domain_handle)) {
+               dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result);
        }
-       if (cli && is_valid_policy_hnd(&connect_handle)) {
-               rpccli_samr_Close(cli, mem_ctx, &connect_handle);
+       if (b && is_valid_policy_hnd(&connect_handle)) {
+               dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result);
        }
 
        memset((char *)pass1,'\0',sizeof(fstring));
@@ -3093,13 +3207,14 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn,
        char *p = get_safe_str_ptr(param,tpscnt,param,2);
 
        TALLOC_CTX *mem_ctx = talloc_tos();
-       NTSTATUS status;
+       NTSTATUS status, result;
        struct rpc_pipe_client *cli = NULL;
        struct lsa_AsciiString server, account;
        struct samr_CryptPassword password;
        struct samr_Password hash;
        int errcode = NERR_badpass;
        int bufsize;
+       struct dcerpc_binding_handle *b;
 
        *rparam_len = 4;
        *rparam = smb_realloc_limit(*rparam,*rparam_len);
@@ -3165,8 +3280,8 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn,
        memcpy(password.data, data, 516);
        memcpy(hash.hash, data+516, 16);
 
-       status = rpc_pipe_open_internal(mem_ctx, &ndr_table_samr.syntax_id,
-                                       conn->server_info,
+       status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
+                                       conn->session_info,
                                        &conn->sconn->client_id,
                                        conn->sconn->msg_ctx,
                                        &cli);
@@ -3177,18 +3292,25 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn,
                goto out;
        }
 
-       init_lsa_AsciiString(&server, global_myname());
+       b = cli->binding_handle;
+
+       init_lsa_AsciiString(&server, lp_netbios_name());
        init_lsa_AsciiString(&account, user);
 
-       status = rpccli_samr_OemChangePasswordUser2(cli, mem_ctx,
+       status = dcerpc_samr_OemChangePasswordUser2(b, mem_ctx,
                                                    &server,
                                                    &account,
                                                    &password,
-                                                   &hash);
+                                                   &hash,
+                                                   &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        errcode = NERR_Success;
  out:
@@ -3256,7 +3378,7 @@ static bool api_RDosPrintJobDel(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -3384,7 +3506,7 @@ static bool api_WPrintQueueCtrl(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -3566,7 +3688,7 @@ static bool api_PrintJobInfo(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -3742,8 +3864,8 @@ static bool api_RNetServerGetInfo(struct smbd_server_connection *sconn,
        p = *rdata;
        p2 = p + struct_len;
 
-       status = rpc_pipe_open_internal(mem_ctx, &ndr_table_srvsvc.syntax_id,
-                                       conn->server_info,
+       status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc.syntax_id,
+                                       conn->session_info,
                                        &conn->sconn->client_id,
                                        conn->sconn->msg_ctx,
                                        &cli);
@@ -3889,7 +4011,7 @@ static bool api_NetWkstaGetInfo(struct smbd_server_connection *sconn,
        p += 4;
 
        SIVAL(p,0,PTR_DIFF(p2,*rdata));
-       strlcpy(p2,conn->server_info->sanitized_username,PTR_DIFF(endp,p2));
+       strlcpy(p2,conn->session_info->sanitized_username,PTR_DIFF(endp,p2));
        p2 = skip_string(*rdata,*rdata_len,p2);
        if (!p2) {
                return False;
@@ -3905,8 +4027,8 @@ static bool api_NetWkstaGetInfo(struct smbd_server_connection *sconn,
        }
        p += 4;
 
-       SCVAL(p,0,lp_major_announce_version()); /* system version - e.g 4 in 4.1 */
-       SCVAL(p,1,lp_minor_announce_version()); /* system version - e.g .1 in 4.1 */
+       SCVAL(p,0,SAMBA_MAJOR_NBT_ANNOUNCE_VERSION); /* system version - e.g 4 in 4.1 */
+       SCVAL(p,1,SAMBA_MINOR_NBT_ANNOUNCE_VERSION); /* system version - e.g .1 in 4.1 */
        p += 2;
 
        SIVAL(p,0,PTR_DIFF(p2,*rdata));
@@ -4110,7 +4232,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
        const char *level_string;
 
        TALLOC_CTX *mem_ctx = talloc_tos();
-       NTSTATUS status;
+       NTSTATUS status, result;
        struct rpc_pipe_client *cli = NULL;
        struct policy_handle connect_handle, domain_handle, user_handle;
        struct lsa_String domain_name;
@@ -4121,6 +4243,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
        int errcode = W_ERROR_V(WERR_USER_NOT_FOUND);
        uint32_t rid;
        union samr_UserInfo *info;
+       struct dcerpc_binding_handle *b = NULL;
 
        if (!str1 || !str2 || !UserName || !p) {
                return False;
@@ -4168,8 +4291,8 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
        ZERO_STRUCT(domain_handle);
        ZERO_STRUCT(user_handle);
 
-       status = rpc_pipe_open_internal(mem_ctx, &ndr_table_samr.syntax_id,
-                                       conn->server_info,
+       status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
+                                       conn->session_info,
                                        &conn->sconn->client_id,
                                        conn->sconn->msg_ctx,
                                        &cli);
@@ -4180,50 +4303,72 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
                goto out;
        }
 
-       status = rpccli_samr_Connect2(cli, mem_ctx,
-                                     global_myname(),
+       b = cli->binding_handle;
+
+       status = dcerpc_samr_Connect2(b, mem_ctx,
+                                     lp_netbios_name(),
                                      SAMR_ACCESS_CONNECT_TO_SERVER |
                                      SAMR_ACCESS_ENUM_DOMAINS |
                                      SAMR_ACCESS_LOOKUP_DOMAIN,
-                                     &connect_handle);
+                                     &connect_handle,
+                                     &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        init_lsa_String(&domain_name, get_global_sam_name());
 
-       status = rpccli_samr_LookupDomain(cli, mem_ctx,
+       status = dcerpc_samr_LookupDomain(b, mem_ctx,
                                          &connect_handle,
                                          &domain_name,
-                                         &domain_sid);
+                                         &domain_sid,
+                                         &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
-       status = rpccli_samr_OpenDomain(cli, mem_ctx,
+       status = dcerpc_samr_OpenDomain(b, mem_ctx,
                                        &connect_handle,
                                        SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
                                        domain_sid,
-                                       &domain_handle);
+                                       &domain_handle,
+                                       &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        init_lsa_String(&names, UserName);
 
-       status = rpccli_samr_LookupNames(cli, mem_ctx,
+       status = dcerpc_samr_LookupNames(b, mem_ctx,
                                         &domain_handle,
                                         1,
                                         &names,
                                         &rids,
-                                        &types);
+                                        &types,
+                                        &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        if (rids.count != 1) {
                errcode = W_ERROR_V(WERR_NO_SUCH_USER);
@@ -4240,7 +4385,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
 
        rid = rids.ids[0];
 
-       status = rpccli_samr_OpenUser(cli, mem_ctx,
+       status = dcerpc_samr_OpenUser(b, mem_ctx,
                                      &domain_handle,
                                      SAMR_USER_ACCESS_GET_LOCALE |
                                      SAMR_USER_ACCESS_GET_LOGONINFO |
@@ -4249,20 +4394,30 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
                                      SAMR_USER_ACCESS_GET_GROUP_MEMBERSHIP |
                                      SEC_STD_READ_CONTROL,
                                      rid,
-                                     &user_handle);
+                                     &user_handle,
+                                     &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
-       status = rpccli_samr_QueryUserInfo2(cli, mem_ctx,
+       status = dcerpc_samr_QueryUserInfo2(b, mem_ctx,
                                            &user_handle,
                                            UserAllInformation,
-                                           &info);
+                                           &info,
+                                           &result);
        if (!NT_STATUS_IS_OK(status)) {
                errcode = W_ERROR_V(ntstatus_to_werror(status));
                goto out;
        }
+       if (!NT_STATUS_IS_OK(result)) {
+               errcode = W_ERROR_V(ntstatus_to_werror(result));
+               goto out;
+       }
 
        memset(p,0,21);
        fstrcpy(p+usri11_name,UserName); /* 21 bytes - user name */
@@ -4439,14 +4594,14 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
  out:
        *rdata_len = PTR_DIFF(p2,*rdata);
 
-       if (cli && is_valid_policy_hnd(&user_handle)) {
-               rpccli_samr_Close(cli, mem_ctx, &user_handle);
+       if (b && is_valid_policy_hnd(&user_handle)) {
+               dcerpc_samr_Close(b, mem_ctx, &user_handle, &result);
        }
-       if (cli && is_valid_policy_hnd(&domain_handle)) {
-               rpccli_samr_Close(cli, mem_ctx, &domain_handle);
+       if (b && is_valid_policy_hnd(&domain_handle)) {
+               dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result);
        }
-       if (cli && is_valid_policy_hnd(&connect_handle)) {
-               rpccli_samr_Close(cli, mem_ctx, &connect_handle);
+       if (b && is_valid_policy_hnd(&connect_handle)) {
+               dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result);
        }
 
        SSVAL(*rparam,0,errcode);
@@ -4480,8 +4635,8 @@ static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn,
 
        if(vuser != NULL) {
                DEBUG(3,("  Username of UID %d is %s\n",
-                        (int)vuser->server_info->utok.uid,
-                        vuser->server_info->unix_name));
+                        (int)vuser->session_info->utok.uid,
+                        vuser->session_info->unix_name));
        }
 
        uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
@@ -4541,7 +4696,7 @@ static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn,
 
                PACKS(&desc,"z",lp_workgroup());/* domain */
                PACKS(&desc,"z", vuser ?
-                       vuser->server_info->info3->base.logon_script.string
+                       vuser->session_info->info3->base.logon_script.string
                        : ""); /* script path */
                PACKI(&desc,"D",0x00000000);            /* reserved */
        }
@@ -4664,7 +4819,7 @@ static bool api_WPrintJobGetInfo(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -4806,7 +4961,7 @@ static bool api_WPrintJobEnumerate(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -5006,7 +5161,7 @@ static bool api_WPrintDestGetInfo(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -5138,7 +5293,7 @@ static bool api_WPrintDestEnum(struct smbd_server_connection *sconn,
 
        status = rpc_pipe_open_interface(conn,
                                         &ndr_table_spoolss.syntax_id,
-                                        conn->server_info,
+                                        conn->session_info,
                                         &conn->sconn->client_id,
                                         conn->sconn->msg_ctx,
                                         &cli);
@@ -5416,14 +5571,22 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
        char *p = skip_string(param,tpscnt,str2);
        int uLevel;
        struct pack_desc desc;
-       struct sessionid *session_list;
-       int i, num_sessions;
+       int i;
+
+       TALLOC_CTX *mem_ctx = talloc_tos();
+       WERROR werr;
+       NTSTATUS status;
+       struct rpc_pipe_client *cli = NULL;
+       struct dcerpc_binding_handle *b = NULL;
+       struct srvsvc_NetSessInfoCtr info_ctr;
+       uint32_t totalentries, resume_handle = 0;
+       uint32_t count = 0;
 
        if (!str1 || !str2 || !p) {
                return False;
        }
 
-       memset((char *)&desc,'\0',sizeof(desc));
+       ZERO_STRUCT(desc);
 
        uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
 
@@ -5439,27 +5602,72 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
                return False;
        }
 
-       num_sessions = list_sessions(talloc_tos(), &session_list);
+       status = rpc_pipe_open_interface(conn,
+                                        &ndr_table_srvsvc.syntax_id,
+                                        conn->session_info,
+                                        &conn->sconn->client_id,
+                                        conn->sconn->msg_ctx,
+                                        &cli);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("RNetSessionEnum: could not connect to srvsvc: %s\n",
+                         nt_errstr(status)));
+               desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+               goto out;
+       }
+       b = cli->binding_handle;
+
+       info_ctr.level = 1;
+       info_ctr.ctr.ctr1 = talloc_zero(talloc_tos(), struct srvsvc_NetSessCtr1);
+       if (info_ctr.ctr.ctr1 == NULL) {
+               desc.errcode = W_ERROR_V(WERR_NOMEM);
+               goto out;
+       }
+
+       status = dcerpc_srvsvc_NetSessEnum(b, mem_ctx,
+                                          cli->srv_name_slash,
+                                          NULL, /* client */
+                                          NULL, /* user */
+                                          &info_ctr,
+                                          (uint32_t)-1, /* max_buffer */
+                                          &totalentries,
+                                          &resume_handle,
+                                          &werr);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("RNetSessionEnum: dcerpc_srvsvc_NetSessEnum failed: %s\n",
+                         nt_errstr(status)));
+               desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+               goto out;
+       }
 
+       if (!W_ERROR_IS_OK(werr)) {
+               DEBUG(0,("RNetSessionEnum: dcerpc_srvsvc_NetSessEnum failed: %s\n",
+                         win_errstr(werr)));
+               desc.errcode = W_ERROR_V(werr);
+               goto out;
+       }
+
+       count = info_ctr.ctr.ctr1->count;
+
+ out:
        if (mdrcnt > 0) {
                *rdata = smb_realloc_limit(*rdata,mdrcnt);
                if (!*rdata) {
                        return False;
                }
        }
-       memset((char *)&desc,'\0',sizeof(desc));
+
        desc.base = *rdata;
        desc.buflen = mdrcnt;
        desc.format = str2;
-       if (!init_package(&desc,num_sessions,0)) {
+       if (!init_package(&desc, count,0)) {
                return False;
        }
 
-       for(i=0; i<num_sessions; i++) {
-               PACKS(&desc, "z", session_list[i].remote_machine);
-               PACKS(&desc, "z", session_list[i].username);
+       for(i=0; i < count; i++) {
+               PACKS(&desc, "z", info_ctr.ctr.ctr1->array[i].client);
+               PACKS(&desc, "z", info_ctr.ctr.ctr1->array[i].user);
                PACKI(&desc, "W", 1); /* num conns */
-               PACKI(&desc, "W", 0); /* num opens */
+               PACKI(&desc, "W", info_ctr.ctr.ctr1->array[i].num_open);
                PACKI(&desc, "W", 1); /* num users */
                PACKI(&desc, "D", 0); /* session time */
                PACKI(&desc, "D", 0); /* idle time */
@@ -5476,7 +5684,7 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
        }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0); /* converter */
-       SSVAL(*rparam,4,num_sessions); /* count */
+       SSVAL(*rparam,4, count); /* count */
 
        DEBUG(4,("RNetSessionEnum: errorcode %d\n",desc.errcode));
 
@@ -5649,7 +5857,7 @@ void api_reply(connection_struct *conn, uint16 vuid,
        if (api_commands[i].auth_user && lp_restrict_anonymous()) {
                user_struct *user = get_valid_user_struct(req->sconn, vuid);
 
-               if (!user || user->server_info->guest) {
+               if (!user || user->session_info->guest) {
                        reply_nterror(req, NT_STATUS_ACCESS_DENIED);
                        return;
                }