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

📄 cmd_lsarpc.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*   Unix SMB/CIFS implementation.   RPC pipe client   Copyright (C) Tim Potter              2000   Copyright (C) Rafal Szczesniak        2002   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"/* useful function to allow entering a name instead of a SID and * looking it up automatically */static NTSTATUS name_to_sid(struct rpc_pipe_client *cli, 			    TALLOC_CTX *mem_ctx,			    DOM_SID *sid, const char *name){	POLICY_HND pol;	uint32 *sid_types;	NTSTATUS result;	DOM_SID *sids;	/* maybe its a raw SID */	if (strncmp(name, "S-", 2) == 0 &&	    string_to_sid(sid, name)) {		return NT_STATUS_OK;	}	result = rpccli_lsa_open_policy(cli, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &pol);	if (!NT_STATUS_IS_OK(result))		goto done;	result = rpccli_lsa_lookup_names(cli, mem_ctx, &pol, 1, &name, &sids, &sid_types);	if (!NT_STATUS_IS_OK(result))		goto done;	rpccli_lsa_close(cli, mem_ctx, &pol);	*sid = sids[0];done:	return result;}/* Look up domain related information on a remote host */static NTSTATUS cmd_lsa_query_info_policy(struct rpc_pipe_client *cli,                                           TALLOC_CTX *mem_ctx, int argc,                                           const char **argv) {	POLICY_HND pol;	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;	DOM_SID *dom_sid = NULL;	struct uuid *dom_guid;	char *domain_name = NULL;	char *dns_name = NULL;	char *forest_name = NULL;	uint32 info_class = 3;	if (argc > 2) {		printf("Usage: %s [info_class]\n", argv[0]);		return NT_STATUS_OK;	}	if (argc == 2)		info_class = atoi(argv[1]);		/* Lookup info policy */	switch (info_class) {	case 12:		result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 					     SEC_RIGHTS_MAXIMUM_ALLOWED,					     &pol);		if (!NT_STATUS_IS_OK(result))			goto done;		result = rpccli_lsa_query_info_policy2(cli, mem_ctx, &pol,						    info_class, &domain_name,						    &dns_name, &forest_name,						    &dom_guid, &dom_sid);		break;	default:		result = rpccli_lsa_open_policy(cli, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &pol);		if (!NT_STATUS_IS_OK(result))			goto done;		result = rpccli_lsa_query_info_policy(cli, mem_ctx, &pol, 						   info_class, &domain_name, 						   &dom_sid);	}	if (!NT_STATUS_IS_OK(result))		goto done;		if (domain_name) {		if (dom_sid == NULL) {			printf("got no sid for domain %s\n", domain_name);		} else {			printf("domain %s has sid %s\n", domain_name,			       sid_string_static(dom_sid));		}	} else {		printf("could not query info for level %d\n", info_class);	}	if (dns_name)		printf("domain dns name is %s\n", dns_name);	if (forest_name)		printf("forest name is %s\n", forest_name);	if (info_class == 12) {		printf("domain GUID is %s\n", 		smb_uuid_string_static(*dom_guid));	}	rpccli_lsa_close(cli, mem_ctx, &pol); done:	return result;}/* Resolve a list of names to a list of sids */static NTSTATUS cmd_lsa_lookup_names(struct rpc_pipe_client *cli,                                      TALLOC_CTX *mem_ctx, int argc,                                      const char **argv){	POLICY_HND pol;	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;	DOM_SID *sids;	uint32 *types;	int i;	if (argc == 1) {		printf("Usage: %s [name1 [name2 [...]]]\n", argv[0]);		return NT_STATUS_OK;	}	result = rpccli_lsa_open_policy(cli, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &pol);	if (!NT_STATUS_IS_OK(result))		goto done;	result = rpccli_lsa_lookup_names(cli, mem_ctx, &pol, argc - 1, 				      (const char**)(argv + 1), &sids, &types);	if (!NT_STATUS_IS_OK(result) && NT_STATUS_V(result) != 	    NT_STATUS_V(STATUS_SOME_UNMAPPED))		goto done;	result = NT_STATUS_OK;	/* Print results */	for (i = 0; i < (argc - 1); i++) {		fstring sid_str;		sid_to_string(sid_str, &sids[i]);		printf("%s %s (%s: %d)\n", argv[i + 1], sid_str,		       sid_type_lookup(types[i]), types[i]);	}	rpccli_lsa_close(cli, mem_ctx, &pol); done:	return result;}/* Resolve a list of SIDs to a list of names */static NTSTATUS cmd_lsa_lookup_sids(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,                                    int argc, const char **argv){	POLICY_HND pol;	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;	DOM_SID *sids;	char **domains;	char **names;	uint32 *types;	int i;	if (argc == 1) {		printf("Usage: %s [sid1 [sid2 [...]]]\n", argv[0]);		return NT_STATUS_OK;	}	result = rpccli_lsa_open_policy(cli, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &pol);	if (!NT_STATUS_IS_OK(result))		goto done;	/* Convert arguments to sids */	sids = TALLOC_ARRAY(mem_ctx, DOM_SID, argc - 1);	if (!sids) {		printf("could not allocate memory for %d sids\n", argc - 1);		goto done;	}	for (i = 0; i < argc - 1; i++) 		if (!string_to_sid(&sids[i], argv[i + 1])) {			result = NT_STATUS_INVALID_SID;			goto done;		}	/* Lookup the SIDs */	result = rpccli_lsa_lookup_sids(cli, mem_ctx, &pol, argc - 1, sids, 				     &domains, &names, &types);	if (!NT_STATUS_IS_OK(result) && NT_STATUS_V(result) != 	    NT_STATUS_V(STATUS_SOME_UNMAPPED))		goto done;	result = NT_STATUS_OK;	/* Print results */	for (i = 0; i < (argc - 1); i++) {		fstring sid_str;		sid_to_string(sid_str, &sids[i]);		printf("%s %s\\%s (%d)\n", sid_str, 		       domains[i] ? domains[i] : "*unknown*", 		       names[i] ? names[i] : "*unknown*", types[i]);	}	rpccli_lsa_close(cli, mem_ctx, &pol); done:	return result;}/* Enumerate list of trusted domains */static NTSTATUS cmd_lsa_enum_trust_dom(struct rpc_pipe_client *cli,                                        TALLOC_CTX *mem_ctx, int argc,                                        const char **argv){	POLICY_HND pol;	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;	DOM_SID *domain_sids;	char **domain_names;	/* defaults, but may be changed using params */	uint32 enum_ctx = 0;	uint32 num_domains = 0;	int i;	if (argc > 2) {		printf("Usage: %s [enum context (0)]\n", argv[0]);		return NT_STATUS_OK;	}	if (argc == 2 && argv[1]) {		enum_ctx = atoi(argv[2]);	}		result = rpccli_lsa_open_policy(cli, mem_ctx, True, 				     POLICY_VIEW_LOCAL_INFORMATION,				     &pol);	if (!NT_STATUS_IS_OK(result))		goto done;	result = STATUS_MORE_ENTRIES;	while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) {		/* Lookup list of trusted domains */		result = rpccli_lsa_enum_trust_dom(cli, mem_ctx, &pol, &enum_ctx,						&num_domains,						&domain_names, &domain_sids);		if (!NT_STATUS_IS_OK(result) &&		    !NT_STATUS_EQUAL(result, NT_STATUS_NO_MORE_ENTRIES) &&		    !NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES))			goto done;		/* Print results: list of names and sids returned in this		 * response. */	 		for (i = 0; i < num_domains; i++) {			fstring sid_str;			sid_to_string(sid_str, &domain_sids[i]);			printf("%s %s\n", domain_names[i] ? domain_names[i] : 			       "*unknown*", sid_str);		}	}	rpccli_lsa_close(cli, mem_ctx, &pol); done:	return result;}/* Enumerates privileges */static NTSTATUS cmd_lsa_enum_privilege(struct rpc_pipe_client *cli, 				       TALLOC_CTX *mem_ctx, int argc, 				       const char **argv) {	POLICY_HND pol;	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;	uint32 enum_context=0;	uint32 pref_max_length=0x1000;	uint32 count=0;	char   **privs_name;	uint32 *privs_high;	uint32 *privs_low;	int i;	if (argc > 3) {		printf("Usage: %s [enum context] [max length]\n", argv[0]);		return NT_STATUS_OK;	}	if (argc>=2)		enum_context=atoi(argv[1]);	if (argc==3)		pref_max_length=atoi(argv[2]);	result = rpccli_lsa_open_policy(cli, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &pol);	if (!NT_STATUS_IS_OK(result))		goto done;	result = rpccli_lsa_enum_privilege(cli, mem_ctx, &pol, &enum_context, pref_max_length,					&count, &privs_name, &privs_high, &privs_low);	if (!NT_STATUS_IS_OK(result))		goto done;	/* Print results */	printf("found %d privileges\n\n", count);	for (i = 0; i < count; i++) {		printf("%s \t\t%d:%d (0x%x:0x%x)\n", privs_name[i] ? privs_name[i] : "*unknown*",		       privs_high[i], privs_low[i], privs_high[i], privs_low[i]);	}	rpccli_lsa_close(cli, mem_ctx, &pol); done:	return result;}/* Get privilege name */static NTSTATUS cmd_lsa_get_dispname(struct rpc_pipe_client *cli,                                      TALLOC_CTX *mem_ctx, int argc,                                      const char **argv) {	POLICY_HND pol;	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;	uint16 lang_id=0;	uint16 lang_id_sys=0;	uint16 lang_id_desc;	fstring description;	if (argc != 2) {		printf("Usage: %s privilege name\n", argv[0]);		return NT_STATUS_OK;	}	result = rpccli_lsa_open_policy(cli, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &pol);	if (!NT_STATUS_IS_OK(result))		goto done;	result = rpccli_lsa_get_dispname(cli, mem_ctx, &pol, argv[1], lang_id, lang_id_sys, description, &lang_id_desc);	if (!NT_STATUS_IS_OK(result))		goto done;	/* Print results */	printf("%s -> %s (language: 0x%x)\n", argv[1], description, lang_id_desc);	rpccli_lsa_close(cli, mem_ctx, &pol); done:	return result;}/* Enumerate the LSA SIDS */static NTSTATUS cmd_lsa_enum_sids(struct rpc_pipe_client *cli, 				  TALLOC_CTX *mem_ctx, int argc, 				  const char **argv) {	POLICY_HND pol;	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;	uint32 enum_context=0;	uint32 pref_max_length=0x1000;	DOM_SID *sids;	uint32 count=0;	int i;	if (argc > 3) {		printf("Usage: %s [enum context] [max length]\n", argv[0]);		return NT_STATUS_OK;	}	if (argc>=2)		enum_context=atoi(argv[1]);	if (argc==3)		pref_max_length=atoi(argv[2]);	result = rpccli_lsa_open_policy(cli, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &pol);	if (!NT_STATUS_IS_OK(result))		goto done;	result = rpccli_lsa_enum_sids(cli, mem_ctx, &pol, &enum_context, pref_max_length,					&count, &sids);	if (!NT_STATUS_IS_OK(result))		goto done;	/* Print results */	printf("found %d SIDs\n\n", count);	for (i = 0; i < count; i++) {		fstring sid_str;		sid_to_string(sid_str, &sids[i]);		printf("%s\n", sid_str);	}	rpccli_lsa_close(cli, mem_ctx, &pol); done:	return result;}/* Create a new account */static NTSTATUS cmd_lsa_create_account(struct rpc_pipe_client *cli,                                            TALLOC_CTX *mem_ctx, int argc,                                            const char **argv) {	POLICY_HND dom_pol;	POLICY_HND user_pol;	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;	uint32 des_access = 0x000f000f;		DOM_SID sid;	if (argc != 2 ) {		printf("Usage: %s SID\n", argv[0]);		return NT_STATUS_OK;	}	result = name_to_sid(cli, mem_ctx, &sid, argv[1]);	if (!NT_STATUS_IS_OK(result))		goto done;		result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 				     SEC_RIGHTS_MAXIMUM_ALLOWED,				     &dom_pol);	if (!NT_STATUS_IS_OK(result))		goto done;	result = rpccli_lsa_create_account(cli, mem_ctx, &dom_pol, &sid, des_access, &user_pol);	if (!NT_STATUS_IS_OK(result))

⌨️ 快捷键说明

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