mirror of
https://github.com/samba-team/samba.git
synced 2025-03-01 04:58:35 +03:00
r307: added IDL and test code for samr_GetDomPwInfo(), samr_SetUserInfo2(),
samr_GetBootKeyInformation() and samr_Connect3() also added some stub IDL for samr_SetBootKeyInformation() although I don't yet have working test code. This one is tricky, as if you get it wrong then the target system won't boot any more :) (This used to be commit 118b6fc292ba3257511b1b83846582013fb59b23)
This commit is contained in:
parent
55a19a7fc0
commit
7f26e3ad33
@ -993,7 +993,10 @@
|
|||||||
|
|
||||||
/************************/
|
/************************/
|
||||||
/* Function 0x38 */
|
/* Function 0x38 */
|
||||||
NTSTATUS samr_GET_DOM_PWINFO();
|
NTSTATUS samr_GetDomPwInfo(
|
||||||
|
[in] samr_Name *name,
|
||||||
|
[out] samr_PwInfo info
|
||||||
|
);
|
||||||
|
|
||||||
/************************/
|
/************************/
|
||||||
/* Function 0x39 */
|
/* Function 0x39 */
|
||||||
@ -1005,19 +1008,42 @@
|
|||||||
|
|
||||||
/************************/
|
/************************/
|
||||||
/* Function 0x3a */
|
/* Function 0x3a */
|
||||||
NTSTATUS samr_SET_USERINFO2();
|
/*
|
||||||
|
seems to be an exact alias for samr_SetUserInfo()
|
||||||
|
*/
|
||||||
|
NTSTATUS samr_SetUserInfo2(
|
||||||
|
[in,ref] policy_handle *handle,
|
||||||
|
[in] uint16 level,
|
||||||
|
[in,ref,switch_is(level)] samr_UserInfo *info
|
||||||
|
);
|
||||||
|
|
||||||
/************************/
|
/************************/
|
||||||
/* Function 0x3b */
|
/* Function 0x3b */
|
||||||
NTSTATUS samr_SET_BOOT_KEY_INFORMATION();
|
/*
|
||||||
|
this one is mysterious. I have a few guesses, but nothing working yet
|
||||||
|
*/
|
||||||
|
NTSTATUS samr_SetBootKeyInformation(
|
||||||
|
[in,ref] policy_handle *handle
|
||||||
|
[in] uint32 unknown1,
|
||||||
|
[in] uint32 unknown2,
|
||||||
|
[in] uint32 unknown3
|
||||||
|
);
|
||||||
|
|
||||||
/************************/
|
/************************/
|
||||||
/* Function 0x3c */
|
/* Function 0x3c */
|
||||||
NTSTATUS samr_GET_BOOT_KEY_INFORMATION();
|
NTSTATUS samr_GetBootKeyInformation(
|
||||||
|
[in,ref] policy_handle *handle,
|
||||||
|
[out] uint32 unknown
|
||||||
|
);
|
||||||
|
|
||||||
/************************/
|
/************************/
|
||||||
/* Function 0x3d */
|
/* Function 0x3d */
|
||||||
NTSTATUS samr_CONNECT3();
|
NTSTATUS samr_Connect3(
|
||||||
|
[in] unistr *system_name,
|
||||||
|
[in] uint32 unknown,
|
||||||
|
[in] uint32 access_mask,
|
||||||
|
[out,ref] policy_handle *handle
|
||||||
|
);
|
||||||
|
|
||||||
/************************/
|
/************************/
|
||||||
/* Function 0x3e */
|
/* Function 0x3e */
|
||||||
|
@ -106,6 +106,7 @@ static BOOL test_SetUserInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct samr_SetUserInfo s;
|
struct samr_SetUserInfo s;
|
||||||
|
struct samr_SetUserInfo2 s2;
|
||||||
struct samr_QueryUserInfo q;
|
struct samr_QueryUserInfo q;
|
||||||
struct samr_QueryUserInfo q0;
|
struct samr_QueryUserInfo q0;
|
||||||
union samr_UserInfo u;
|
union samr_UserInfo u;
|
||||||
@ -113,6 +114,10 @@ static BOOL test_SetUserInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
|
|
||||||
s.in.handle = handle;
|
s.in.handle = handle;
|
||||||
s.in.info = &u;
|
s.in.info = &u;
|
||||||
|
|
||||||
|
s2.in.handle = handle;
|
||||||
|
s2.in.info = &u;
|
||||||
|
|
||||||
q.in.handle = handle;
|
q.in.handle = handle;
|
||||||
q.out.info = &u;
|
q.out.info = &u;
|
||||||
q0 = q;
|
q0 = q;
|
||||||
@ -147,12 +152,14 @@ static BOOL test_SetUserInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
q.in.level = lvl1; \
|
q.in.level = lvl1; \
|
||||||
TESTCALL(QueryUserInfo, q) \
|
TESTCALL(QueryUserInfo, q) \
|
||||||
s.in.level = lvl1; \
|
s.in.level = lvl1; \
|
||||||
|
s2.in.level = lvl1; \
|
||||||
u = *q.out.info; \
|
u = *q.out.info; \
|
||||||
init_samr_Name(&u.info ## lvl1.field1, value); \
|
init_samr_Name(&u.info ## lvl1.field1, value); \
|
||||||
if (lvl1 == 21) { \
|
if (lvl1 == 21) { \
|
||||||
u.info21.fields_present = fpval; \
|
u.info21.fields_present = fpval; \
|
||||||
} \
|
} \
|
||||||
TESTCALL(SetUserInfo, s) \
|
TESTCALL(SetUserInfo, s) \
|
||||||
|
TESTCALL(SetUserInfo2, s2) \
|
||||||
init_samr_Name(&u.info ## lvl1.field1, ""); \
|
init_samr_Name(&u.info ## lvl1.field1, ""); \
|
||||||
TESTCALL(QueryUserInfo, q); \
|
TESTCALL(QueryUserInfo, q); \
|
||||||
u = *q.out.info; \
|
u = *q.out.info; \
|
||||||
@ -168,12 +175,14 @@ static BOOL test_SetUserInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
q.in.level = lvl1; \
|
q.in.level = lvl1; \
|
||||||
TESTCALL(QueryUserInfo, q) \
|
TESTCALL(QueryUserInfo, q) \
|
||||||
s.in.level = lvl1; \
|
s.in.level = lvl1; \
|
||||||
|
s2.in.level = lvl1; \
|
||||||
u = *q.out.info; \
|
u = *q.out.info; \
|
||||||
u.info ## lvl1.field1 = value; \
|
u.info ## lvl1.field1 = value; \
|
||||||
if (lvl1 == 21) { \
|
if (lvl1 == 21) { \
|
||||||
u.info21.fields_present = fpval; \
|
u.info21.fields_present = fpval; \
|
||||||
} \
|
} \
|
||||||
TESTCALL(SetUserInfo, s) \
|
TESTCALL(SetUserInfo, s) \
|
||||||
|
TESTCALL(SetUserInfo2, s2) \
|
||||||
u.info ## lvl1.field1 = 0; \
|
u.info ## lvl1.field1 = 0; \
|
||||||
TESTCALL(QueryUserInfo, q); \
|
TESTCALL(QueryUserInfo, q); \
|
||||||
u = *q.out.info; \
|
u = *q.out.info; \
|
||||||
@ -244,7 +253,6 @@ static BOOL test_SetUserInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static BOOL test_SetUserPass(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
static BOOL test_SetUserPass(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
||||||
struct policy_handle *handle)
|
struct policy_handle *handle)
|
||||||
{
|
{
|
||||||
@ -348,6 +356,27 @@ static BOOL test_GetGroupsForUser(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL test_GetDomPwInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
||||||
|
struct samr_Name *domain_name)
|
||||||
|
{
|
||||||
|
NTSTATUS status;
|
||||||
|
struct samr_GetDomPwInfo r;
|
||||||
|
BOOL ret = True;
|
||||||
|
|
||||||
|
printf("Testing GetDomPwInfo\n");
|
||||||
|
|
||||||
|
r.in.name = domain_name;
|
||||||
|
|
||||||
|
status = dcerpc_samr_GetDomPwInfo(p, mem_ctx, &r);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
printf("GetDomPwInfo failed - %s\n", nt_errstr(status));
|
||||||
|
ret = False;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL test_GetUserPwInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
static BOOL test_GetUserPwInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
||||||
struct policy_handle *handle)
|
struct policy_handle *handle)
|
||||||
{
|
{
|
||||||
@ -1962,6 +1991,26 @@ static BOOL test_RidToSid(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL test_GetBootKeyInformation(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
||||||
|
struct policy_handle *domain_handle)
|
||||||
|
{
|
||||||
|
struct samr_GetBootKeyInformation r;
|
||||||
|
NTSTATUS status;
|
||||||
|
BOOL ret = True;
|
||||||
|
|
||||||
|
printf("Testing GetBootKeyInformation\n");
|
||||||
|
|
||||||
|
r.in.handle = domain_handle;
|
||||||
|
|
||||||
|
status = dcerpc_samr_GetBootKeyInformation(p, mem_ctx, &r);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
printf("GetBootKeyInformation failed - %s\n", nt_errstr(status));
|
||||||
|
ret = False;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL test_AddGroupMember(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
static BOOL test_AddGroupMember(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
||||||
struct policy_handle *domain_handle,
|
struct policy_handle *domain_handle,
|
||||||
struct policy_handle *group_handle)
|
struct policy_handle *group_handle)
|
||||||
@ -2197,6 +2246,10 @@ static BOOL test_OpenDomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
ret = False;
|
ret = False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!test_GetBootKeyInformation(p, mem_ctx, &domain_handle)) {
|
||||||
|
ret = False;
|
||||||
|
}
|
||||||
|
|
||||||
if (!policy_handle_empty(&user_handle) &&
|
if (!policy_handle_empty(&user_handle) &&
|
||||||
!test_DeleteUser(p, mem_ctx, &user_handle)) {
|
!test_DeleteUser(p, mem_ctx, &user_handle)) {
|
||||||
ret = False;
|
ret = False;
|
||||||
@ -2224,6 +2277,7 @@ static BOOL test_LookupDomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct samr_LookupDomain r;
|
struct samr_LookupDomain r;
|
||||||
|
BOOL ret = True;
|
||||||
|
|
||||||
printf("Testing LookupDomain(%s)\n", domain->name);
|
printf("Testing LookupDomain(%s)\n", domain->name);
|
||||||
|
|
||||||
@ -2236,11 +2290,15 @@ static BOOL test_LookupDomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!test_OpenDomain(p, mem_ctx, handle, r.out.sid)) {
|
if (!test_GetDomPwInfo(p, mem_ctx, domain)) {
|
||||||
return False;
|
ret = False;
|
||||||
}
|
}
|
||||||
|
|
||||||
return True;
|
if (!test_OpenDomain(p, mem_ctx, handle, r.out.sid)) {
|
||||||
|
ret = False;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2285,10 +2343,13 @@ static BOOL test_Connect(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct samr_Connect r;
|
struct samr_Connect r;
|
||||||
struct samr_Connect2 r2;
|
struct samr_Connect2 r2;
|
||||||
|
struct samr_Connect3 r3;
|
||||||
struct samr_Connect4 r4;
|
struct samr_Connect4 r4;
|
||||||
struct samr_Connect5 r5;
|
struct samr_Connect5 r5;
|
||||||
BOOL ret = True;
|
BOOL ret = True;
|
||||||
|
|
||||||
|
printf("testing samr_Connect\n");
|
||||||
|
|
||||||
r.in.system_name = 0;
|
r.in.system_name = 0;
|
||||||
r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
||||||
r.out.handle = handle;
|
r.out.handle = handle;
|
||||||
@ -2299,6 +2360,8 @@ static BOOL test_Connect(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
ret = False;
|
ret = False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("testing samr_Connect2\n");
|
||||||
|
|
||||||
r2.in.system_name = "";
|
r2.in.system_name = "";
|
||||||
r2.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
r2.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
||||||
r2.out.handle = handle;
|
r2.out.handle = handle;
|
||||||
@ -2309,6 +2372,21 @@ static BOOL test_Connect(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
ret = False;
|
ret = False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("testing samr_Connect3\n");
|
||||||
|
|
||||||
|
r3.in.system_name = "";
|
||||||
|
r3.in.unknown = 0;
|
||||||
|
r3.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
||||||
|
r3.out.handle = handle;
|
||||||
|
|
||||||
|
status = dcerpc_samr_Connect3(p, mem_ctx, &r3);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
printf("Connect3 failed - %s\n", nt_errstr(status));
|
||||||
|
ret = False;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("testing samr_Connect4\n");
|
||||||
|
|
||||||
r4.in.system_name = "";
|
r4.in.system_name = "";
|
||||||
r4.in.unknown = 0;
|
r4.in.unknown = 0;
|
||||||
r4.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
r4.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
||||||
@ -2320,6 +2398,8 @@ static BOOL test_Connect(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
|||||||
ret = False;
|
ret = False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("testing samr_Connect5\n");
|
||||||
|
|
||||||
r5.in.system_name = "";
|
r5.in.system_name = "";
|
||||||
r5.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
r5.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
|
||||||
r5.in.unknown0 = 1; /*Magic values I took from a WinXP pro workstation */
|
r5.in.unknown0 = 1; /*Magic values I took from a WinXP pro workstation */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user