summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/include/proto.h11
-rw-r--r--source3/include/rpc_samr.h2
-rw-r--r--source3/rpc_client/cli_samr.c2
-rw-r--r--source3/rpc_parse/parse_samr.c7
-rw-r--r--source3/rpc_server/srv_samr.c8
-rw-r--r--source3/rpcclient/cmd_samr.c88
-rw-r--r--source3/rpcclient/display.c83
7 files changed, 153 insertions, 48 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 74d81ad7f1..82984e8f92 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -2551,7 +2551,8 @@ BOOL make_samr_q_open_group(SAMR_Q_OPEN_GROUP *q_c,
BOOL samr_io_q_open_group(char *desc, SAMR_Q_OPEN_GROUP *q_u, prs_struct *ps, int depth);
BOOL samr_io_r_open_group(char *desc, SAMR_R_OPEN_GROUP *r_u, prs_struct *ps, int depth);
BOOL make_samr_group_info1(GROUP_INFO1 *gr1,
- char *acct_name, char *acct_desc);
+ char *acct_name, char *acct_desc,
+ uint32 num_members);
BOOL samr_io_group_info1(char *desc, GROUP_INFO1 *gr1, prs_struct *ps, int depth);
BOOL make_samr_group_info4(GROUP_INFO4 *gr4, const char *acct_desc);
BOOL samr_io_group_info4(char *desc, GROUP_INFO4 *gr4, prs_struct *ps, int depth);
@@ -3251,8 +3252,9 @@ BOOL sam_query_groupmem(struct cli_state *cli, uint16 fnum,
uint32 msrpc_sam_enum_groups(struct client_info *info,
struct acct_info **sam,
uint32 *num_sam_entries,
- void(*grp_mem_fn)(uint32, char*, uint32, uint32*, char**, uint32*),
- BOOL request_group_info);
+ void (*grp_fn)(char*, DOM_SID*, uint32, char*),
+ void (*grp_inf_fn)(char*, DOM_SID*, uint32, GROUP_INFO_CTR *),
+ void(*grp_mem_fn)(char*, DOM_SID*, uint32, char*, uint32, uint32*, char**, uint32*));
void cmd_sam_enum_groups(struct client_info *info);
/*The following definitions come from rpcclient/cmd_srvsvc.c */
@@ -3340,6 +3342,9 @@ void display_alias_rid_info(FILE *out_hnd, enum action_type action,
void display_group_members(FILE *out_hnd, enum action_type action,
uint32 num_mem, char **name, uint32 *type);
void display_group_info1(FILE *out_hnd, enum action_type action, GROUP_INFO1 *info1);
+void display_group_info4(FILE *out_hnd, enum action_type action, GROUP_INFO4 *info4);
+void display_group_info_ctr(FILE *out_hnd, enum action_type action,
+ GROUP_INFO_CTR *ctr);
void display_group_rid_info(FILE *out_hnd, enum action_type action,
uint32 num_gids, DOM_GID *gid);
void display_alias_name_info(FILE *out_hnd, enum action_type action,
diff --git a/source3/include/rpc_samr.h b/source3/include/rpc_samr.h
index afe104a93a..87fc17cda9 100644
--- a/source3/include/rpc_samr.h
+++ b/source3/include/rpc_samr.h
@@ -944,7 +944,7 @@ typedef struct samr_group_info1
UNIHDR hdr_acct_name;
uint32 unknown_1; /* 0x0000 0003 - number of group members? */
- uint32 unknown_2; /* 0x0000 0001 - number of group members? */
+ uint32 num_members; /* 0x0000 0001 - number of group members? */
UNIHDR hdr_acct_desc;
diff --git a/source3/rpc_client/cli_samr.c b/source3/rpc_client/cli_samr.c
index 41bdd0e3d1..ccf76eb943 100644
--- a/source3/rpc_client/cli_samr.c
+++ b/source3/rpc_client/cli_samr.c
@@ -358,7 +358,7 @@ BOOL get_samr_query_groupinfo(struct cli_state *cli, uint16 fnum,
/* send open domain (on group sid) */
if (!samr_open_group(cli, fnum,
pol_open_domain,
- 0x00000010, group_rid, &pol_open_group))
+ 0x02000000, group_rid, &pol_open_group))
{
return False;
}
diff --git a/source3/rpc_parse/parse_samr.c b/source3/rpc_parse/parse_samr.c
index e111484676..74386e7f99 100644
--- a/source3/rpc_parse/parse_samr.c
+++ b/source3/rpc_parse/parse_samr.c
@@ -1904,7 +1904,8 @@ BOOL samr_io_r_open_group(char *desc, SAMR_R_OPEN_GROUP *r_u, prs_struct *ps, i
makes a GROUP_INFO1 structure.
********************************************************************/
BOOL make_samr_group_info1(GROUP_INFO1 *gr1,
- char *acct_name, char *acct_desc)
+ char *acct_name, char *acct_desc,
+ uint32 num_members)
{
int desc_len = acct_desc != NULL ? strlen(acct_desc) : 0;
int acct_len = acct_name != NULL ? strlen(acct_name) : 0;
@@ -1915,7 +1916,7 @@ BOOL make_samr_group_info1(GROUP_INFO1 *gr1,
make_uni_hdr(&(gr1->hdr_acct_name), acct_len);
gr1->unknown_1 = 0x3;
- gr1->unknown_2 = 0x3;
+ gr1->num_members = num_members;
make_uni_hdr(&(gr1->hdr_acct_desc), desc_len);
@@ -1941,7 +1942,7 @@ BOOL samr_io_group_info1(char *desc, GROUP_INFO1 *gr1, prs_struct *ps, int dept
smb_io_unihdr ("hdr_acct_name", &(gr1->hdr_acct_name) , ps, depth);
prs_uint32("unknown_1", ps, depth, &(gr1->unknown_1));
- prs_uint32("unknown_2", ps, depth, &(gr1->unknown_2));
+ prs_uint32("num_members", ps, depth, &(gr1->num_members));
smb_io_unihdr ("hdr_acct_desc", &(gr1->hdr_acct_desc) , ps, depth);
diff --git a/source3/rpc_server/srv_samr.c b/source3/rpc_server/srv_samr.c
index bfbeb5718c..7af69a2eb4 100644
--- a/source3/rpc_server/srv_samr.c
+++ b/source3/rpc_server/srv_samr.c
@@ -1136,15 +1136,15 @@ static void samr_reply_query_groupinfo(SAMR_Q_QUERY_GROUPINFO *q_u,
r_e.ptr = 1;
ctr.switch_value1 = 1;
make_samr_group_info1(&ctr.group.info1,
- "account name",
- "account description");
+ "fake account name",
+ "fake account description", 2);
}
else if (q_u->switch_level == 4)
{
r_e.ptr = 1;
ctr.switch_value1 = 4;
make_samr_group_info4(&ctr.group.info4,
- "account description");
+ "fake account description");
}
else
{
@@ -1198,7 +1198,7 @@ static void samr_reply_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_u,
{
r_e.ptr = 1;
ctr.switch_value1 = 3;
- make_samr_alias_info3(&ctr.alias.info3, "<account description>");
+ make_samr_alias_info3(&ctr.alias.info3, "<fake account description>");
}
else
{
diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c
index c2132aff63..9d80c4fa53 100644
--- a/source3/rpcclient/cmd_samr.c
+++ b/source3/rpcclient/cmd_samr.c
@@ -1220,25 +1220,6 @@ static void req_user_info(struct cli_state *cli, uint16 fnum,
}
}
-static void query_groupinfo(struct cli_state *cli, uint16 fnum,
- POLICY_HND *pol_dom,
- uint32 group_rid)
-{
- GROUP_INFO_CTR ctr;
-
- /* send group info query */
- if (get_samr_query_groupinfo(smb_cli, fnum,
- pol_dom,
- 1, group_rid, &ctr))
- {
-#if 0
- display_samr_groupinfo(out_hnd, ACTION_HEADER , &ctr);
- display_samr_groupinfo(out_hnd, ACTION_ENUMERATE, &ctr);
- display_samr_groupinfo(out_hnd, ACTION_FOOTER , &ctr);
-#endif
- }
-}
-
/****************************************************************************
SAM Query User Groups.
****************************************************************************/
@@ -2098,15 +2079,48 @@ BOOL sam_query_groupmem(struct cli_state *cli, uint16 fnum,
return res3;
}
-static void sam_display_group_members(uint32 group_rid, char *group_name,
+static void sam_display_group_info(char *domain, DOM_SID *sid,
+ uint32 group_rid,
+ GROUP_INFO_CTR *ctr)
+{
+ display_group_info_ctr(out_hnd, ACTION_HEADER , ctr);
+ display_group_info_ctr(out_hnd, ACTION_ENUMERATE, ctr);
+ display_group_info_ctr(out_hnd, ACTION_FOOTER , ctr);
+}
+
+static void query_groupinfo(struct cli_state *cli, uint16 fnum,
+ POLICY_HND *pol_dom,
+ char *domain,
+ DOM_SID *sid,
+ uint32 group_rid,
+ void (*grp_inf)(char*, DOM_SID*, uint32, GROUP_INFO_CTR *))
+{
+ GROUP_INFO_CTR ctr;
+
+ /* send group info query */
+ if (get_samr_query_groupinfo(smb_cli, fnum,
+ pol_dom,
+ 1, /* info level */
+ group_rid, &ctr))
+ {
+ grp_inf(domain, sid, group_rid, &ctr);
+ }
+}
+
+static void sam_display_group(char *domain, DOM_SID *sid,
+ uint32 group_rid, char *group_name)
+{
+ report(out_hnd, "Group RID: %8x Group Name: %s\n",
+ group_rid, group_name);
+}
+
+static void sam_display_group_members(char *domain, DOM_SID *sid,
+ uint32 group_rid, char *group_name,
uint32 num_names,
uint32 *rid_mem,
char **name,
uint32 *type)
{
- report(out_hnd, "Group RID: %8x Group Name: %s\n",
- group_rid, group_name);
-
display_group_members(out_hnd, ACTION_HEADER , num_names, name, type);
display_group_members(out_hnd, ACTION_ENUMERATE, num_names, name, type);
display_group_members(out_hnd, ACTION_FOOTER , num_names, name, type);
@@ -2114,9 +2128,11 @@ static void sam_display_group_members(uint32 group_rid, char *group_name,
static void req_groupmem_info(struct cli_state *cli, uint16 fnum,
POLICY_HND *pol_dom,
+ char *domain,
+ DOM_SID *sid,
uint32 group_rid,
char *group_name,
- void(*act_fn)(uint32, char*, uint32, uint32*, char**, uint32*))
+ void(*act_fn)(char*, DOM_SID*, uint32, char*, uint32, uint32*, char**, uint32*))
{
uint32 num_names = 0;
char **name = NULL;
@@ -2127,7 +2143,9 @@ static void req_groupmem_info(struct cli_state *cli, uint16 fnum,
&num_names, &rid_mem, &name, &type))
{
- act_fn(group_rid, group_name, num_names, rid_mem, name, type);
+ act_fn(domain, sid,
+ group_rid, group_name,
+ num_names, rid_mem, name, type);
free_char_array(num_names, name);
if (type != NULL)
@@ -2143,8 +2161,9 @@ SAM groups query.
uint32 msrpc_sam_enum_groups(struct client_info *info,
struct acct_info **sam,
uint32 *num_sam_entries,
- void(*grp_mem_fn)(uint32, char*, uint32, uint32*, char**, uint32*),
- BOOL request_group_info)
+ void (*grp_fn)(char*, DOM_SID*, uint32, char*),
+ void (*grp_inf_fn)(char*, DOM_SID*, uint32, GROUP_INFO_CTR *),
+ void(*grp_mem_fn)(char*, DOM_SID*, uint32, char*, uint32, uint32*, char**, uint32*))
{
uint16 fnum;
fstring srv_name;
@@ -2215,13 +2234,19 @@ uint32 msrpc_sam_enum_groups(struct client_info *info,
uint32 group_rid = (*sam)[group_idx].rid;
char *group_name = (*sam)[group_idx].acct_name;
- if (request_group_info)
+ grp_fn(domain, &sid1, group_rid, group_name);
+
+ if (grp_inf_fn)
{
- query_groupinfo(smb_cli, fnum, &pol_dom, group_rid);
+ query_groupinfo(smb_cli, fnum, &pol_dom,
+ domain, &sid1,
+ group_rid,
+ grp_inf_fn);
}
if (grp_mem_fn != NULL)
{
req_groupmem_info(smb_cli, fnum, &pol_dom,
+ domain, &sid1,
group_rid, group_name,
grp_mem_fn);
}
@@ -2275,8 +2300,9 @@ void cmd_sam_enum_groups(struct client_info *info)
}
msrpc_sam_enum_groups(info, &sam, &num_sam_entries,
- request_group_info ? sam_display_group_members : NULL,
- request_member_info);
+ sam_display_group,
+ request_group_info ? sam_display_group_info : NULL,
+ request_member_info ? sam_display_group_members : NULL);
if (sam != NULL)
{
diff --git a/source3/rpcclient/display.c b/source3/rpcclient/display.c
index 9b8a8154f3..db5208b33c 100644
--- a/source3/rpcclient/display.c
+++ b/source3/rpcclient/display.c
@@ -1215,8 +1215,6 @@ void display_group_members(FILE *out_hnd, enum action_type action,
}
-#if 0
-
/****************************************************************************
display group info
****************************************************************************/
@@ -1231,9 +1229,85 @@ void display_group_info1(FILE *out_hnd, enum action_type action, GROUP_INFO1 *in
}
case ACTION_ENUMERATE:
{
- int i;
+ fstring temp;
+
+ unistr2_to_ascii(temp, &info1->uni_acct_name, sizeof(temp)-1);
+ fprintf(out_hnd, "\tGroup Name:\t%s\n", temp);
+ unistr2_to_ascii(temp, &info1->uni_acct_desc, sizeof(temp)-1);
+ fprintf(out_hnd, "\tDescription:\t%s\n", temp);
+ fprintf(out_hnd, "\tunk1:%d\n", info1->unknown_1);
+ fprintf(out_hnd, "\tNum Members:%d\n", info1->num_members);
+ break;
+ }
+ case ACTION_FOOTER:
+ {
+ break;
+ }
+ }
+}
+
+/****************************************************************************
+ display group info
+ ****************************************************************************/
+void display_group_info4(FILE *out_hnd, enum action_type action, GROUP_INFO4 *info4)
+
+{
+ switch (action)
+ {
+ case ACTION_HEADER:
+ {
+ break;
+ }
+ case ACTION_ENUMERATE:
+ {
+ fstring desc;
+
+ unistr2_to_ascii(desc, &info4->uni_acct_desc, sizeof(desc)-1);
+ fprintf(out_hnd, "\tGroup Description:%s\n",
+ desc);
+ break;
+ }
+ case ACTION_FOOTER:
+ {
+ break;
+ }
+ }
+}
+
+/****************************************************************************
+ display sam sync structure
+ ****************************************************************************/
+void display_group_info_ctr(FILE *out_hnd, enum action_type action,
+ GROUP_INFO_CTR *ctr)
+{
+ switch (action)
+ {
+ case ACTION_HEADER:
+ {
+ fprintf(out_hnd, "\tSAM Group Info\n");
+ fprintf(out_hnd, "\t--------------\n");
- fprintf(out_hnd, "\tGroup Name:\t%s\tDescription:\t%s\tunk1:\t%sunk2:%s\n",
+ break;
+ }
+ case ACTION_ENUMERATE:
+ {
+ switch (ctr->switch_value1)
+ {
+ case 1:
+ {
+ display_group_info1(out_hnd, ACTION_HEADER , &ctr->group.info1);
+ display_group_info1(out_hnd, ACTION_ENUMERATE, &ctr->group.info1);
+ display_group_info1(out_hnd, ACTION_FOOTER , &ctr->group.info1);
+ break;
+ }
+ case 4:
+ {
+ display_group_info4(out_hnd, ACTION_HEADER , &ctr->group.info4);
+ display_group_info4(out_hnd, ACTION_ENUMERATE, &ctr->group.info4);
+ display_group_info4(out_hnd, ACTION_FOOTER , &ctr->group.info4);
+ break;
+ }
+ }
break;
}
case ACTION_FOOTER:
@@ -1243,7 +1317,6 @@ void display_group_info1(FILE *out_hnd, enum action_type action, GROUP_INFO1 *in
}
}
}
-#endif
/****************************************************************************
display group rid info