1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-27 08:23:49 +03:00

added samr_set_domain_info and samr_unknown_2E.

We now get the full account policy window in usermanager, and the
framework to store all those values. I plan to add a TDB file to store
them.

oh, and found that the last value in a sam_unknown_info_12_inf struct is
an uint16 and not a uint32.

andrewb: you hardcoded the MAX_PASSWORD_AGE to 21 days. We can now turn it
to a value setable in usermanager.

        J.F.
This commit is contained in:
Jean-François Micouleau
-
parent 6446d2acd5
commit 99471d2569
4 changed files with 450 additions and 44 deletions

View File

@@ -87,6 +87,7 @@ SamrTestPrivateFunctionsUser
#define SAMR_ENUM_DOMAINS 0x06
#define SAMR_OPEN_DOMAIN 0x07
#define SAMR_QUERY_DOMAIN_INFO 0x08
#define SAMR_SET_DOMAIN_INFO 0x09
#define SAMR_CREATE_DOM_GROUP 0x0a
#define SAMR_ENUM_DOM_GROUPS 0x0b
@@ -127,7 +128,7 @@ SamrTestPrivateFunctionsUser
#define SAMR_UNKNOWN_2b 0x2b
#define SAMR_GET_USRDOM_PWINFO 0x2c
#define SAMR_UNKNOWN_2D 0x2d
#define SAMR_UNKNOWN_2e 0x2e
#define SAMR_UNKNOWN_2E 0x2e /* looks like an alias for SAMR_QUERY_DOMAIN_INFO */
#define SAMR_UNKNOWN_2f 0x2f
#define SAMR_QUERY_DISPINFO3 0x30 /* Alias for SAMR_QUERY_DISPINFO
with info level 3 */
@@ -507,12 +508,9 @@ typedef struct sam_unknown_info_7_info
typedef struct sam_unknown_info_12_inf
{
uint32 unknown_0; /* 0xcf1d cc00 */
uint32 unknown_1; /* 0xffff fffb */
uint32 unknown_2; /* 0xcf1d cc00 */
uint32 unknown_3; /* 0xffff fffb */
uint32 unknown_4; /* 0x8a88 0000 */
NTTIME duration;
NTTIME reset_count;
uint16 bad_attempt_lockout;
} SAM_UNK_INFO_12;
@@ -1760,39 +1758,38 @@ typedef struct sid_info_3
/* SAMR_Q_UNKNOWN_2E */
typedef struct q_samr_unknown_2e_info
{
POLICY_HND dom_pol; /* policy handle */
POLICY_HND domain_pol; /* policy handle */
uint16 switch_value;
} SAMR_Q_UNKNOWN_2E;
typedef struct sam_unknown_2e_info_12
{
uint32 duration_low;
uint32 duration_high;
uint32 reset_count_low;
uint32 reset_count_high;
uint32 bad_attempt_lockout;
} SAM_UNK_2E_INFO_12;
typedef struct sam_unknown_2e_ctr_info
{
union
{
SAM_UNK_2E_INFO_12 info12;
} info;
} SAM_UNK_2E_CTR;
/* SAMR_R_UNKNOWN_2E - probably an open */
/* SAMR_R_UNKNOWN_2E */
typedef struct r_samr_unknown_2e_info
{
uint32 ptr;
uint32 ptr_0;
uint16 switch_value;
SAM_UNK_2E_CTR *ctr;
uint32 status; /* return status */
SAM_UNK_CTR *ctr;
NTSTATUS status; /* return status */
} SAMR_R_UNKNOWN_2E;
/* SAMR_Q_SET_DOMAIN_INFO */
typedef struct q_samr_set_domain_info
{
POLICY_HND domain_pol; /* policy handle */
uint16 switch_value0;
uint16 switch_value;
SAM_UNK_CTR *ctr;
} SAMR_Q_SET_DOMAIN_INFO;
/* SAMR_R_SET_DOMAIN_INFO */
typedef struct r_samr_set_domain_info
{
NTSTATUS status; /* return status */
} SAMR_R_SET_DOMAIN_INFO;
#endif /* _RPC_SAMR_H */

View File

@@ -556,12 +556,12 @@ inits a structure.
void init_unk_info12(SAM_UNK_INFO_12 * u_12)
{
u_12->unknown_0 = 0xcf1dcc00;
u_12->unknown_1 = 0xfffffffb;
u_12->unknown_2 = 0xcf1dcc00;
u_12->unknown_3 = 0xfffffffb;
u_12->duration.low = 0xcf1dcc00;
u_12->duration.high = 0xfffffffb;
u_12->reset_count.low = 0xcf1dcc00;
u_12->reset_count.high = 0xfffffffb;
u_12->unknown_4 = 0x8a880000;
u_12->bad_attempt_lockout = 0x0000;
}
/*******************************************************************
@@ -577,15 +577,11 @@ static BOOL sam_io_unk_info12(char *desc, SAM_UNK_INFO_12 * u_12,
prs_debug(ps, depth, desc, "sam_io_unk_info12");
depth++;
if(!prs_uint32("unknown_0", ps, depth, &u_12->unknown_0))
if(!smb_io_time("duration", &u_12->duration, ps, depth))
return False;
if(!prs_uint32("unknown_1", ps, depth, &u_12->unknown_1))
if(!smb_io_time("reset_count", &u_12->reset_count, ps, depth))
return False;
if(!prs_uint32("unknown_2", ps, depth, &u_12->unknown_2))
return False;
if(!prs_uint32("unknown_3", ps, depth, &u_12->unknown_3))
return False;
if(!prs_uint32("unknown_4", ps, depth, &u_12->unknown_4))
if(!prs_uint16("bad_attempt_lockout", ps, depth, &u_12->bad_attempt_lockout))
return False;
return True;
@@ -6864,3 +6860,254 @@ BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER * r_u,
return True;
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
void init_samr_q_unknown_2e(SAMR_Q_UNKNOWN_2E *q_u,
POLICY_HND *domain_pol, uint16 switch_value)
{
DEBUG(5, ("init_samr_q_unknown_2e\n"));
q_u->domain_pol = *domain_pol;
q_u->switch_value = switch_value;
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
BOOL samr_io_q_unknown_2e(char *desc, SAMR_Q_UNKNOWN_2E *q_u,
prs_struct *ps, int depth)
{
if (q_u == NULL)
return False;
prs_debug(ps, depth, desc, "samr_io_q_unknown_2e");
depth++;
if(!prs_align(ps))
return False;
if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
return False;
if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
return False;
return True;
}
/*******************************************************************
inits a SAMR_R_QUERY_DOMAIN_INFO structure.
********************************************************************/
void init_samr_r_samr_unknown_2e(SAMR_R_UNKNOWN_2E * r_u,
uint16 switch_value, SAM_UNK_CTR * ctr,
NTSTATUS status)
{
DEBUG(5, ("init_samr_r_samr_unknown_2e\n"));
r_u->ptr_0 = 0;
r_u->switch_value = 0;
r_u->status = status; /* return status */
if (NT_STATUS_IS_OK(status)) {
r_u->switch_value = switch_value;
r_u->ptr_0 = 1;
r_u->ctr = ctr;
}
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
BOOL samr_io_r_samr_unknown_2e(char *desc, SAMR_R_UNKNOWN_2E * r_u,
prs_struct *ps, int depth)
{
if (r_u == NULL)
return False;
prs_debug(ps, depth, desc, "samr_io_r_samr_unknown_2e");
depth++;
if(!prs_align(ps))
return False;
if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
return False;
if (r_u->ptr_0 != 0 && r_u->ctr != NULL) {
if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
return False;
if(!prs_align(ps))
return False;
switch (r_u->switch_value) {
case 0x0c:
if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth))
return False;
break;
case 0x07:
if(!sam_io_unk_info7("unk_inf7",&r_u->ctr->info.inf7, ps,depth))
return False;
break;
case 0x06:
if(!sam_io_unk_info6("unk_inf6",&r_u->ctr->info.inf6, ps,depth))
return False;
break;
case 0x05:
if(!sam_io_unk_info5("unk_inf5",&r_u->ctr->info.inf5, ps,depth))
return False;
break;
case 0x03:
if(!sam_io_unk_info3("unk_inf3",&r_u->ctr->info.inf3, ps,depth))
return False;
break;
case 0x02:
if(!sam_io_unk_info2("unk_inf2",&r_u->ctr->info.inf2, ps,depth))
return False;
break;
case 0x01:
if(!sam_io_unk_info1("unk_inf1",&r_u->ctr->info.inf1, ps,depth))
return False;
break;
default:
DEBUG(0, ("samr_io_r_samr_unknown_2e: unknown switch level 0x%x\n",
r_u->switch_value));
r_u->status = NT_STATUS_INVALID_INFO_CLASS;
return False;
}
}
if(!prs_align(ps))
return False;
if(!prs_ntstatus("status", ps, depth, &r_u->status))
return False;
return True;
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
void init_samr_q_set_domain_info(SAMR_Q_SET_DOMAIN_INFO *q_u,
POLICY_HND *domain_pol, uint16 switch_value, SAM_UNK_CTR *ctr)
{
DEBUG(5, ("init_samr_q_set_domain_info\n"));
q_u->domain_pol = *domain_pol;
q_u->switch_value0 = switch_value;
q_u->switch_value = switch_value;
q_u->ctr = ctr;
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
BOOL samr_io_q_set_domain_info(char *desc, SAMR_Q_SET_DOMAIN_INFO *q_u,
prs_struct *ps, int depth)
{
if (q_u == NULL)
return False;
prs_debug(ps, depth, desc, "samr_io_q_set_domain_info");
depth++;
if(!prs_align(ps))
return False;
if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
return False;
if(!prs_uint16("switch_value0", ps, depth, &q_u->switch_value0))
return False;
if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
return False;
if(!prs_align(ps))
return False;
if ((q_u->ctr = (SAM_UNK_CTR *)prs_alloc_mem(ps, sizeof(SAM_UNK_CTR))) == NULL)
return False;
switch (q_u->switch_value) {
case 0x0c:
if(!sam_io_unk_info12("unk_inf12", &q_u->ctr->info.inf12, ps, depth))
return False;
break;
case 0x07:
if(!sam_io_unk_info7("unk_inf7",&q_u->ctr->info.inf7, ps,depth))
return False;
break;
case 0x06:
if(!sam_io_unk_info6("unk_inf6",&q_u->ctr->info.inf6, ps,depth))
return False;
break;
case 0x05:
if(!sam_io_unk_info5("unk_inf5",&q_u->ctr->info.inf5, ps,depth))
return False;
break;
case 0x03:
if(!sam_io_unk_info3("unk_inf3",&q_u->ctr->info.inf3, ps,depth))
return False;
break;
case 0x02:
if(!sam_io_unk_info2("unk_inf2",&q_u->ctr->info.inf2, ps,depth))
return False;
break;
case 0x01:
if(!sam_io_unk_info1("unk_inf1",&q_u->ctr->info.inf1, ps,depth))
return False;
break;
default:
DEBUG(0, ("samr_io_r_samr_unknown_2e: unknown switch level 0x%x\n",
q_u->switch_value));
return False;
}
return True;
}
/*******************************************************************
inits a SAMR_R_QUERY_DOMAIN_INFO structure.
********************************************************************/
void init_samr_r_set_domain_info(SAMR_R_SET_DOMAIN_INFO * r_u, NTSTATUS status)
{
DEBUG(5, ("init_samr_r_set_domain_info\n"));
r_u->status = status; /* return status */
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
BOOL samr_io_r_set_domain_info(char *desc, SAMR_R_SET_DOMAIN_INFO * r_u,
prs_struct *ps, int depth)
{
if (r_u == NULL)
return False;
prs_debug(ps, depth, desc, "samr_io_r_samr_unknown_2e");
depth++;
if(!prs_align(ps))
return False;
if(!prs_ntstatus("status", ps, depth, &r_u->status))
return False;
return True;
}

View File

@@ -1311,6 +1311,68 @@ static BOOL api_samr_unknown_2d(pipes_struct *p)
return True;
}
/*******************************************************************
api_samr_query_dom_info
********************************************************************/
static BOOL api_samr_unknown_2e(pipes_struct *p)
{
SAMR_Q_UNKNOWN_2E q_u;
SAMR_R_UNKNOWN_2E r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
/* grab the samr unknown 8 command */
if(!samr_io_q_unknown_2e("", &q_u, data, 0)) {
DEBUG(0,("api_samr_unknown_2e: unable to unmarshall SAMR_Q_UNKNOWN_2E.\n"));
return False;
}
r_u.status = _samr_unknown_2e(p, &q_u, &r_u);
/* store the response in the SMB stream */
if(!samr_io_r_samr_unknown_2e("", &r_u, rdata, 0)) {
DEBUG(0,("api_samr_unknown_2e: unable to marshall SAMR_R_UNKNOWN_2E.\n"));
return False;
}
return True;
}
/*******************************************************************
api_samr_set_dom_info
********************************************************************/
static BOOL api_samr_set_dom_info(pipes_struct *p)
{
SAMR_Q_SET_DOMAIN_INFO q_u;
SAMR_R_SET_DOMAIN_INFO r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
/* grab the samr unknown 8 command */
if(!samr_io_q_set_domain_info("", &q_u, data, 0)) {
DEBUG(0,("api_samr_set_dom_info: unable to unmarshall SAMR_Q_SET_DOMAIN_INFO.\n"));
return False;
}
r_u.status = _samr_set_dom_info(p, &q_u, &r_u);
/* store the response in the SMB stream */
if(!samr_io_r_set_domain_info("", &r_u, rdata, 0)) {
DEBUG(0,("api_samr_set_dom_info: unable to marshall SAMR_R_SET_DOMAIN_INFO.\n"));
return False;
}
return True;
}
/*******************************************************************
array of \PIPE\samr operations
********************************************************************/
@@ -1366,6 +1428,8 @@ static struct api_struct api_samr_cmds [] =
{"SAMR_QUERY_SEC_OBJECT" , SAMR_QUERY_SEC_OBJECT , api_samr_query_sec_obj },
{"SAMR_GET_USRDOM_PWINFO" , SAMR_GET_USRDOM_PWINFO, api_samr_get_usrdom_pwinfo},
{"SAMR_UNKNOWN_2E" , SAMR_UNKNOWN_2E , api_samr_unknown_2e },
{"SAMR_SET_DOMAIN_INFO" , SAMR_SET_DOMAIN_INFO , api_samr_set_dom_info },
{NULL , 0 , NULL }
};

View File

@@ -3336,3 +3336,101 @@ NTSTATUS _samr_unknown_2d(pipes_struct *p, SAMR_Q_UNKNOWN_2D *q_u, SAMR_R_UNKNOW
DEBUG(0,("_samr_unknown_2d: Not yet implemented.\n"));
return NT_STATUS_NOT_IMPLEMENTED;
}
/*******************************************************************
_samr_unknown_2e
********************************************************************/
NTSTATUS _samr_unknown_2e(pipes_struct *p, SAMR_Q_UNKNOWN_2E *q_u, SAMR_R_UNKNOWN_2E *r_u)
{
SAM_UNK_CTR *ctr;
if ((ctr = (SAM_UNK_CTR *)talloc_zero(p->mem_ctx, sizeof(SAM_UNK_CTR))) == NULL)
return NT_STATUS_NO_MEMORY;
ZERO_STRUCTP(ctr);
r_u->status = NT_STATUS_OK;
DEBUG(5,("_samr_unknown_2e: %d\n", __LINE__));
/* find the policy handle. open a policy on it. */
if (!find_policy_by_hnd(p, &q_u->domain_pol, NULL))
return NT_STATUS_INVALID_HANDLE;
switch (q_u->switch_value) {
case 0x01:
init_unk_info1(&ctr->info.inf1);
break;
case 0x02:
/* The time call below is to get a sequence number for the sam. FIXME !!! JRA. */
init_unk_info2(&ctr->info.inf2, global_myworkgroup, global_myname, (uint32) time(NULL));
break;
case 0x03:
init_unk_info3(&ctr->info.inf3);
break;
case 0x05:
init_unk_info5(&ctr->info.inf5, global_myname);
break;
case 0x06:
init_unk_info6(&ctr->info.inf6);
break;
case 0x07:
init_unk_info7(&ctr->info.inf7);
break;
case 0x0c:
init_unk_info12(&ctr->info.inf12);
break;
default:
return NT_STATUS_INVALID_INFO_CLASS;
}
init_samr_r_samr_unknown_2e(r_u, q_u->switch_value, ctr, NT_STATUS_OK);
DEBUG(5,("_samr_unknown_2e: %d\n", __LINE__));
return r_u->status;
}
/*******************************************************************
_samr_
********************************************************************/
NTSTATUS _samr_set_dom_info(pipes_struct *p, SAMR_Q_SET_DOMAIN_INFO *q_u, SAMR_R_SET_DOMAIN_INFO *r_u)
{
r_u->status = NT_STATUS_OK;
DEBUG(5,("_samr_set_dom_info: %d\n", __LINE__));
/* find the policy handle. open a policy on it. */
if (!find_policy_by_hnd(p, &q_u->domain_pol, NULL))
return NT_STATUS_INVALID_HANDLE;
DEBUG(0,("_samr_set_dom_info: switch_value: %d\n", q_u->switch_value));
switch (q_u->switch_value) {
case 0x01:
break;
case 0x02:
break;
case 0x03:
break;
case 0x05:
break;
case 0x06:
break;
case 0x07:
break;
case 0x0c:
break;
default:
return NT_STATUS_INVALID_INFO_CLASS;
}
init_samr_r_set_domain_info(r_u, NT_STATUS_OK);
DEBUG(5,("_samr_set_dom_info: %d\n", __LINE__));
return r_u->status;
}