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