Loading source3/include/rpc_samr.h +9 −0 Original line number Diff line number Diff line Loading @@ -1068,6 +1068,14 @@ typedef struct samr_group_info1 } GROUP_INFO1; typedef struct samr_group_info2 { uint16 level; UNIHDR hdr_acct_name; UNISTR2 uni_acct_name; } GROUP_INFO2; typedef struct samr_group_info3 { uint32 unknown_1; /* 0x0000 0003 - number of group members? */ Loading @@ -1090,6 +1098,7 @@ typedef struct group_info_ctr union { GROUP_INFO1 info1; GROUP_INFO2 info2; GROUP_INFO3 info3; GROUP_INFO4 info4; Loading source3/rpc_parse/parse_samr.c +46 −0 Original line number Diff line number Diff line Loading @@ -2204,12 +2204,17 @@ reads or writes a structure. BOOL samr_io_group_info1(const char *desc, GROUP_INFO1 * gr1, prs_struct *ps, int depth) { uint16 dummy = 1; if (gr1 == NULL) return False; prs_debug(ps, depth, desc, "samr_io_group_info1"); depth++; if(!prs_uint16("level", ps, depth, &dummy)) return False; if(!prs_align(ps)) return False; Loading @@ -2235,6 +2240,43 @@ BOOL samr_io_group_info1(const char *desc, GROUP_INFO1 * gr1, return True; } /******************************************************************* inits a GROUP_INFO2 structure. ********************************************************************/ void init_samr_group_info2(GROUP_INFO2 * gr2, const char *acct_name) { DEBUG(5, ("init_samr_group_info2\n")); gr2->level = 2; init_unistr2(&gr2->uni_acct_name, acct_name, UNI_FLAGS_NONE); init_uni_hdr(&gr2->hdr_acct_name, &gr2->uni_acct_name); } /******************************************************************* reads or writes a structure. ********************************************************************/ BOOL samr_io_group_info2(const char *desc, GROUP_INFO2 *gr2, prs_struct *ps, int depth) { if (gr2 == NULL) return False; prs_debug(ps, depth, desc, "samr_io_group_info2"); depth++; if(!prs_uint16("hdr_level", ps, depth, &gr2->level)) return False; if(!smb_io_unihdr("hdr_acct_name", &gr2->hdr_acct_name, ps, depth)) return False; if(!smb_io_unistr2("uni_acct_name", &gr2->uni_acct_name, gr2->hdr_acct_name.buffer, ps, depth)) return False; return True; } /******************************************************************* inits a GROUP_INFO3 structure. ********************************************************************/ Loading Loading @@ -2328,6 +2370,10 @@ static BOOL samr_group_info_ctr(const char *desc, GROUP_INFO_CTR **ctr, if(!samr_io_group_info1("group_info1", &(*ctr)->group.info1, ps, depth)) return False; break; case 2: if(!samr_io_group_info2("group_info2", &(*ctr)->group.info2, ps, depth)) return False; break; case 3: if(!samr_io_group_info3("group_info3", &(*ctr)->group.info3, ps, depth)) return False; Loading source3/utils/net_rpc.c +78 −0 Original line number Diff line number Diff line Loading @@ -2209,6 +2209,83 @@ static int rpc_group_members(int argc, const char **argv) argc, argv); } static NTSTATUS rpc_group_rename_internals(const DOM_SID *domain_sid, const char *domain_name, struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { NTSTATUS result; POLICY_HND connect_pol, domain_pol, group_pol; uint32 num_rids, *rids, *rid_types; GROUP_INFO_CTR ctr; if (argc != 2) { d_printf("Usage: 'net rpc group rename group newname'\n"); return NT_STATUS_UNSUCCESSFUL; } /* Get sam policy handle */ result = cli_samr_connect(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, &connect_pol); if (!NT_STATUS_IS_OK(result)) return result; /* Get domain policy handle */ result = cli_samr_open_domain(cli, mem_ctx, &connect_pol, MAXIMUM_ALLOWED_ACCESS, domain_sid, &domain_pol); if (!NT_STATUS_IS_OK(result)) return result; result = cli_samr_lookup_names(cli, mem_ctx, &domain_pol, 1000, 1, argv, &num_rids, &rids, &rid_types); if (num_rids != 1) { d_printf("Couldn't find group %s\n", argv[0]); return result; } if (rid_types[0] != SID_NAME_DOM_GRP) { d_printf("Can only rename domain groups\n"); return NT_STATUS_UNSUCCESSFUL; } result = cli_samr_open_group(cli, mem_ctx, &domain_pol, MAXIMUM_ALLOWED_ACCESS, rids[0], &group_pol); if (!NT_STATUS_IS_OK(result)) return result; ZERO_STRUCT(ctr); ctr.switch_value1 = 2; init_samr_group_info2(&ctr.group.info2, argv[1]); result = cli_samr_set_groupinfo(cli, mem_ctx, &group_pol, &ctr); if (!NT_STATUS_IS_OK(result)) return result; return NT_STATUS_NO_SUCH_GROUP; } static int rpc_group_rename(int argc, const char **argv) { if (argc != 2) { return rpc_group_usage(argc, argv); } return run_rpc_command(NULL, PI_SAMR, 0, rpc_group_rename_internals, argc, argv); } /** * 'net rpc group' entrypoint. * @param argc Standard main() style argc Loading @@ -2225,6 +2302,7 @@ int net_rpc_group(int argc, const char **argv) {"delmem", rpc_group_delmem}, {"list", rpc_group_list}, {"members", rpc_group_members}, {"rename", rpc_group_rename}, {NULL, NULL} }; Loading Loading
source3/include/rpc_samr.h +9 −0 Original line number Diff line number Diff line Loading @@ -1068,6 +1068,14 @@ typedef struct samr_group_info1 } GROUP_INFO1; typedef struct samr_group_info2 { uint16 level; UNIHDR hdr_acct_name; UNISTR2 uni_acct_name; } GROUP_INFO2; typedef struct samr_group_info3 { uint32 unknown_1; /* 0x0000 0003 - number of group members? */ Loading @@ -1090,6 +1098,7 @@ typedef struct group_info_ctr union { GROUP_INFO1 info1; GROUP_INFO2 info2; GROUP_INFO3 info3; GROUP_INFO4 info4; Loading
source3/rpc_parse/parse_samr.c +46 −0 Original line number Diff line number Diff line Loading @@ -2204,12 +2204,17 @@ reads or writes a structure. BOOL samr_io_group_info1(const char *desc, GROUP_INFO1 * gr1, prs_struct *ps, int depth) { uint16 dummy = 1; if (gr1 == NULL) return False; prs_debug(ps, depth, desc, "samr_io_group_info1"); depth++; if(!prs_uint16("level", ps, depth, &dummy)) return False; if(!prs_align(ps)) return False; Loading @@ -2235,6 +2240,43 @@ BOOL samr_io_group_info1(const char *desc, GROUP_INFO1 * gr1, return True; } /******************************************************************* inits a GROUP_INFO2 structure. ********************************************************************/ void init_samr_group_info2(GROUP_INFO2 * gr2, const char *acct_name) { DEBUG(5, ("init_samr_group_info2\n")); gr2->level = 2; init_unistr2(&gr2->uni_acct_name, acct_name, UNI_FLAGS_NONE); init_uni_hdr(&gr2->hdr_acct_name, &gr2->uni_acct_name); } /******************************************************************* reads or writes a structure. ********************************************************************/ BOOL samr_io_group_info2(const char *desc, GROUP_INFO2 *gr2, prs_struct *ps, int depth) { if (gr2 == NULL) return False; prs_debug(ps, depth, desc, "samr_io_group_info2"); depth++; if(!prs_uint16("hdr_level", ps, depth, &gr2->level)) return False; if(!smb_io_unihdr("hdr_acct_name", &gr2->hdr_acct_name, ps, depth)) return False; if(!smb_io_unistr2("uni_acct_name", &gr2->uni_acct_name, gr2->hdr_acct_name.buffer, ps, depth)) return False; return True; } /******************************************************************* inits a GROUP_INFO3 structure. ********************************************************************/ Loading Loading @@ -2328,6 +2370,10 @@ static BOOL samr_group_info_ctr(const char *desc, GROUP_INFO_CTR **ctr, if(!samr_io_group_info1("group_info1", &(*ctr)->group.info1, ps, depth)) return False; break; case 2: if(!samr_io_group_info2("group_info2", &(*ctr)->group.info2, ps, depth)) return False; break; case 3: if(!samr_io_group_info3("group_info3", &(*ctr)->group.info3, ps, depth)) return False; Loading
source3/utils/net_rpc.c +78 −0 Original line number Diff line number Diff line Loading @@ -2209,6 +2209,83 @@ static int rpc_group_members(int argc, const char **argv) argc, argv); } static NTSTATUS rpc_group_rename_internals(const DOM_SID *domain_sid, const char *domain_name, struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { NTSTATUS result; POLICY_HND connect_pol, domain_pol, group_pol; uint32 num_rids, *rids, *rid_types; GROUP_INFO_CTR ctr; if (argc != 2) { d_printf("Usage: 'net rpc group rename group newname'\n"); return NT_STATUS_UNSUCCESSFUL; } /* Get sam policy handle */ result = cli_samr_connect(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, &connect_pol); if (!NT_STATUS_IS_OK(result)) return result; /* Get domain policy handle */ result = cli_samr_open_domain(cli, mem_ctx, &connect_pol, MAXIMUM_ALLOWED_ACCESS, domain_sid, &domain_pol); if (!NT_STATUS_IS_OK(result)) return result; result = cli_samr_lookup_names(cli, mem_ctx, &domain_pol, 1000, 1, argv, &num_rids, &rids, &rid_types); if (num_rids != 1) { d_printf("Couldn't find group %s\n", argv[0]); return result; } if (rid_types[0] != SID_NAME_DOM_GRP) { d_printf("Can only rename domain groups\n"); return NT_STATUS_UNSUCCESSFUL; } result = cli_samr_open_group(cli, mem_ctx, &domain_pol, MAXIMUM_ALLOWED_ACCESS, rids[0], &group_pol); if (!NT_STATUS_IS_OK(result)) return result; ZERO_STRUCT(ctr); ctr.switch_value1 = 2; init_samr_group_info2(&ctr.group.info2, argv[1]); result = cli_samr_set_groupinfo(cli, mem_ctx, &group_pol, &ctr); if (!NT_STATUS_IS_OK(result)) return result; return NT_STATUS_NO_SUCH_GROUP; } static int rpc_group_rename(int argc, const char **argv) { if (argc != 2) { return rpc_group_usage(argc, argv); } return run_rpc_command(NULL, PI_SAMR, 0, rpc_group_rename_internals, argc, argv); } /** * 'net rpc group' entrypoint. * @param argc Standard main() style argc Loading @@ -2225,6 +2302,7 @@ int net_rpc_group(int argc, const char **argv) {"delmem", rpc_group_delmem}, {"list", rpc_group_list}, {"members", rpc_group_members}, {"rename", rpc_group_rename}, {NULL, NULL} }; Loading