mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
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)
This commit is contained in:
parent
ae4a576f68
commit
a02415bf36
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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)));
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user