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

📄 net.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Samba Unix/Linux SMB client library    Distributed SMB/CIFS Server Management Utility    Copyright (C) 2001 Steve French  (sfrench@us.ibm.com)   Copyright (C) 2001 Jim McDonough (jmcd@us.ibm.com)   Copyright (C) 2001 Andrew Tridgell (tridge@samba.org)   Copyright (C) 2001 Andrew Bartlett (abartlet@samba.org)   Originally written by Steve and Jim. Largely rewritten by tridge in   November 2001.   Reworked again by abartlet in December 2001   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.  */ /*****************************************************//*                                                   *//*   Distributed SMB/CIFS Server Management Utility  *//*                                                   *//*   The intent was to make the syntax similar       *//*   to the NET utility (first developed in DOS      *//*   with additional interesting & useful functions  *//*   added in later SMB server network operating     *//*   systems).                                       *//*                                                   *//*****************************************************/#include "includes.h"#include "utils/net.h"/***********************************************************************//* Beginning of internationalization section.  Translatable constants  *//* should be kept in this area and referenced in the rest of the code. *//*                                                                     *//* No functions, outside of Samba or LSB (Linux Standards Base) should *//* be used (if possible).                                              *//***********************************************************************/#define YES_STRING              "Yes"#define NO_STRING               "No"/************************************************************************************//*                       end of internationalization section                        *//************************************************************************************//* Yes, these buggers are globals.... */const char *opt_requester_name = NULL;const char *opt_host = NULL; const char *opt_password = NULL;const char *opt_user_name = NULL;BOOL opt_user_specified = False;const char *opt_workgroup = NULL;int opt_long_list_entries = 0;int opt_reboot = 0;int opt_force = 0;int opt_port = 0;int opt_verbose = 0;int opt_maxusers = -1;const char *opt_comment = "";const char *opt_container = NULL;int opt_flags = -1;int opt_timeout = 0;const char *opt_target_workgroup = NULL;int opt_machine_pass = 0;BOOL opt_localgroup = False;BOOL opt_domaingroup = False;const char *opt_newntname = "";int opt_rid = 0;int opt_acls = 0;int opt_attrs = 0;int opt_timestamps = 0;const char *opt_exclude = NULL;const char *opt_destination = NULL;BOOL opt_have_ip = False;struct in_addr opt_dest_ip;extern struct in_addr loopback_ip;extern BOOL AllowDebugChange;uint32 get_sec_channel_type(const char *param) {	if (!(param && *param)) {		return get_default_sec_channel();	} else {		if (strequal(param, "PDC")) {			return SEC_CHAN_BDC;		} else if (strequal(param, "BDC")) {			return SEC_CHAN_BDC;		} else if (strequal(param, "MEMBER")) {			return SEC_CHAN_WKSTA;#if 0					} else if (strequal(param, "DOMAIN")) {			return SEC_CHAN_DOMAIN;#endif		} else {			return get_default_sec_channel();		}	}}/*  run a function from a function table. If not found then  call the specified usage function */int net_run_function(int argc, const char **argv, struct functable *table, 		     int (*usage_fn)(int argc, const char **argv)){	int i;		if (argc < 1) {		d_printf("\nUsage: \n");		return usage_fn(argc, argv);	}	for (i=0; table[i].funcname; i++) {		if (StrCaseCmp(argv[0], table[i].funcname) == 0)			return table[i].fn(argc-1, argv+1);	}	d_fprintf(stderr, "No command: %s\n", argv[0]);	return usage_fn(argc, argv);}/****************************************************************************connect to \\server\service ****************************************************************************/NTSTATUS connect_to_service(struct cli_state **c, struct in_addr *server_ip,					const char *server_name, 					const char *service_name, 					const char *service_type){	NTSTATUS nt_status;	if (!opt_password && !opt_machine_pass) {		char *pass = getpass("Password:");		if (pass) {			opt_password = SMB_STRDUP(pass);		}	}		nt_status = cli_full_connection(c, NULL, server_name, 					server_ip, opt_port,					service_name, service_type,  					opt_user_name, opt_workgroup,					opt_password, 0, Undefined, NULL);		if (NT_STATUS_IS_OK(nt_status)) {		return nt_status;	} else {		d_fprintf(stderr, "Could not connect to server %s\n", server_name);		/* Display a nicer message depending on the result */		if (NT_STATUS_V(nt_status) == 		    NT_STATUS_V(NT_STATUS_LOGON_FAILURE))			d_fprintf(stderr, "The username or password was not correct.\n");		if (NT_STATUS_V(nt_status) == 		    NT_STATUS_V(NT_STATUS_ACCOUNT_LOCKED_OUT))			d_fprintf(stderr, "The account was locked out.\n");		if (NT_STATUS_V(nt_status) == 		    NT_STATUS_V(NT_STATUS_ACCOUNT_DISABLED))			d_fprintf(stderr, "The account was disabled.\n");		return nt_status;	}}/****************************************************************************connect to \\server\ipc$  ****************************************************************************/NTSTATUS connect_to_ipc(struct cli_state **c, struct in_addr *server_ip,					const char *server_name){	return connect_to_service(c, server_ip, server_name, "IPC$", "IPC");}/****************************************************************************connect to \\server\ipc$ anonymously****************************************************************************/NTSTATUS connect_to_ipc_anonymous(struct cli_state **c,			struct in_addr *server_ip, const char *server_name){	NTSTATUS nt_status;	nt_status = cli_full_connection(c, opt_requester_name, server_name, 					server_ip, opt_port,					"IPC$", "IPC",  					"", "",					"", 0, Undefined, NULL);		if (NT_STATUS_IS_OK(nt_status)) {		return nt_status;	} else {		DEBUG(1,("Cannot connect to server (anonymously).  Error was %s\n", nt_errstr(nt_status)));		return nt_status;	}}/** * Connect a server and open a given pipe * * @param cli_dst		A cli_state  * @param pipe			The pipe to open * @param got_pipe		boolean that stores if we got a pipe * * @return Normal NTSTATUS return. **/NTSTATUS connect_dst_pipe(struct cli_state **cli_dst, struct rpc_pipe_client **pp_pipe_hnd, int pipe_num){	NTSTATUS nt_status;	char *server_name = SMB_STRDUP("127.0.0.1");	struct cli_state *cli_tmp = NULL;	struct rpc_pipe_client *pipe_hnd = NULL;	if (opt_destination)		server_name = SMB_STRDUP(opt_destination);	/* make a connection to a named pipe */	nt_status = connect_to_ipc(&cli_tmp, NULL, server_name);	if (!NT_STATUS_IS_OK(nt_status)) {		return nt_status;	}	pipe_hnd = cli_rpc_pipe_open_noauth(cli_tmp, pipe_num, &nt_status);	if (!pipe_hnd) {		DEBUG(0, ("couldn't not initialize pipe\n"));		cli_shutdown(cli_tmp);		return nt_status;	}	*cli_dst = cli_tmp;	*pp_pipe_hnd = pipe_hnd;	return nt_status;}/**************************************************************************** Use the local machine's password for this session.****************************************************************************/int net_use_machine_password(void) {	char *user_name = NULL;	if (!secrets_init()) {		d_fprintf(stderr, "ERROR: Unable to open secrets database\n");		exit(1);	}	user_name = NULL;	opt_password = secrets_fetch_machine_password(opt_target_workgroup, NULL, NULL);	if (asprintf(&user_name, "%s$@%s", global_myname(), lp_realm()) == -1) {		return -1;	}	opt_user_name = user_name;	return 0;}BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_name){	if (opt_host) {		*server_name = SMB_STRDUP(opt_host);	}			if (opt_have_ip) {		*server_ip = opt_dest_ip;		if (!*server_name) {			*server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));		}	} else if (*server_name) {		/* resolve the IP address */		if (!resolve_name(*server_name, server_ip, 0x20))  {			DEBUG(1,("Unable to resolve server name\n"));			return False;		}	} else if (flags & NET_FLAGS_PDC) {		struct in_addr pdc_ip;		if (get_pdc_ip(opt_target_workgroup, &pdc_ip)) {			fstring dc_name;						if (is_zero_ip(pdc_ip))				return False;						if ( !name_status_find(opt_target_workgroup, 0x1b, 0x20, pdc_ip, dc_name) )				return False;							*server_name = SMB_STRDUP(dc_name);			*server_ip = pdc_ip;		}			} else if (flags & NET_FLAGS_DMB) {		struct in_addr msbrow_ip;		/*  if (!resolve_name(MSBROWSE, &msbrow_ip, 1)) */		if (!resolve_name(opt_target_workgroup, &msbrow_ip, 0x1B))  {			DEBUG(1,("Unable to resolve domain browser via name lookup\n"));			return False;		} else {			*server_ip = msbrow_ip;		}		*server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));	} else if (flags & NET_FLAGS_MASTER) {		struct in_addr brow_ips;		if (!resolve_name(opt_target_workgroup, &brow_ips, 0x1D))  {				/* go looking for workgroups */			DEBUG(1,("Unable to resolve master browser via name lookup\n"));			return False;		} else {			*server_ip = brow_ips;		}		*server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));	} else if (!(flags & NET_FLAGS_LOCALHOST_DEFAULT_INSANE)) {		*server_ip = loopback_ip;		*server_name = SMB_STRDUP("127.0.0.1");	}	if (!server_name || !*server_name) {		DEBUG(1,("no server to connect to\n"));		return False;	}	return True;}BOOL net_find_pdc(struct in_addr *server_ip, fstring server_name, const char *domain_name){	if (get_pdc_ip(domain_name, server_ip)) {		if (is_zero_ip(*server_ip))			return False;				if (!name_status_find(domain_name, 0x1b, 0x20, *server_ip, server_name))			return False;					return True;		} 	else		return False;}struct cli_state *net_make_ipc_connection(unsigned flags){	char *server_name = NULL;	struct in_addr server_ip;	struct cli_state *cli = NULL;	NTSTATUS nt_status;	if (!net_find_server(flags, &server_ip, &server_name)) {		d_fprintf(stderr, "\nUnable to find a suitable server\n");		return NULL;	}	if (flags & NET_FLAGS_ANONYMOUS) {		nt_status = connect_to_ipc_anonymous(&cli, &server_ip, server_name);	} else {		nt_status = connect_to_ipc(&cli, &server_ip, server_name);	}	SAFE_FREE(server_name);	if (NT_STATUS_IS_OK(nt_status)) {		return cli;	} else {		return NULL;	}}static int net_user(int argc, const char **argv){	if (net_ads_check() == 0)		return net_ads_user(argc, argv);	/* if server is not specified, default to PDC? */	if (net_rpc_check(NET_FLAGS_PDC))		return net_rpc_user(argc, argv);	return net_rap_user(argc, argv);}static int net_group(int argc, const char **argv){	if (net_ads_check() == 0)		return net_ads_group(argc, argv);	if (argc == 0 && net_rpc_check(NET_FLAGS_PDC))		return net_rpc_group(argc, argv);	return net_rap_group(argc, argv);}static int net_join(int argc, const char **argv){	if (net_ads_check() == 0) {		if (net_ads_join(argc, argv) == 0)			return 0;		else			d_fprintf(stderr, "ADS join did not work, falling back to RPC...\n");	}	return net_rpc_join(argc, argv);}static int net_changetrustpw(int argc, const char **argv){	if (net_ads_check() == 0)		return net_ads_changetrustpw(argc, argv);	return net_rpc_changetrustpw(argc, argv);}static int net_changesecretpw(int argc, const char **argv){        char *trust_pw;        uint32 sec_channel_type = SEC_CHAN_WKSTA;	if(opt_force) {		trust_pw = getpass("Enter machine password: ");		if (!secrets_store_machine_password(trust_pw, lp_workgroup(), sec_channel_type)) {			    d_fprintf(stderr, "Unable to write the machine account password in the secrets database");			    return 1;		}		else {		    d_printf("Modified trust account password in secrets database\n");		}	}	else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -