summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/librpc/idl/samr.idl39
-rw-r--r--source4/torture/rpc/samr.c26
2 files changed, 36 insertions, 29 deletions
diff --git a/source4/librpc/idl/samr.idl b/source4/librpc/idl/samr.idl
index f41b8584b2..8fdc8a92fd 100644
--- a/source4/librpc/idl/samr.idl
+++ b/source4/librpc/idl/samr.idl
@@ -148,7 +148,7 @@
samr_Name comment;
samr_Name domain; /* domain name */
samr_Name primary; /* PDC name if this is a BDC */
- HYPER_T sequence_num;
+ uint64 sequence_num;
uint32 unknown2;
uint32 role;
uint32 unknown3;
@@ -190,17 +190,7 @@
} samr_DomInfo9;
typedef struct {
- uint64 force_logoff_time;
- samr_Name comment;
- samr_Name domain;
- samr_Name primary;
- HYPER_T sequence_num;
- uint32 unknown2; /* w2k3 returns 1 */
- uint32 role;
- uint32 unknown3; /* w2k3 returns 1 */
- uint32 num_users;
- uint32 num_groups;
- uint32 num_aliases;
+ samr_DomInfo2 info2;
HYPER_T lockout_duration;
HYPER_T lockout_window;
uint16 lockout_threshold;
@@ -405,10 +395,11 @@
} samr_GroupInfoDesciption;
typedef enum {
- GroupInfoAll = 1,
- GroupInfoName,
- GroupInfoX,
- GroupInfoDescription
+ GroupInfoAll = 1,
+ GroupInfoName = 2,
+ GroupInfoX = 3,
+ GroupInfoDescription = 4,
+ GroupInfoAll2 = 5
} GroupInfo;
typedef union {
@@ -416,6 +407,7 @@
[case(GroupInfoName)] samr_Name name;
[case(GroupInfoX)] samr_GroupInfoX unknown;
[case(GroupInfoDescription)] samr_Name description;
+ [case(GroupInfoAll2)] samr_GroupInfoAll all2;
} samr_GroupInfo;
NTSTATUS samr_QueryGroupInfo(
@@ -456,24 +448,15 @@
/************************/
/* Function 0x19 */
- /*
- this isn't really valid IDL, but it does work. I suspect
- I need to do some more pidl work to get this really right
- */
typedef struct {
uint32 count;
- uint32 v[count];
- } samr_intArray;
-
- typedef struct {
- samr_intArray *rids;
- samr_intArray *unknown7;
+ [size_is(count)] uint32 *rids;
+ [size_is(count)] uint32 *unknown;
} samr_ridArray;
NTSTATUS samr_QueryGroupMember(
[in,ref] policy_handle *group_handle,
- [out] uint32 *count,
- [out] samr_ridArray rids
+ [out] samr_ridArray *rids
);
diff --git a/source4/torture/rpc/samr.c b/source4/torture/rpc/samr.c
index ac09a346f6..0c78d9e51c 100644
--- a/source4/torture/rpc/samr.c
+++ b/source4/torture/rpc/samr.c
@@ -1653,7 +1653,7 @@ static BOOL test_QueryGroupInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
{
NTSTATUS status;
struct samr_QueryGroupInfo r;
- uint16_t levels[] = {1, 2, 3, 4};
+ uint16_t levels[] = {1, 2, 3, 4, 5};
int i;
BOOL ret = True;
@@ -1674,6 +1674,26 @@ static BOOL test_QueryGroupInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
return ret;
}
+static BOOL test_QueryGroupMember(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+ struct policy_handle *handle)
+{
+ NTSTATUS status;
+ struct samr_QueryGroupMember r;
+ BOOL ret = True;
+
+ printf("Testing QueryGroupMember\n");
+
+ r.in.group_handle = handle;
+
+ status = dcerpc_samr_QueryGroupMember(p, mem_ctx, &r);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("QueryGroupInfo failed - %s\n", nt_errstr(status));
+ ret = False;
+ }
+
+ return ret;
+}
+
static BOOL test_SetGroupInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *handle)
@@ -1871,6 +1891,10 @@ static BOOL test_OpenGroup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
ret = False;
}
+ if (!test_QueryGroupMember(p, mem_ctx, &group_handle)) {
+ ret = False;
+ }
+
if (!test_Close(p, mem_ctx, &group_handle)) {
ret = False;
}