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

📄 rpcclient.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Unix SMB/CIFS implementation.   RPC pipe client   Copyright (C) Tim Potter 2000-2001   Copyright (C) Martin Pool 2003   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"DOM_SID domain_sid;static enum pipe_auth_type pipe_default_auth_type = PIPE_AUTH_TYPE_NONE;static enum pipe_auth_level pipe_default_auth_level = PIPE_AUTH_LEVEL_NONE;/* List to hold groups of commands. * * Commands are defined in a list of arrays: arrays are easy to * statically declare, and lists are easier to dynamically extend. */static struct cmd_list {	struct cmd_list *prev, *next;	struct cmd_set *cmd_set;} *cmd_list;/****************************************************************************handle completion of commands for readline****************************************************************************/static char **completion_fn(const char *text, int start, int end){#define MAX_COMPLETIONS 100	char **matches;	int i, count=0;	struct cmd_list *commands = cmd_list;#if 0	/* JERRY */	/* FIXME!!!  -- what to do when completing argument? */	/* for words not at the start of the line fallback 	   to filename completion */	if (start) 		return NULL;#endif	/* make sure we have a list of valid commands */	if (!commands) 		return NULL;	matches = SMB_MALLOC_ARRAY(char *, MAX_COMPLETIONS);	if (!matches) return NULL;	matches[count++] = SMB_STRDUP(text);	if (!matches[0]) return NULL;	while (commands && count < MAX_COMPLETIONS-1) 	{		if (!commands->cmd_set)			break;				for (i=0; commands->cmd_set[i].name; i++)		{			if ((strncmp(text, commands->cmd_set[i].name, strlen(text)) == 0) &&				(( commands->cmd_set[i].returntype == RPC_RTYPE_NTSTATUS &&                        commands->cmd_set[i].ntfn ) ||                       ( commands->cmd_set[i].returntype == RPC_RTYPE_WERROR &&                        commands->cmd_set[i].wfn)))			{				matches[count] = SMB_STRDUP(commands->cmd_set[i].name);				if (!matches[count]) 					return NULL;				count++;			}		}				commands = commands->next;			}	if (count == 2) {		SAFE_FREE(matches[0]);		matches[0] = SMB_STRDUP(matches[1]);	}	matches[count] = NULL;	return matches;}static char* next_command (char** cmdstr){	static pstring 		command;	char			*p;		if (!cmdstr || !(*cmdstr))		return NULL;		p = strchr_m(*cmdstr, ';');	if (p)		*p = '\0';	pstrcpy(command, *cmdstr);	if (p)		*cmdstr = p + 1;	else		*cmdstr = NULL;		return command;}/* Fetch the SID for this computer */static void fetch_machine_sid(struct cli_state *cli){	POLICY_HND pol;	NTSTATUS result = NT_STATUS_OK;	uint32 info_class = 5;	char *domain_name = NULL;	static BOOL got_domain_sid;	TALLOC_CTX *mem_ctx;	DOM_SID *dom_sid = NULL;	struct rpc_pipe_client *lsapipe = NULL;	if (got_domain_sid) return;	if (!(mem_ctx=talloc_init("fetch_machine_sid"))) {		DEBUG(0,("fetch_machine_sid: talloc_init returned NULL!\n"));		goto error;	}	if ((lsapipe = cli_rpc_pipe_open_noauth(cli, PI_LSARPC, &result)) == NULL) {		fprintf(stderr, "could not initialise lsa pipe. Error was %s\n", nt_errstr(result) );		goto error;	}		result = rpccli_lsa_open_policy(lsapipe, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &pol);	if (!NT_STATUS_IS_OK(result)) {		goto error;	}	result = rpccli_lsa_query_info_policy(lsapipe, mem_ctx, &pol, info_class, 					   &domain_name, &dom_sid);	if (!NT_STATUS_IS_OK(result)) {		goto error;	}	got_domain_sid = True;	sid_copy( &domain_sid, dom_sid );	rpccli_lsa_close(lsapipe, mem_ctx, &pol);	cli_rpc_pipe_close(lsapipe);	talloc_destroy(mem_ctx);	return; error:	if (lsapipe) {		cli_rpc_pipe_close(lsapipe);	}	fprintf(stderr, "could not obtain sid for domain %s\n", cli->domain);	if (!NT_STATUS_IS_OK(result)) {		fprintf(stderr, "error: %s\n", nt_errstr(result));	}	exit(1);}/* List the available commands on a given pipe */static NTSTATUS cmd_listcommands(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,				 int argc, const char **argv){	struct cmd_list *tmp;        struct cmd_set *tmp_set;	int i;        /* Usage */        if (argc != 2) {                printf("Usage: %s <pipe>\n", argv[0]);                return NT_STATUS_OK;        }        /* Help on one command */	for (tmp = cmd_list; tmp; tmp = tmp->next) 	{		tmp_set = tmp->cmd_set;				if (!StrCaseCmp(argv[1], tmp_set->name))		{			printf("Available commands on the %s pipe:\n\n", tmp_set->name);			i = 0;			tmp_set++;			while(tmp_set->name) {				printf("%30s", tmp_set->name);                                tmp_set++;				i++;				if (i%3 == 0)					printf("\n");			}						/* drop out of the loop */			break;		}        }	printf("\n\n");	return NT_STATUS_OK;}/* Display help on commands */static NTSTATUS cmd_help(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,                         int argc, const char **argv){	struct cmd_list *tmp;        struct cmd_set *tmp_set;        /* Usage */        if (argc > 2) {                printf("Usage: %s [command]\n", argv[0]);                return NT_STATUS_OK;        }        /* Help on one command */        if (argc == 2) {                for (tmp = cmd_list; tmp; tmp = tmp->next) {                                                tmp_set = tmp->cmd_set;                        while(tmp_set->name) {                                if (strequal(argv[1], tmp_set->name)) {                                        if (tmp_set->usage &&                                            tmp_set->usage[0])                                                printf("%s\n", tmp_set->usage);                                        else                                                printf("No help for %s\n", tmp_set->name);                                        return NT_STATUS_OK;                                }                                tmp_set++;                        }                }                printf("No such command: %s\n", argv[1]);                return NT_STATUS_OK;        }        /* List all commands */	for (tmp = cmd_list; tmp; tmp = tmp->next) {		tmp_set = tmp->cmd_set;		while(tmp_set->name) {			printf("%15s\t\t%s\n", tmp_set->name,			       tmp_set->description ? tmp_set->description:			       "");			tmp_set++;		}	}	return NT_STATUS_OK;}/* Change the debug level */static NTSTATUS cmd_debuglevel(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,                               int argc, const char **argv){	if (argc > 2) {		printf("Usage: %s [debuglevel]\n", argv[0]);		return NT_STATUS_OK;	}	if (argc == 2) {		DEBUGLEVEL = atoi(argv[1]);	}	printf("debuglevel is %d\n", DEBUGLEVEL);	return NT_STATUS_OK;}static NTSTATUS cmd_quit(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,                         int argc, const char **argv){	exit(0);	return NT_STATUS_OK; /* NOTREACHED */}static NTSTATUS cmd_set_ss_level(void){	struct cmd_list *tmp;	/* Close any existing connections not at this level. */	for (tmp = cmd_list; tmp; tmp = tmp->next) {        	struct cmd_set *tmp_set;		for (tmp_set = tmp->cmd_set; tmp_set->name; tmp_set++) {			if (tmp_set->rpc_pipe == NULL) {				continue;			}			if (tmp_set->rpc_pipe->auth.auth_type != pipe_default_auth_type ||					tmp_set->rpc_pipe->auth.auth_level != pipe_default_auth_level) {				cli_rpc_pipe_close(tmp_set->rpc_pipe);				tmp_set->rpc_pipe = NULL;			}		}	}	return NT_STATUS_OK;}static NTSTATUS cmd_sign(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,                         int argc, const char **argv){	pipe_default_auth_level = PIPE_AUTH_LEVEL_INTEGRITY;	pipe_default_auth_type = PIPE_AUTH_TYPE_NTLMSSP;	if (argc > 2) {		printf("Usage: %s [NTLMSSP|NTLMSSP_SPNEGO|SCHANNEL]\n", argv[0]);		return NT_STATUS_OK;	}	if (argc == 2) {		if (strequal(argv[1], "NTLMSSP")) {			pipe_default_auth_type = PIPE_AUTH_TYPE_NTLMSSP;		} else if (strequal(argv[1], "NTLMSSP_SPNEGO")) {			pipe_default_auth_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP;		} else if (strequal(argv[1], "SCHANNEL")) {			pipe_default_auth_type = PIPE_AUTH_TYPE_SCHANNEL;		} else {			printf("unknown type %s\n", argv[1]);			return NT_STATUS_INVALID_LEVEL;		}	}	printf("debuglevel is %d\n", DEBUGLEVEL);	return cmd_set_ss_level();}static NTSTATUS cmd_seal(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,                         int argc, const char **argv){	pipe_default_auth_level = PIPE_AUTH_LEVEL_PRIVACY;	pipe_default_auth_type = PIPE_AUTH_TYPE_NTLMSSP;	if (argc > 2) {		printf("Usage: %s [NTLMSSP|NTLMSSP_SPNEGO|SCHANNEL]\n", argv[0]);		return NT_STATUS_OK;	}	if (argc == 2) {		if (strequal(argv[1], "NTLMSSP")) {			pipe_default_auth_type = PIPE_AUTH_TYPE_NTLMSSP;		} else if (strequal(argv[1], "NTLMSSP_SPNEGO")) {			pipe_default_auth_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP;		} else if (strequal(argv[1], "SCHANNEL")) {			pipe_default_auth_type = PIPE_AUTH_TYPE_SCHANNEL;		} else {			printf("unknown type %s\n", argv[1]);			return NT_STATUS_INVALID_LEVEL;		}	}	return cmd_set_ss_level();}static NTSTATUS cmd_none(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,                         int argc, const char **argv){	pipe_default_auth_level = PIPE_AUTH_LEVEL_NONE;	pipe_default_auth_type = PIPE_AUTH_TYPE_NONE;	return cmd_set_ss_level();}static NTSTATUS cmd_schannel(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,			     int argc, const char **argv){	d_printf("Setting schannel - sign and seal\n");	pipe_default_auth_level = PIPE_AUTH_LEVEL_PRIVACY;	pipe_default_auth_type = PIPE_AUTH_TYPE_SCHANNEL;	return cmd_set_ss_level();}static NTSTATUS cmd_schannel_sign(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,			     int argc, const char **argv){	d_printf("Setting schannel - sign only\n");	pipe_default_auth_level = PIPE_AUTH_LEVEL_INTEGRITY;	pipe_default_auth_type = PIPE_AUTH_TYPE_SCHANNEL;	return cmd_set_ss_level();}/* Built in rpcclient commands */static struct cmd_set rpcclient_commands[] = {

⌨️ 快捷键说明

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