r12935: After discussion with Volker fix bug #3397 using a variant of the patch by...
authorAlexander Bokovoy <ab@samba.org>
Sat, 14 Jan 2006 12:37:25 +0000 (12:37 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:06:08 +0000 (11:06 -0500)
Introduces level 9 of getuserinfo and allows to successfully install MS SMS2003
on a member of a Samba domain. Also added support for this level in rpcclient.

The code for infolevel 9 is modelled upon Samba-TNG by Alex Deiter.

Jerry, we need this in 3.0.21b.
(This used to be commit 93461646ce2ad6e2f8b11d40ce98722d56a83b43)

source3/include/rpc_samr.h
source3/rpc_parse/parse_samr.c
source3/rpc_server/srv_samr_nt.c
source3/rpcclient/cmd_samr.c

index 5555aaef0e439b39077ca92f76dc214805d0e3ca..342db37ea574721eced74205661bb2e1d5e726f0 100644 (file)
@@ -408,6 +408,7 @@ typedef struct sam_user_info_16
 
 } SAM_USER_INFO_16;
 
+
 /* SAM_USER_INFO_7 */
 typedef struct sam_user_info_7
 {
@@ -417,6 +418,13 @@ typedef struct sam_user_info_7
 } SAM_USER_INFO_7;
 
 
+/* SAM_USER_INFO_9 */
+typedef struct sam_user_info_9
+{
+       uint32 rid_group;     /* Primary Group RID */
+} SAM_USER_INFO_9;
+
+
 /* SAMR_Q_CLOSE_HND - probably a policy handle close */
 typedef struct q_samr_close_hnd_info
 {
@@ -1255,6 +1263,7 @@ typedef struct sam_userinfo_ctr_info
        union
        {
                SAM_USER_INFO_7  *id7;
+               SAM_USER_INFO_9  *id9;
                SAM_USER_INFO_16 *id16;
                SAM_USER_INFO_17 *id17;
                SAM_USER_INFO_18 *id18;
index 0a055ff826a72c352e0bccb42e06087cf9eae65a..6c2b4f4ea71c0546e075a1554669149c05276601 100644 (file)
@@ -5182,6 +5182,39 @@ static BOOL sam_io_user_info7(const char *desc, SAM_USER_INFO_7 * usr,
        return True;
 }
 
+/*******************************************************************
+inits a SAM_USER_INFO_9 structure.
+********************************************************************/
+
+void init_sam_user_info9(SAM_USER_INFO_9 * usr, uint32 rid_group)
+{
+       DEBUG(5, ("init_sam_user_info9\n"));
+
+       usr->rid_group = rid_group;
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+
+static BOOL sam_io_user_info9(const char *desc, SAM_USER_INFO_9 * usr,
+                       prs_struct *ps, int depth)
+{
+       if (usr == NULL)
+               return False;
+
+       prs_debug(ps, depth, desc, "samr_io_r_user_info9");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("rid_group", ps, depth, &usr->rid_group))
+               return False;
+
+       return True;
+}
+
 /*******************************************************************
 inits a SAM_USER_INFO_16 structure.
 ********************************************************************/
@@ -6354,6 +6387,15 @@ static BOOL samr_io_userinfo_ctr(const char *desc, SAM_USERINFO_CTR **ppctr,
                }
                ret = sam_io_user_info7("", ctr->info.id7, ps, depth);
                break;
+       case 9:
+               if (UNMARSHALLING(ps))
+                       ctr->info.id9 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_9,1);
+               if (ctr->info.id9 == NULL) {
+                       DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
+                       return False;
+               }
+               ret = sam_io_user_info9("", ctr->info.id9, ps, depth);
+               break;
        case 16:
                if (UNMARSHALLING(ps))
                        ctr->info.id16 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_16,1);
index c90b4d36600644f7fe181640ce69ca067cb7fc90..8f8c035c9cd5f39130c4015717e5bc806b9cb557 100644 (file)
@@ -1672,6 +1672,41 @@ static NTSTATUS get_user_info_7(TALLOC_CTX *mem_ctx, SAM_USER_INFO_7 *id7, DOM_S
 
        return NT_STATUS_OK;
 }
+
+/*************************************************************************
+ get_user_info_9. Only gives out primary group SID.
+ *************************************************************************/
+static NTSTATUS get_user_info_9(TALLOC_CTX *mem_ctx, SAM_USER_INFO_9 * id9, DOM_SID *user_sid)
+{
+       SAM_ACCOUNT *smbpass=NULL;
+       BOOL ret;
+       NTSTATUS nt_status;
+
+       nt_status = pdb_init_sam_talloc(mem_ctx, &smbpass);
+
+       if (!NT_STATUS_IS_OK(nt_status)) {
+               return nt_status;
+       }
+
+       become_root();
+       ret = pdb_getsampwsid(smbpass, user_sid);
+       unbecome_root();
+
+       if (ret==False) {
+               DEBUG(4,("User %s not found\n", sid_string_static(user_sid)));
+               return NT_STATUS_NO_SUCH_USER;
+       }
+
+       DEBUG(3,("User:[%s]\n", pdb_get_username(smbpass) ));
+
+       ZERO_STRUCTP(id9);
+       init_sam_user_info9(id9, pdb_get_group_rid(smbpass) );
+
+       pdb_free_sam(&smbpass);
+
+       return NT_STATUS_OK;
+}
+
 /*************************************************************************
  get_user_info_16. Safe. Only gives out acb bits.
  *************************************************************************/
@@ -1864,6 +1899,8 @@ NTSTATUS _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_
        /* ok!  user info levels (lots: see MSDEV help), off we go... */
        ctr->switch_value = q_u->switch_value;
 
+       DEBUG(5,("_samr_query_userinfo: user info level: %d\n", q_u->switch_value));
+
        switch (q_u->switch_value) {
        case 7:
                ctr->info.id7 = TALLOC_ZERO_P(p->mem_ctx, SAM_USER_INFO_7);
@@ -1873,6 +1910,14 @@ NTSTATUS _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_
                if (!NT_STATUS_IS_OK(r_u->status = get_user_info_7(p->mem_ctx, ctr->info.id7, &info->sid)))
                        return r_u->status;
                break;
+       case 9:
+               ctr->info.id9 = TALLOC_ZERO_P(p->mem_ctx, SAM_USER_INFO_9);
+               if (ctr->info.id9 == NULL)
+                       return NT_STATUS_NO_MEMORY;
+
+               if (!NT_STATUS_IS_OK(r_u->status = get_user_info_9(p->mem_ctx, ctr->info.id9, &info->sid)))
+                       return r_u->status;
+               break;
        case 16:
                ctr->info.id16 = TALLOC_ZERO_P(p->mem_ctx, SAM_USER_INFO_16);
                if (ctr->info.id16 == NULL)
@@ -2677,8 +2722,12 @@ NTSTATUS _samr_lookup_domain(pipes_struct *p, SAMR_Q_LOOKUP_DOMAIN *q_u, SAMR_R_
 
        ZERO_STRUCT(sid);
 
-       if (!secrets_fetch_domain_sid(domain_name, &sid)) {
-               r_u->status = NT_STATUS_NO_SUCH_DOMAIN;
+       if (strequal(domain_name, builtin_domain_name())) {
+               sid_copy(&sid, &global_sid_Builtin);
+       } else {
+               if (!secrets_fetch_domain_sid(domain_name, &sid)) {
+                       r_u->status = NT_STATUS_NO_SUCH_DOMAIN;
+               }
        }
 
        DEBUG(2,("Returning domain sid for domain %s -> %s\n", domain_name, sid_string_static(&sid)));
index e711cc7d1c01a1690a6c0bddbb0db11e0b7be5df..991b55a13c80a524f1c04f2c21188fc6ffd9c29e 100644 (file)
@@ -38,6 +38,14 @@ static void display_sam_user_info_7(SAM_USER_INFO_7 *usr)
        printf("\tUser Name   :\t%s\n", temp);
 }
 
+/****************************************************************************
+ display sam_user_info_9 structure
+ ****************************************************************************/
+static void display_sam_user_info_9(SAM_USER_INFO_9 *usr)
+{
+       printf("\tPrimary group RID   :\tox%x\n", usr->rid_group);
+}
+
 /****************************************************************************
  display sam_user_info_21 structure
  ****************************************************************************/
@@ -398,6 +406,9 @@ static NTSTATUS cmd_samr_query_user(struct rpc_pipe_client *cli,
        case 7:
                display_sam_user_info_7(user_ctr->info.id7);
                break;
+       case 9:
+               display_sam_user_info_9(user_ctr->info.id9);
+               break;
        default:
                printf("Unsupported infolevel: %d\n", info_level);
                break;