diff options
author | Alexander Bokovoy <ab@samba.org> | 2006-01-14 12:37:25 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:06:08 -0500 |
commit | a02415bf363e3c1b6863b135bdae3b2e2708db3b (patch) | |
tree | d49ef69be6c2179d11f93fe47bb02cba30fd6670 | |
parent | ae4a576f680f1c0507ec73f606154ff8ff36a1dd (diff) | |
download | samba-a02415bf363e3c1b6863b135bdae3b2e2708db3b.tar.gz samba-a02415bf363e3c1b6863b135bdae3b2e2708db3b.tar.bz2 samba-a02415bf363e3c1b6863b135bdae3b2e2708db3b.zip |
r12935: After discussion with Volker fix bug #3397 using a variant of the patch by Alex Deiter (tiamat@komi.mts.ru).
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)
-rw-r--r-- | source3/include/rpc_samr.h | 9 | ||||
-rw-r--r-- | source3/rpc_parse/parse_samr.c | 42 | ||||
-rw-r--r-- | source3/rpc_server/srv_samr_nt.c | 53 | ||||
-rw-r--r-- | source3/rpcclient/cmd_samr.c | 11 |
4 files changed, 113 insertions, 2 deletions
diff --git a/source3/include/rpc_samr.h b/source3/include/rpc_samr.h index 5555aaef0e..342db37ea5 100644 --- a/source3/include/rpc_samr.h +++ b/source3/include/rpc_samr.h @@ -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; diff --git a/source3/rpc_parse/parse_samr.c b/source3/rpc_parse/parse_samr.c index 0a055ff826..6c2b4f4ea7 100644 --- a/source3/rpc_parse/parse_samr.c +++ b/source3/rpc_parse/parse_samr.c @@ -5183,6 +5183,39 @@ static BOOL sam_io_user_info7(const char *desc, SAM_USER_INFO_7 * usr, } /******************************************************************* +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); diff --git a/source3/rpc_server/srv_samr_nt.c b/source3/rpc_server/srv_samr_nt.c index c90b4d3660..8f8c035c9c 100644 --- a/source3/rpc_server/srv_samr_nt.c +++ b/source3/rpc_server/srv_samr_nt.c @@ -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))); diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c index e711cc7d1c..991b55a13c 100644 --- a/source3/rpcclient/cmd_samr.c +++ b/source3/rpcclient/cmd_samr.c @@ -39,6 +39,14 @@ static void display_sam_user_info_7(SAM_USER_INFO_7 *usr) } /**************************************************************************** + 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 ****************************************************************************/ static void display_sam_user_info_21(SAM_USER_INFO_21 *usr) @@ -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; |