⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd_samr.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*    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 + -