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 + -
显示快捷键?