dcesrv_lsa.c

来自「samba最新软件」· C语言 代码 · 共 2,518 行 · 第 1/5 页

C
2,518
字号
/*   lsa_EnumAccounts */static NTSTATUS dcesrv_lsa_EnumAccounts(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,				 struct lsa_EnumAccounts *r){	struct dcesrv_handle *h;	struct lsa_policy_state *state;	int ret, i;	struct ldb_message **res;	const char * const attrs[] = { "objectSid", NULL};	uint32_t count;	DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY);	state = h->data;	/* NOTE: This call must only return accounts that have at least	   one privilege set 	*/	ret = gendb_search(state->sam_ldb, mem_ctx, NULL, &res, attrs, 			   "(&(objectSid=*)(privilege=*))");	if (ret < 0) {		return NT_STATUS_NO_SUCH_USER;	}	if (*r->in.resume_handle >= ret) {		return NT_STATUS_NO_MORE_ENTRIES;	}	count = ret - *r->in.resume_handle;	if (count > r->in.num_entries) {		count = r->in.num_entries;	}	if (count == 0) {		return NT_STATUS_NO_MORE_ENTRIES;	}	r->out.sids->sids = talloc_array(r->out.sids, struct lsa_SidPtr, count);	if (r->out.sids->sids == NULL) {		return NT_STATUS_NO_MEMORY;	}	for (i=0;i<count;i++) {		r->out.sids->sids[i].sid = 			samdb_result_dom_sid(r->out.sids->sids, 					     res[i + *r->in.resume_handle],					     "objectSid");		NT_STATUS_HAVE_NO_MEMORY(r->out.sids->sids[i].sid);	}	r->out.sids->num_sids = count;	*r->out.resume_handle = count + *r->in.resume_handle;	return NT_STATUS_OK;	}/*  lsa_CreateTrustedDomainEx2*/static NTSTATUS dcesrv_lsa_CreateTrustedDomainEx2(struct dcesrv_call_state *dce_call,					   TALLOC_CTX *mem_ctx,					   struct lsa_CreateTrustedDomainEx2 *r){	DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/*  lsa_CreateTrustedDomainEx*/static NTSTATUS dcesrv_lsa_CreateTrustedDomainEx(struct dcesrv_call_state *dce_call,					  TALLOC_CTX *mem_ctx,					  struct lsa_CreateTrustedDomainEx *r){	DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/*   lsa_CreateTrustedDomain */static NTSTATUS dcesrv_lsa_CreateTrustedDomain(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,					struct lsa_CreateTrustedDomain *r){	struct dcesrv_handle *policy_handle;	struct lsa_policy_state *policy_state;	struct lsa_trusted_domain_state *trusted_domain_state;	struct dcesrv_handle *handle;	struct ldb_message **msgs, *msg;	const char *attrs[] = {		NULL	};	const char *name;	int ret;	DCESRV_PULL_HANDLE(policy_handle, r->in.handle, LSA_HANDLE_POLICY);	ZERO_STRUCTP(r->out.trustdom_handle);		policy_state = policy_handle->data;	if (!r->in.info->name.string) {		return NT_STATUS_INVALID_PARAMETER;	}	name = r->in.info->name.string;		trusted_domain_state = talloc(mem_ctx, struct lsa_trusted_domain_state);	if (!trusted_domain_state) {		return NT_STATUS_NO_MEMORY;	}	trusted_domain_state->policy = policy_state;	msg = ldb_msg_new(mem_ctx);	if (msg == NULL) {		return NT_STATUS_NO_MEMORY;	}	/* search for the trusted_domain record */	ret = gendb_search(trusted_domain_state->policy->sam_ldb,			   mem_ctx, policy_state->system_dn, &msgs, attrs,			   "(&(cn=%s)(objectclass=trustedDomain))", 			   ldb_binary_encode_string(mem_ctx, r->in.info->name.string));	if (ret > 0) {		return NT_STATUS_OBJECT_NAME_COLLISION;	}		if (ret < 0 || ret > 1) {		DEBUG(0,("Found %d records matching DN %s\n", ret,			 ldb_dn_get_linearized(policy_state->system_dn)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}		msg->dn = ldb_dn_copy(mem_ctx, policy_state->system_dn);	if ( ! ldb_dn_add_child_fmt(msg->dn, "cn=%s", name)) {		return NT_STATUS_NO_MEMORY;	}		samdb_msg_add_string(trusted_domain_state->policy->sam_ldb, mem_ctx, msg, "flatname", name);	if (r->in.info->sid) {		const char *sid_string = dom_sid_string(mem_ctx, r->in.info->sid);		if (!sid_string) {			return NT_STATUS_NO_MEMORY;		}					samdb_msg_add_string(trusted_domain_state->policy->sam_ldb, mem_ctx, msg, "securityIdentifier", sid_string);	}	samdb_msg_add_string(trusted_domain_state->policy->sam_ldb, mem_ctx, msg, "objectClass", "trustedDomain");		trusted_domain_state->trusted_domain_dn = talloc_reference(trusted_domain_state, msg->dn);	/* create the trusted_domain */	ret = ldb_add(trusted_domain_state->policy->sam_ldb, msg);	switch (ret) {	case  LDB_SUCCESS:		break;	case  LDB_ERR_ENTRY_ALREADY_EXISTS:		ldb_transaction_cancel(trusted_domain_state->policy->sam_ldb);		DEBUG(0,("Failed to create trusted domain record %s: %s\n",			 ldb_dn_get_linearized(msg->dn),			 ldb_errstring(trusted_domain_state->policy->sam_ldb)));		return NT_STATUS_DOMAIN_EXISTS;	case  LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS:		ldb_transaction_cancel(trusted_domain_state->policy->sam_ldb);		DEBUG(0,("Failed to create trusted domain record %s: %s\n",			 ldb_dn_get_linearized(msg->dn),			 ldb_errstring(trusted_domain_state->policy->sam_ldb)));		return NT_STATUS_ACCESS_DENIED;	default:		ldb_transaction_cancel(trusted_domain_state->policy->sam_ldb);		DEBUG(0,("Failed to create user record %s: %s\n",			 ldb_dn_get_linearized(msg->dn),			 ldb_errstring(trusted_domain_state->policy->sam_ldb)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	handle = dcesrv_handle_new(dce_call->context, LSA_HANDLE_TRUSTED_DOMAIN);	if (!handle) {		return NT_STATUS_NO_MEMORY;	}		handle->data = talloc_steal(handle, trusted_domain_state);		trusted_domain_state->access_mask = r->in.access_mask;	trusted_domain_state->policy = talloc_reference(trusted_domain_state, policy_state);		*r->out.trustdom_handle = handle->wire_handle;		return NT_STATUS_OK;}/*   lsa_OpenTrustedDomain*/static NTSTATUS dcesrv_lsa_OpenTrustedDomain(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,				      struct lsa_OpenTrustedDomain *r){	struct dcesrv_handle *policy_handle;		struct lsa_policy_state *policy_state;	struct lsa_trusted_domain_state *trusted_domain_state;	struct dcesrv_handle *handle;	struct ldb_message **msgs;	const char *attrs[] = {		NULL	};	const char *sid_string;	int ret;	DCESRV_PULL_HANDLE(policy_handle, r->in.handle, LSA_HANDLE_POLICY);	ZERO_STRUCTP(r->out.trustdom_handle);	policy_state = policy_handle->data;	trusted_domain_state = talloc(mem_ctx, struct lsa_trusted_domain_state);	if (!trusted_domain_state) {		return NT_STATUS_NO_MEMORY;	}	trusted_domain_state->policy = policy_state;	sid_string = dom_sid_string(mem_ctx, r->in.sid);	if (!sid_string) {		return NT_STATUS_NO_MEMORY;	}	/* search for the trusted_domain record */	ret = gendb_search(trusted_domain_state->policy->sam_ldb,			   mem_ctx, policy_state->system_dn, &msgs, attrs,			   "(&(securityIdentifier=%s)(objectclass=trustedDomain))", 			   sid_string);	if (ret == 0) {		return NT_STATUS_OBJECT_NAME_NOT_FOUND;	}		if (ret != 1) {		DEBUG(0,("Found %d records matching DN %s\n", ret,			 ldb_dn_get_linearized(policy_state->system_dn)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	trusted_domain_state->trusted_domain_dn = talloc_reference(trusted_domain_state, msgs[0]->dn);		handle = dcesrv_handle_new(dce_call->context, LSA_HANDLE_TRUSTED_DOMAIN);	if (!handle) {		return NT_STATUS_NO_MEMORY;	}		handle->data = talloc_steal(handle, trusted_domain_state);		trusted_domain_state->access_mask = r->in.access_mask;	trusted_domain_state->policy = talloc_reference(trusted_domain_state, policy_state);		*r->out.trustdom_handle = handle->wire_handle;		return NT_STATUS_OK;}/*  lsa_OpenTrustedDomainByName*/static NTSTATUS dcesrv_lsa_OpenTrustedDomainByName(struct dcesrv_call_state *dce_call,					    TALLOC_CTX *mem_ctx,					    struct lsa_OpenTrustedDomainByName *r){	struct dcesrv_handle *policy_handle;		struct lsa_policy_state *policy_state;	struct lsa_trusted_domain_state *trusted_domain_state;	struct dcesrv_handle *handle;	struct ldb_message **msgs;	const char *attrs[] = {		NULL	};	int ret;	DCESRV_PULL_HANDLE(policy_handle, r->in.handle, LSA_HANDLE_POLICY);	ZERO_STRUCTP(r->out.trustdom_handle);	policy_state = policy_handle->data;	if (!r->in.name.string) {		return NT_STATUS_INVALID_PARAMETER;	}		trusted_domain_state = talloc(mem_ctx, struct lsa_trusted_domain_state);	if (!trusted_domain_state) {		return NT_STATUS_NO_MEMORY;	}	trusted_domain_state->policy = policy_state;	/* search for the trusted_domain record */	ret = gendb_search(trusted_domain_state->policy->sam_ldb,			   mem_ctx, policy_state->system_dn, &msgs, attrs,			   "(&(flatname=%s)(objectclass=trustedDomain))", 			   ldb_binary_encode_string(mem_ctx, r->in.name.string));	if (ret == 0) {		return NT_STATUS_OBJECT_NAME_NOT_FOUND;	}		if (ret != 1) {		DEBUG(0,("Found %d records matching DN %s\n", ret,			 ldb_dn_get_linearized(policy_state->system_dn)));		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	trusted_domain_state->trusted_domain_dn = talloc_reference(trusted_domain_state, msgs[0]->dn);		handle = dcesrv_handle_new(dce_call->context, LSA_HANDLE_TRUSTED_DOMAIN);	if (!handle) {		return NT_STATUS_NO_MEMORY;	}		handle->data = talloc_steal(handle, trusted_domain_state);		trusted_domain_state->access_mask = r->in.access_mask;	trusted_domain_state->policy = talloc_reference(trusted_domain_state, policy_state);		*r->out.trustdom_handle = handle->wire_handle;		return NT_STATUS_OK;}/*   lsa_SetTrustedDomainInfo*/static NTSTATUS dcesrv_lsa_SetTrustedDomainInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,					 struct lsa_SetTrustedDomainInfo *r){	DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/*   lsa_SetInfomrationTrustedDomain*/static NTSTATUS dcesrv_lsa_SetInformationTrustedDomain(struct dcesrv_call_state *dce_call, 						TALLOC_CTX *mem_ctx,						struct lsa_SetInformationTrustedDomain *r){	DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/*   lsa_DeleteTrustedDomain*/static NTSTATUS dcesrv_lsa_DeleteTrustedDomain(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,				      struct lsa_DeleteTrustedDomain *r){	NTSTATUS status;	struct lsa_OpenTrustedDomain open;	struct lsa_Delete delete;	struct dcesrv_handle *h;	open.in.handle = r->in.handle;	open.in.sid = r->in.dom_sid;	open.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	open.out.trustdom_handle = talloc(mem_ctx, struct policy_handle);	if (!open.out.trustdom_handle) {		return NT_STATUS_NO_MEMORY;	}	status = dcesrv_lsa_OpenTrustedDomain(dce_call, mem_ctx, &open);	if (!NT_STATUS_IS_OK(status)) {		return status;	}	DCESRV_PULL_HANDLE(h, open.out.trustdom_handle, DCESRV_HANDLE_ANY);	talloc_steal(mem_ctx, h);	delete.in.handle = open.out.trustdom_handle;	status = dcesrv_lsa_Delete(dce_call, mem_ctx, &delete);	if (!NT_STATUS_IS_OK(status)) {		return status;	}	return NT_STATUS_OK;}static NTSTATUS fill_trust_domain_ex(TALLOC_CTX *mem_ctx, 				     struct ldb_message *msg, 				     struct lsa_TrustDomainInfoInfoEx *info_ex) {	info_ex->domain_name.string		= ldb_msg_find_attr_as_string(msg, "trustPartner", NULL);	info_ex->netbios_name.string		= ldb_msg_find_attr_as_string(msg, "flatname", NULL);	info_ex->sid 		= samdb_result_dom_sid(mem_ctx, msg, "securityIdentifier");	info_ex->trust_direction		= ldb_msg_find_attr_as_int(msg, "trustDirection", 0);	info_ex->trust_type		= ldb_msg_find_attr_as_int(msg, "trustType", 0);	info_ex->trust_attributes		= ldb_msg_find_attr_as_int(msg, "trustAttributes", 0);		return NT_STATUS_OK;}/*   lsa_QueryTrustedDomainInfo*/static NTSTATUS dcesrv_lsa_QueryTrustedDomainInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,					   struct lsa_QueryTrustedDomainInfo *r){	struct dcesrv_handle *h;	struct lsa_trusted_domain_state *trusted_domain_state;	struct ldb_message *msg;	int ret;	struct ldb_message **res;	const char *attrs[] = {		"flatname", 		"trustPartner",		"securityIdentifier",		"trustDirection",		"trustType",		"trustAttributes", 		NULL	};	DCESRV_PULL_HANDLE(h, r->in.trustdom_handle, LSA_HANDLE_TRUSTED_DOMAIN);	trusted_domain_state = h->data;	/* pull all the user attributes */	ret = gendb_search_dn(trusted_domain_state->policy->sam_ldb, mem_ctx,			      trusted_domain_state->trusted_domain_dn, &res, attrs);	if (ret != 1) {		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	msg = res[0];		r->out.info = talloc(mem_ctx, union lsa_TrustedDomainInfo);	if (!r->out.info) {		return NT_STATUS_NO_MEMORY;	}	switch (r->in.level) {	case LSA_TRUSTED_DOMAIN_INFO_NAME:		r->out.info->name.netbios_name.string			= samdb_result_string(msg, "flatname", NULL);					   		break;	case LSA_TRUSTED_DOMAIN_INFO_POSIX_OFFSET:		r->out.info->posix_offset.posix_offset			= samdb_result_uint(msg, "posixOffset", 0);					   		break;#if 0  /* Win2k3 doesn't implement this */	case LSA_TRUSTED_DOMAIN_INFO_BASIC:		r->out.info->info_basic.netbios_name.string 			= ldb_msg_find_attr_as_string(msg, "flatname", NULL);		r->out.info->info_basic.sid			= samdb_result_dom_sid(mem_ctx, msg, "securityIdentifier");		break;#endif	case LSA_TRUSTED_DOMAIN_INFO_INFO_EX:		return fill_trust_domain_ex(mem_ctx, msg, &r->out.info->info_ex);	case LSA_TRUSTED_DOMAIN_INFO_FULL_INFO:		ZERO_STRUCT(r->out.info->full_info);		return fill_trust_domain_ex(mem_ctx, msg, &r->out.info->full_info.info_ex);	case LSA_TRUSTED_DOMAIN_INFO_INFO_ALL:		ZERO_STRUCT(r->out.info->info_all);		return fill_trust_domain_ex(mem_ctx, msg, &r->out.info->info_all.info_ex);	case LSA_TRUSTED_DOMAIN_INFO_CONTROLLERS_INFO:	case LSA_TRUSTED_DOMAIN_INFO_11:		/* oops, we don't want to return the info after all */		talloc_free(r->out.info);		r->out.info = NULL;		return NT_STATUS_INVALID_PARAMETER;	default:		/* oops, we don't want to return the info after all */		talloc_free(r->out.info);		r->out.info = NULL;		return NT_STATUS_INVALID_INFO_CLASS;	}	return NT_STATUS_OK;}/*   lsa_QueryTrustedDomainInfoBySid*/static NTSTATUS dcesrv_lsa_QueryTrustedDomainInfoBySid(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,						struct lsa_QueryTrustedDomainInfoBySid *r){	NTSTATUS status;	struct lsa_OpenTrustedDomain open;	struct lsa_QueryTrustedDomainInfo query;	struct dcesrv_handle *h;	open.in.handle = r->in.handle;	open.in.sid = r->in.dom_sid;	open.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	open.out.trustdom_handle = talloc(mem_ctx, struct policy_handle);	if (!open.out.trustdom_handle) {		return NT_STATUS_NO_MEMORY;	}	status = dcesrv_lsa_OpenTrustedDomain(dce_call, mem_ctx, &open);

⌨️ 快捷键说明

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