📄 cmd_samr.c
字号:
/* Unix SMB/CIFS implementation. RPC pipe client Copyright (C) Andrew Tridgell 1992-2000, Copyright (C) Luke Kenneth Casson Leighton 1996-2000, Copyright (C) Elrond 2000, Copyright (C) Tim Potter 2000 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "includes.h"#include "rpcclient.h"extern DOM_SID domain_sid;/**************************************************************************** display sam_user_info_7 structure ****************************************************************************/static void display_sam_user_info_7(SAM_USER_INFO_7 *usr){ fstring temp; unistr2_to_ascii(temp, &usr->uni_name, sizeof(temp)-1); printf("\tUser Name :\t%s\n", temp);}/**************************************************************************** display sam_user_info_9 structure ****************************************************************************/static void display_sam_user_info_9(SAM_USER_INFO_9 *usr){ printf("\tPrimary group RID :\tox%x\n", usr->rid_group);}/**************************************************************************** display sam_user_info_21 structure ****************************************************************************/static void display_sam_user_info_21(SAM_USER_INFO_21 *usr){ fstring temp; unistr2_to_ascii(temp, &usr->uni_user_name, sizeof(temp)-1); printf("\tUser Name :\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_full_name, sizeof(temp)-1); printf("\tFull Name :\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_home_dir, sizeof(temp)-1); printf("\tHome Drive :\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_dir_drive, sizeof(temp)-1); printf("\tDir Drive :\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_profile_path, sizeof(temp)-1); printf("\tProfile Path:\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_logon_script, sizeof(temp)-1); printf("\tLogon Script:\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_acct_desc, sizeof(temp)-1); printf("\tDescription :\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_workstations, sizeof(temp)-1); printf("\tWorkstations:\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_unknown_str, sizeof(temp)-1); printf("\tUnknown Str :\t%s\n", temp); unistr2_to_ascii(temp, &usr->uni_munged_dial, sizeof(temp)-1); printf("\tRemote Dial :\t%s\n", temp); printf("\tLogon Time :\t%s\n", http_timestring(nt_time_to_unix(&usr->logon_time))); printf("\tLogoff Time :\t%s\n", http_timestring(nt_time_to_unix(&usr->logoff_time))); printf("\tKickoff Time :\t%s\n", http_timestring(nt_time_to_unix(&usr->kickoff_time))); printf("\tPassword last set Time :\t%s\n", http_timestring(nt_time_to_unix(&usr->pass_last_set_time))); printf("\tPassword can change Time :\t%s\n", http_timestring(nt_time_to_unix(&usr->pass_can_change_time))); printf("\tPassword must change Time:\t%s\n", http_timestring(nt_time_to_unix(&usr->pass_must_change_time))); printf("\tunknown_2[0..31]...\n"); /* user passwords? */ printf("\tuser_rid :\t0x%x\n" , usr->user_rid ); /* User ID */ printf("\tgroup_rid:\t0x%x\n" , usr->group_rid); /* Group ID */ printf("\tacb_info :\t0x%04x\n", usr->acb_info ); /* Account Control Info */ printf("\tfields_present:\t0x%08x\n", usr->fields_present); /* 0x00ff ffff */ printf("\tlogon_divs:\t%d\n", usr->logon_divs); /* 0x0000 00a8 which is 168 which is num hrs in a week */ printf("\tbad_password_count:\t0x%08x\n", usr->bad_password_count); printf("\tlogon_count:\t0x%08x\n", usr->logon_count); printf("\tpadding1[0..7]...\n"); if (usr->ptr_logon_hrs) { printf("\tlogon_hrs[0..%d]...\n", usr->logon_hrs.len); }}static const char *display_time(NTTIME nttime){ static fstring string; float high; float low; int sec; int days, hours, mins, secs; if (nttime.high==0 && nttime.low==0) return "Now"; if (nttime.high==0x80000000 && nttime.low==0) return "Never"; high = 65536; high = high/10000; high = high*65536; high = high/1000; high = high * (~nttime.high); low = ~nttime.low; low = low/(1000*1000*10); sec=high+low; days=sec/(60*60*24); hours=(sec - (days*60*60*24)) / (60*60); mins=(sec - (days*60*60*24) - (hours*60*60) ) / 60; secs=sec - (days*60*60*24) - (hours*60*60) - (mins*60); fstr_sprintf(string, "%u days, %u hours, %u minutes, %u seconds", days, hours, mins, secs); return (string);}static void display_sam_unk_info_1(SAM_UNK_INFO_1 *info1){ printf("Minimum password length:\t\t\t%d\n", info1->min_length_password); printf("Password uniqueness (remember x passwords):\t%d\n", info1->password_history); printf("Password Properties:\t\t\t\t0x%08x\n", info1->password_properties); if (info1->password_properties & DOMAIN_PASSWORD_COMPLEX) printf("\tDOMAIN_PASSWORD_COMPLEX\n"); if (info1->password_properties & DOMAIN_PASSWORD_NO_ANON_CHANGE) { printf("\tDOMAIN_PASSWORD_NO_ANON_CHANGE\n"); printf("users must open a session to change password "); } if (info1->password_properties & DOMAIN_PASSWORD_NO_CLEAR_CHANGE) printf("\tDOMAIN_PASSWORD_NO_CLEAR_CHANGE\n"); if (info1->password_properties & DOMAIN_LOCKOUT_ADMINS) printf("\tDOMAIN_LOCKOUT_ADMINS\n"); if (info1->password_properties & DOMAIN_PASSWORD_STORE_CLEARTEXT) printf("\tDOMAIN_PASSWORD_STORE_CLEARTEXT\n"); if (info1->password_properties & DOMAIN_REFUSE_PASSWORD_CHANGE) printf("\tDOMAIN_REFUSE_PASSWORD_CHANGE\n"); printf("password expire in:\t\t\t\t%s\n", display_time(info1->expire)); printf("Min password age (allow changing in x days):\t%s\n", display_time(info1->min_passwordage));}static void display_sam_unk_info_2(SAM_UNK_INFO_2 *info2){ fstring name; unistr2_to_ascii(name, &info2->uni_domain, sizeof(name) - 1); printf("Domain:\t\t%s\n", name); unistr2_to_ascii(name, &info2->uni_server, sizeof(name) - 1); printf("Server:\t\t%s\n", name); unistr2_to_ascii(name, &info2->uni_comment, sizeof(name) - 1); printf("Comment:\t%s\n", name); printf("Total Users:\t%d\n", info2->num_domain_usrs); printf("Total Groups:\t%d\n", info2->num_domain_grps); printf("Total Aliases:\t%d\n", info2->num_local_grps); printf("Sequence No:\t%d\n", info2->seq_num.low); printf("Force Logoff:\t%d\n", (int)nt_time_to_unix_abs(&info2->logout)); printf("Unknown 4:\t0x%x\n", info2->unknown_4); printf("Server Role:\t%s\n", server_role_str(info2->server_role)); printf("Unknown 6:\t0x%x\n", info2->unknown_6);}static void display_sam_unk_info_7(SAM_UNK_INFO_7 *info7){ printf("Server Role:\t%s\n", server_role_str(info7->server_role));}static void display_sam_unk_info_8(SAM_UNK_INFO_8 *info8){ printf("Sequence No:\t%d\n", info8->seq_num.low); printf("Domain Create Time:\t%s\n", http_timestring(nt_time_to_unix(&info8->domain_create_time)));}static void display_sam_unk_info_12(SAM_UNK_INFO_12 *info12){ printf("Bad password lockout duration: %s\n", display_time(info12->duration)); printf("Reset Lockout after: %s\n", display_time(info12->reset_count)); printf("Lockout after bad attempts: %d\n", info12->bad_attempt_lockout);}static void display_sam_info_1(SAM_ENTRY1 *e1, SAM_STR1 *s1){ fstring tmp; printf("index: 0x%x ", e1->user_idx); printf("RID: 0x%x ", e1->rid_user); printf("acb: 0x%x ", e1->acb_info); unistr2_to_ascii(tmp, &s1->uni_acct_name, sizeof(tmp)-1); printf("Account: %s\t", tmp); unistr2_to_ascii(tmp, &s1->uni_full_name, sizeof(tmp)-1); printf("Name: %s\t", tmp); unistr2_to_ascii(tmp, &s1->uni_acct_desc, sizeof(tmp)-1); printf("Desc: %s\n", tmp);}static void display_sam_info_2(SAM_ENTRY2 *e2, SAM_STR2 *s2){ fstring tmp; printf("index: 0x%x ", e2->user_idx); printf("RID: 0x%x ", e2->rid_user); printf("acb: 0x%x ", e2->acb_info); unistr2_to_ascii(tmp, &s2->uni_srv_name, sizeof(tmp)-1); printf("Account: %s\t", tmp); unistr2_to_ascii(tmp, &s2->uni_srv_desc, sizeof(tmp)-1); printf("Name: %s\n", tmp);}static void display_sam_info_3(SAM_ENTRY3 *e3, SAM_STR3 *s3){ fstring tmp; printf("index: 0x%x ", e3->grp_idx); printf("RID: 0x%x ", e3->rid_grp); printf("attr: 0x%x ", e3->attr); unistr2_to_ascii(tmp, &s3->uni_grp_name, sizeof(tmp)-1); printf("Account: %s\t", tmp); unistr2_to_ascii(tmp, &s3->uni_grp_desc, sizeof(tmp)-1); printf("Name: %s\n", tmp);}static void display_sam_info_4(SAM_ENTRY4 *e4, SAM_STR4 *s4){ int i; printf("index: %d ", e4->user_idx); printf("Account: "); for (i=0; i<s4->acct_name.str_str_len; i++) printf("%c", s4->acct_name.buffer[i]); printf("\n");}static void display_sam_info_5(SAM_ENTRY5 *e5, SAM_STR5 *s5){ int i; printf("index: 0x%x ", e5->grp_idx); printf("Account: "); for (i=0; i<s5->grp_name.str_str_len; i++) printf("%c", s5->grp_name.buffer[i]); printf("\n");}/**************************************************************************** Try samr_connect4 first, then samr_conenct if it fails ****************************************************************************/static NTSTATUS try_samr_connects(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, uint32 access_mask, POLICY_HND *connect_pol){ NTSTATUS result = NT_STATUS_UNSUCCESSFUL; result = rpccli_samr_connect4(cli, mem_ctx, access_mask, connect_pol); if (!NT_STATUS_IS_OK(result)) { result = rpccli_samr_connect(cli, mem_ctx, access_mask, connect_pol); } return result;}/********************************************************************** * Query user information */static NTSTATUS cmd_samr_query_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; uint32 info_level = 21; uint32 access_mask = MAXIMUM_ALLOWED_ACCESS; SAM_USERINFO_CTR *user_ctr; fstring server; uint32 user_rid; if ((argc < 2) || (argc > 4)) { printf("Usage: %s rid [info level] [access mask] \n", argv[0]); return NT_STATUS_OK; } user_rid = strtoul(argv[1], NULL, 10); if (argc > 2) sscanf(argv[2], "%i", &info_level); if (argc > 3) sscanf(argv[3], "%x", &access_mask); slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost); strupper_m(server); result = try_samr_connects(cli, mem_ctx, MAXIMUM_ALLOWED_ACCESS, &connect_pol); if (!NT_STATUS_IS_OK(result)) goto done; result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol, MAXIMUM_ALLOWED_ACCESS, &domain_sid, &domain_pol); if (!NT_STATUS_IS_OK(result)) goto done; result = rpccli_samr_open_user(cli, mem_ctx, &domain_pol, access_mask, user_rid, &user_pol); if (NT_STATUS_EQUAL(result, NT_STATUS_NO_SUCH_USER) && (user_rid == 0)) { /* Probably this was a user name, try lookupnames */ uint32 num_rids; uint32 *rids, *types; result = rpccli_samr_lookup_names(cli, mem_ctx, &domain_pol, 1000, 1, &argv[1], &num_rids, &rids, &types); if (NT_STATUS_IS_OK(result)) { result = rpccli_samr_open_user(cli, mem_ctx, &domain_pol, access_mask, rids[0], &user_pol); } } if (!NT_STATUS_IS_OK(result)) goto done; ZERO_STRUCT(user_ctr); result = rpccli_samr_query_userinfo(cli, mem_ctx, &user_pol, info_level, &user_ctr); if (!NT_STATUS_IS_OK(result)) goto done; switch (user_ctr->switch_value) { case 21: display_sam_user_info_21(user_ctr->info.id21); break; case 7: display_sam_user_info_7(user_ctr->info.id7); break; case 9: display_sam_user_info_9(user_ctr->info.id9); break; default: printf("Unsupported infolevel: %d\n", info_level); break; } rpccli_samr_close(cli, mem_ctx, &user_pol); rpccli_samr_close(cli, mem_ctx, &domain_pol); rpccli_samr_close(cli, mem_ctx, &connect_pol);done: return result;}/**************************************************************************** display group info ****************************************************************************/static void display_group_info1(GROUP_INFO1 *info1){ fstring temp; unistr2_to_ascii(temp, &info1->uni_acct_name, sizeof(temp)-1); printf("\tGroup Name:\t%s\n", temp); unistr2_to_ascii(temp, &info1->uni_acct_desc, sizeof(temp)-1); printf("\tDescription:\t%s\n", temp); printf("\tGroup Attribute:%d\n", info1->group_attr); printf("\tNum Members:%d\n", info1->num_members);}/**************************************************************************** display group info ****************************************************************************/static void display_group_info3(GROUP_INFO3 *info3){ printf("\tGroup Attribute:%d\n", info3->group_attr);}/**************************************************************************** display group info ****************************************************************************/static void display_group_info4(GROUP_INFO4 *info4){ fstring desc;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -