lsa_lookup.c

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

C
933
字号
	}	/* need to re-add a check for an allocated sid */	return NT_STATUS_NOT_FOUND;}/*  lsa_LookupSids2*/NTSTATUS dcesrv_lsa_LookupSids2(struct dcesrv_call_state *dce_call,				TALLOC_CTX *mem_ctx,				struct lsa_LookupSids2 *r){	struct lsa_policy_state *state;	int i;	NTSTATUS status = NT_STATUS_OK;	r->out.domains = NULL;	status = dcesrv_lsa_get_policy_state(dce_call, mem_ctx, &state);	if (!NT_STATUS_IS_OK(status)) {		return status;	}	r->out.domains = talloc_zero(mem_ctx,  struct lsa_RefDomainList);	if (r->out.domains == NULL) {		return NT_STATUS_NO_MEMORY;	}	r->out.names = talloc_zero(mem_ctx,  struct lsa_TransNameArray2);	if (r->out.names == NULL) {		return NT_STATUS_NO_MEMORY;	}	*r->out.count = 0;	r->out.names->names = talloc_array(r->out.names, struct lsa_TranslatedName2, 					     r->in.sids->num_sids);	if (r->out.names->names == NULL) {		return NT_STATUS_NO_MEMORY;	}	for (i=0;i<r->in.sids->num_sids;i++) {		struct dom_sid *sid = r->in.sids->sids[i].sid;		char *sid_str = dom_sid_string(mem_ctx, sid);		const char *name, *authority_name;		enum lsa_SidType rtype;		uint32_t sid_index;		NTSTATUS status2;		r->out.names->count++;		r->out.names->names[i].sid_type    = SID_NAME_UNKNOWN;		r->out.names->names[i].name.string = sid_str;		r->out.names->names[i].sid_index   = 0xFFFFFFFF;		r->out.names->names[i].unknown     = 0;		if (sid_str == NULL) {			r->out.names->names[i].name.string = "(SIDERROR)";			status = STATUS_SOME_UNMAPPED;			continue;		}		status2 = dcesrv_lsa_lookup_sid(state, mem_ctx, sid, sid_str, 						&authority_name, &name, &rtype);		if (!NT_STATUS_IS_OK(status2)) {			status = STATUS_SOME_UNMAPPED;			continue;		}		/* set up the authority table */		status2 = dcesrv_lsa_authority_list(state, mem_ctx, rtype, 						    authority_name, sid, 						    r->out.domains, &sid_index);		if (!NT_STATUS_IS_OK(status2)) {			return status2;		}		r->out.names->names[i].sid_type    = rtype;		r->out.names->names[i].name.string = name;		r->out.names->names[i].sid_index   = sid_index;		r->out.names->names[i].unknown     = 0;		(*r->out.count)++;	}		if (*r->out.count == 0) {		return NT_STATUS_NONE_MAPPED;	}	if (*r->out.count != r->in.sids->num_sids) {		return STATUS_SOME_UNMAPPED;	}	return NT_STATUS_OK;}/*  lsa_LookupSids3  Identical to LookupSids2, but doesn't take a policy handle  */NTSTATUS dcesrv_lsa_LookupSids3(struct dcesrv_call_state *dce_call,				TALLOC_CTX *mem_ctx,				struct lsa_LookupSids3 *r){	struct lsa_LookupSids2 r2;	struct lsa_OpenPolicy2 pol;	NTSTATUS status;	struct dcesrv_handle *h;	/* No policy handle on the wire, so make one up here */	r2.in.handle = talloc(mem_ctx, struct policy_handle);	if (!r2.in.handle) {		return NT_STATUS_NO_MEMORY;	}	pol.out.handle = r2.in.handle;	pol.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	pol.in.attr = NULL;	pol.in.system_name = NULL;	status = dcesrv_lsa_OpenPolicy2(dce_call, mem_ctx, &pol);	if (!NT_STATUS_IS_OK(status)) {		return status;	}	/* ensure this handle goes away at the end of this call */	DCESRV_PULL_HANDLE(h, r2.in.handle, LSA_HANDLE_POLICY);	talloc_steal(mem_ctx, h);	r2.in.sids     = r->in.sids;	r2.in.names    = r->in.names;	r2.in.level    = r->in.level;	r2.in.count    = r->in.count;	r2.in.unknown1 = r->in.unknown1;	r2.in.unknown2 = r->in.unknown2;	r2.out.count   = r->out.count;	r2.out.names   = r->out.names;	status = dcesrv_lsa_LookupSids2(dce_call, mem_ctx, &r2);	if (dce_call->fault_code != 0) {		return status;	}	r->out.domains = r2.out.domains;	r->out.names   = r2.out.names;	r->out.count   = r2.out.count;	return status;}/*   lsa_LookupSids */NTSTATUS dcesrv_lsa_LookupSids(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,			       struct lsa_LookupSids *r){	struct lsa_LookupSids2 r2;	NTSTATUS status;	int i;	r2.in.handle   = r->in.handle;	r2.in.sids     = r->in.sids;	r2.in.names    = NULL;	r2.in.level    = r->in.level;	r2.in.count    = r->in.count;	r2.in.unknown1 = 0;	r2.in.unknown2 = 0;	r2.out.count   = r->out.count;	r2.out.names   = NULL;	status = dcesrv_lsa_LookupSids2(dce_call, mem_ctx, &r2);	if (dce_call->fault_code != 0) {		return status;	}	r->out.domains = r2.out.domains;	if (!r2.out.names) {		r->out.names = NULL;		return status;	}	r->out.names = talloc(mem_ctx, struct lsa_TransNameArray);	if (r->out.names == NULL) {		return NT_STATUS_NO_MEMORY;	}	r->out.names->count = r2.out.names->count;	r->out.names->names = talloc_array(r->out.names, struct lsa_TranslatedName, 					     r->out.names->count);	if (r->out.names->names == NULL) {		return NT_STATUS_NO_MEMORY;	}	for (i=0;i<r->out.names->count;i++) {		r->out.names->names[i].sid_type    = r2.out.names->names[i].sid_type;		r->out.names->names[i].name.string = r2.out.names->names[i].name.string;		r->out.names->names[i].sid_index   = r2.out.names->names[i].sid_index;	}	return status;}/*  lsa_LookupNames3*/NTSTATUS dcesrv_lsa_LookupNames3(struct dcesrv_call_state *dce_call,				 TALLOC_CTX *mem_ctx,				 struct lsa_LookupNames3 *r){	struct lsa_policy_state *policy_state;	struct dcesrv_handle *policy_handle;	int i;	struct loadparm_context *lp_ctx = dce_call->conn->dce_ctx->lp_ctx;	DCESRV_PULL_HANDLE(policy_handle, r->in.handle, LSA_HANDLE_POLICY);	policy_state = policy_handle->data;	r->out.domains = NULL;	r->out.domains = talloc_zero(mem_ctx,  struct lsa_RefDomainList);	if (r->out.domains == NULL) {		return NT_STATUS_NO_MEMORY;	}	r->out.sids = talloc_zero(mem_ctx,  struct lsa_TransSidArray3);	if (r->out.sids == NULL) {		return NT_STATUS_NO_MEMORY;	}	*r->out.count = 0;	r->out.sids->sids = talloc_array(r->out.sids, struct lsa_TranslatedSid3, 					   r->in.num_names);	if (r->out.sids->sids == NULL) {		return NT_STATUS_NO_MEMORY;	}	for (i=0;i<r->in.num_names;i++) {		const char *name = r->in.names[i].string;		const char *authority_name;		struct dom_sid *sid;		uint32_t sid_index;		enum lsa_SidType rtype;		NTSTATUS status2;		r->out.sids->count++;		r->out.sids->sids[i].sid_type    = SID_NAME_UNKNOWN;		r->out.sids->sids[i].sid         = NULL;		r->out.sids->sids[i].sid_index   = 0xFFFFFFFF;		r->out.sids->sids[i].unknown     = 0;		status2 = dcesrv_lsa_lookup_name(dce_call->event_ctx, lp_ctx, policy_state, mem_ctx, name, &authority_name, &sid, &rtype);		if (!NT_STATUS_IS_OK(status2) || sid->num_auths == 0) {			continue;		}		status2 = dcesrv_lsa_authority_list(policy_state, mem_ctx, rtype, authority_name, 						    sid, r->out.domains, &sid_index);		if (!NT_STATUS_IS_OK(status2)) {			return status2;		}		r->out.sids->sids[i].sid_type    = rtype;		r->out.sids->sids[i].sid         = sid;		r->out.sids->sids[i].sid_index   = sid_index;		r->out.sids->sids[i].unknown     = 0;		(*r->out.count)++;	}		if (*r->out.count == 0) {		return NT_STATUS_NONE_MAPPED;	}	if (*r->out.count != r->in.num_names) {		return STATUS_SOME_UNMAPPED;	}	return NT_STATUS_OK;}/*   lsa_LookupNames4  Identical to LookupNames3, but doesn't take a policy handle  */NTSTATUS dcesrv_lsa_LookupNames4(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,				 struct lsa_LookupNames4 *r){	struct lsa_LookupNames3 r2;	struct lsa_OpenPolicy2 pol;	NTSTATUS status;	struct dcesrv_handle *h;	/* No policy handle on the wire, so make one up here */	r2.in.handle = talloc(mem_ctx, struct policy_handle);	if (!r2.in.handle) {		return NT_STATUS_NO_MEMORY;	}	pol.out.handle = r2.in.handle;	pol.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	pol.in.attr = NULL;	pol.in.system_name = NULL;	status = dcesrv_lsa_OpenPolicy2(dce_call, mem_ctx, &pol);	if (!NT_STATUS_IS_OK(status)) {		return status;	}	/* ensure this handle goes away at the end of this call */	DCESRV_PULL_HANDLE(h, r2.in.handle, LSA_HANDLE_POLICY);	talloc_steal(mem_ctx, h);	r2.in.num_names = r->in.num_names;	r2.in.names = r->in.names;	r2.in.sids = r->in.sids;	r2.in.count = r->in.count;	r2.in.unknown1 = r->in.unknown1;	r2.in.unknown2 = r->in.unknown2;	r2.out.domains = r->out.domains;	r2.out.sids = r->out.sids;	r2.out.count = r->out.count;		status = dcesrv_lsa_LookupNames3(dce_call, mem_ctx, &r2);	if (dce_call->fault_code != 0) {		return status;	}		r->out.domains = r2.out.domains;	r->out.sids = r2.out.sids;	r->out.count = r2.out.count;	return status;}/*  lsa_LookupNames2*/NTSTATUS dcesrv_lsa_LookupNames2(struct dcesrv_call_state *dce_call,				 TALLOC_CTX *mem_ctx,				 struct lsa_LookupNames2 *r){	struct lsa_policy_state *state;	struct dcesrv_handle *h;	int i;	struct loadparm_context *lp_ctx = dce_call->conn->dce_ctx->lp_ctx;	r->out.domains = NULL;	DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY);	state = h->data;	r->out.domains = talloc_zero(mem_ctx,  struct lsa_RefDomainList);	if (r->out.domains == NULL) {		return NT_STATUS_NO_MEMORY;	}	r->out.sids = talloc_zero(mem_ctx,  struct lsa_TransSidArray2);	if (r->out.sids == NULL) {		return NT_STATUS_NO_MEMORY;	}	*r->out.count = 0;	r->out.sids->sids = talloc_array(r->out.sids, struct lsa_TranslatedSid2, 					   r->in.num_names);	if (r->out.sids->sids == NULL) {		return NT_STATUS_NO_MEMORY;	}	for (i=0;i<r->in.num_names;i++) {		const char *name = r->in.names[i].string;		const char *authority_name;		struct dom_sid *sid;		uint32_t rtype, sid_index;		NTSTATUS status2;		r->out.sids->count++;		r->out.sids->sids[i].sid_type    = SID_NAME_UNKNOWN;		r->out.sids->sids[i].rid         = 0xFFFFFFFF;		r->out.sids->sids[i].sid_index   = 0xFFFFFFFF;		r->out.sids->sids[i].unknown     = 0;		status2 = dcesrv_lsa_lookup_name(dce_call->event_ctx, lp_ctx, state, mem_ctx, name, 						 &authority_name, &sid, &rtype);		if (!NT_STATUS_IS_OK(status2)) {			continue;		}		status2 = dcesrv_lsa_authority_list(state, mem_ctx, rtype, authority_name, 						    sid, r->out.domains, &sid_index);		if (!NT_STATUS_IS_OK(status2)) {			return status2;		}		r->out.sids->sids[i].sid_type    = rtype;		r->out.sids->sids[i].rid         = sid->sub_auths[sid->num_auths-1];		r->out.sids->sids[i].sid_index   = sid_index;		r->out.sids->sids[i].unknown     = 0;		(*r->out.count)++;	}		if (*r->out.count == 0) {		return NT_STATUS_NONE_MAPPED;	}	if (*r->out.count != r->in.num_names) {		return STATUS_SOME_UNMAPPED;	}	return NT_STATUS_OK;}/*   lsa_LookupNames */NTSTATUS dcesrv_lsa_LookupNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,		       struct lsa_LookupNames *r){	struct lsa_LookupNames2 r2;	NTSTATUS status;	int i;	r2.in.handle    = r->in.handle;	r2.in.num_names = r->in.num_names;	r2.in.names     = r->in.names;	r2.in.sids      = NULL;	r2.in.level     = r->in.level;	r2.in.count     = r->in.count;	r2.in.unknown1  = 0;	r2.in.unknown2  = 0;	r2.out.count    = r->out.count;	status = dcesrv_lsa_LookupNames2(dce_call, mem_ctx, &r2);	if (dce_call->fault_code != 0) {		return status;	}	r->out.domains = r2.out.domains;	r->out.sids = talloc(mem_ctx, struct lsa_TransSidArray);	if (r->out.sids == NULL) {		return NT_STATUS_NO_MEMORY;	}	r->out.sids->count = r2.out.sids->count;	r->out.sids->sids = talloc_array(r->out.sids, struct lsa_TranslatedSid, 					   r->out.sids->count);	if (r->out.sids->sids == NULL) {		return NT_STATUS_NO_MEMORY;	}	for (i=0;i<r->out.sids->count;i++) {		r->out.sids->sids[i].sid_type    = r2.out.sids->sids[i].sid_type;		r->out.sids->sids[i].rid         = r2.out.sids->sids[i].rid;		r->out.sids->sids[i].sid_index   = r2.out.sids->sids[i].sid_index;	}	return status;}

⌨️ 快捷键说明

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