📄 cmd_samr.c
字号:
if (got_connect_pol) rpccli_samr_close(cli, mem_ctx, &connect_pol); return result;}/* Enumerate alias groups */static NTSTATUS cmd_samr_enum_als_groups(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; uint32 start_idx, size, num_als_groups, i; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; struct acct_info *als_groups; BOOL got_connect_pol = False, got_domain_pol = False; if ((argc < 2) || (argc > 3)) { printf("Usage: %s builtin|domain [access mask]\n", argv[0]); return NT_STATUS_OK; } if (argc > 2) sscanf(argv[2], "%x", &access_mask); /* Get sam policy handle */ result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, &connect_pol); if (!NT_STATUS_IS_OK(result)) goto done; got_connect_pol = True; /* Get domain policy handle */ if (StrCaseCmp(argv[1], "domain")==0) result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol, access_mask, &domain_sid, &domain_pol); else if (StrCaseCmp(argv[1], "builtin")==0) result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol, access_mask, &global_sid_Builtin, &domain_pol); else return NT_STATUS_OK; if (!NT_STATUS_IS_OK(result)) goto done; got_domain_pol = True; /* Enumerate alias groups */ start_idx = 0; size = 0xffff; /* Number of groups to retrieve */ do { result = rpccli_samr_enum_als_groups( cli, mem_ctx, &domain_pol, &start_idx, size, &als_groups, &num_als_groups); if (NT_STATUS_IS_OK(result) || NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES)) { for (i = 0; i < num_als_groups; i++) printf("group:[%s] rid:[0x%x]\n", als_groups[i].acct_name, als_groups[i].rid); } } while (NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES)); done: if (got_domain_pol) rpccli_samr_close(cli, mem_ctx, &domain_pol); if (got_connect_pol) rpccli_samr_close(cli, mem_ctx, &connect_pol); return result;}/* Query alias membership */static NTSTATUS cmd_samr_query_aliasmem(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, alias_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; uint32 alias_rid, num_members, i; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; DOM_SID *alias_sids; if ((argc < 3) || (argc > 4)) { printf("Usage: %s builtin|domain rid [access mask]\n", argv[0]); return NT_STATUS_OK; } sscanf(argv[2], "%i", &alias_rid); if (argc > 3) sscanf(argv[3], "%x", &access_mask); /* Open SAMR handle */ result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, &connect_pol); if (!NT_STATUS_IS_OK(result)) goto done; /* Open handle on domain */ if (StrCaseCmp(argv[1], "domain")==0) result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol, MAXIMUM_ALLOWED_ACCESS, &domain_sid, &domain_pol); else if (StrCaseCmp(argv[1], "builtin")==0) result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol, MAXIMUM_ALLOWED_ACCESS, &global_sid_Builtin, &domain_pol); else return NT_STATUS_OK; if (!NT_STATUS_IS_OK(result)) goto done; /* Open handle on alias */ result = rpccli_samr_open_alias(cli, mem_ctx, &domain_pol, access_mask, alias_rid, &alias_pol); if (!NT_STATUS_IS_OK(result)) goto done; result = rpccli_samr_query_aliasmem(cli, mem_ctx, &alias_pol, &num_members, &alias_sids); if (!NT_STATUS_IS_OK(result)) goto done; for (i = 0; i < num_members; i++) { fstring sid_str; sid_to_string(sid_str, &alias_sids[i]); printf("\tsid:[%s]\n", sid_str); } rpccli_samr_close(cli, mem_ctx, &alias_pol); rpccli_samr_close(cli, mem_ctx, &domain_pol); rpccli_samr_close(cli, mem_ctx, &connect_pol); done: return result;}/* Query display info */static NTSTATUS cmd_samr_query_dispinfo(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; uint32 start_idx=0, max_entries=250, max_size = 0xffff, num_entries, i; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; uint32 info_level = 1; SAM_DISPINFO_CTR ctr; SAM_DISPINFO_1 info1; SAM_DISPINFO_2 info2; SAM_DISPINFO_3 info3; SAM_DISPINFO_4 info4; SAM_DISPINFO_5 info5; int loop_count = 0; BOOL got_params = False; /* Use get_query_dispinfo_params() or not? */ if (argc > 5) { printf("Usage: %s [info level] [start index] [max entries] [max size] [access mask]\n", argv[0]); return NT_STATUS_OK; } if (argc >= 2) sscanf(argv[1], "%i", &info_level); if (argc >= 3) sscanf(argv[2], "%i", &start_idx); if (argc >= 4) { sscanf(argv[3], "%i", &max_entries); got_params = True; } if (argc >= 5) { sscanf(argv[4], "%i", &max_size); got_params = True; } if (argc >= 6) sscanf(argv[5], "%x", &access_mask); /* Get sam policy handle */ result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, &connect_pol); if (!NT_STATUS_IS_OK(result)) goto done; /* Get domain policy handle */ result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol, access_mask, &domain_sid, &domain_pol); if (!NT_STATUS_IS_OK(result)) goto done; /* Query display info */ ZERO_STRUCT(ctr); ZERO_STRUCT(info1); switch (info_level) { case 1: ZERO_STRUCT(info1); ctr.sam.info1 = &info1; break; case 2: ZERO_STRUCT(info2); ctr.sam.info2 = &info2; break; case 3: ZERO_STRUCT(info3); ctr.sam.info3 = &info3; break; case 4: ZERO_STRUCT(info4); ctr.sam.info4 = &info4; break; case 5: ZERO_STRUCT(info5); ctr.sam.info5 = &info5; break; } do { if (!got_params) get_query_dispinfo_params( loop_count, &max_entries, &max_size); result = rpccli_samr_query_dispinfo(cli, mem_ctx, &domain_pol, &start_idx, info_level, &num_entries, max_entries, max_size, &ctr); loop_count++; if (NT_STATUS_IS_ERR(result)) break; if (num_entries == 0) break; for (i = 0; i < num_entries; i++) { switch (info_level) { case 1: display_sam_info_1(&ctr.sam.info1->sam[i], &ctr.sam.info1->str[i]); break; case 2: display_sam_info_2(&ctr.sam.info2->sam[i], &ctr.sam.info2->str[i]); break; case 3: display_sam_info_3(&ctr.sam.info3->sam[i], &ctr.sam.info3->str[i]); break; case 4: display_sam_info_4(&ctr.sam.info4->sam[i], &ctr.sam.info4->str[i]); break; case 5: display_sam_info_5(&ctr.sam.info5->sam[i], &ctr.sam.info5->str[i]); break; } } } while ( NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)); rpccli_samr_close(cli, mem_ctx, &domain_pol); rpccli_samr_close(cli, mem_ctx, &connect_pol); done: return result;}/* Query domain info */static NTSTATUS cmd_samr_query_dominfo(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; uint32 switch_level = 2; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; SAM_UNK_CTR ctr; if (argc > 2) { printf("Usage: %s [info level] [access mask]\n", argv[0]); return NT_STATUS_OK; } if (argc > 1) sscanf(argv[1], "%i", &switch_level); if (argc > 2) sscanf(argv[2], "%x", &access_mask); /* Get sam policy handle */ result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, &connect_pol); if (!NT_STATUS_IS_OK(result)) goto done; /* Get domain policy handle */ result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol, access_mask, &domain_sid, &domain_pol); if (!NT_STATUS_IS_OK(result)) goto done; /* Query domain info */ result = rpccli_samr_query_dom_info(cli, mem_ctx, &domain_pol, switch_level, &ctr); if (!NT_STATUS_IS_OK(result)) goto done; /* Display domain info */ switch (switch_level) { case 1: display_sam_unk_info_1(&ctr.info.inf1); break; case 2: display_sam_unk_info_2(&ctr.info.inf2); break; case 7: display_sam_unk_info_7(&ctr.info.inf7); break; case 8: display_sam_unk_info_8(&ctr.info.inf8); break; case 12: display_sam_unk_info_12(&ctr.info.inf12); break; default: printf("cannot display domain info for switch value %d\n", switch_level); break; } done: rpccli_samr_close(cli, mem_ctx, &domain_pol); rpccli_samr_close(cli, mem_ctx, &connect_pol); return result;}/* Create domain user */static NTSTATUS cmd_samr_create_dom_user(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, user_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; const char *acct_name; uint16 acb_info; uint32 unknown, user_rid; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; if ((argc < 2) || (argc > 3)) { printf("Usage: %s username [access mask]\n", argv[0]); return NT_STATUS_OK; } acct_name = argv[1]; if (argc > 2) sscanf(argv[2], "%x", &access_mask); /* Get sam policy handle */ result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, &connect_pol); if (!NT_STATUS_IS_OK(result)) goto done; /* Get domain policy handle */ result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol, access_mask, &domain_sid, &domain_pol); if (!NT_STATUS_IS_OK(result)) goto done; /* Create domain user */ acb_info = ACB_NORMAL; unknown = 0xe005000b; /* No idea what this is - a permission mask? */ result = rpccli_samr_create_dom_user(cli, mem_ctx, &domain_pol, acct_name, acb_info, unknown, &user_pol, &user_rid); if (!NT_STATUS_IS_OK(result)) goto done; result = rpccli_samr_close(cli, mem_ctx, &user_pol); if (!NT_STATUS_IS_OK(result)) goto done; result = rpccli_samr_close(cli, mem_ctx, &domain_pol); if (!NT_STATUS_IS_OK(result)) goto done; result = rpccli_samr_close(cli, mem_ctx, &connect_pol); if (!NT_STATUS_IS_OK(result)) goto done; done: return result;}/* Create domain group */static NTSTATUS cmd_samr_create_dom_group(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND connect_pol, domain_pol, group_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; const char *grp_name; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; if ((argc < 2) || (argc > 3)) { printf("Usage: %s groupname [access mask]\n", argv[0]); return NT_STATUS_OK; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -