📄 cracknames.c
字号:
return DsCrackNameUPN(sam_ctx, mem_ctx, smb_krb5_context, format_flags, format_offered, format_desired, name, info1); } info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; return WERR_OK; case -1: DEBUG(2, ("DsCrackNameOneFilter result search failed: %s", ldb_errstring(sam_ctx))); info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR; return WERR_OK; default: switch (format_offered) { case DRSUAPI_DS_NAME_FORMAT_CANONICAL: case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX: { const char *canonical_name = NULL; /* Not required, but we get warnings... */ /* We may need to manually filter further */ for (i = 0; i < ldb_ret; i++) { switch (format_offered) { case DRSUAPI_DS_NAME_FORMAT_CANONICAL: canonical_name = ldb_dn_canonical_string(mem_ctx, result_res[i]->dn); break; case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX: canonical_name = ldb_dn_canonical_ex_string(mem_ctx, result_res[i]->dn); break; } if (strcasecmp_m(canonical_name, name) == 0) { result = result_res[i]; break; } } if (!result) { info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; return WERR_OK; } } default: info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE; return WERR_OK; } } info1->dns_domain_name = ldb_dn_canonical_string(mem_ctx, result->dn); W_ERROR_HAVE_NO_MEMORY(info1->dns_domain_name); p = strchr(info1->dns_domain_name, '/'); if (p) { p[0] = '\0'; } /* here we can use result and domain_res[0] */ switch (format_desired) { case DRSUAPI_DS_NAME_FORMAT_FQDN_1779: { info1->result_name = ldb_dn_alloc_linearized(mem_ctx, result->dn); W_ERROR_HAVE_NO_MEMORY(info1->result_name); info1->status = DRSUAPI_DS_NAME_STATUS_OK; return WERR_OK; } case DRSUAPI_DS_NAME_FORMAT_CANONICAL: { info1->result_name = samdb_result_string(result, "canonicalName", NULL); info1->status = DRSUAPI_DS_NAME_STATUS_OK; return WERR_OK; } case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX: { /* Not in the virtual ldb attribute */ return DsCrackNameOneSyntactical(mem_ctx, DRSUAPI_DS_NAME_FORMAT_FQDN_1779, DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX, result->dn, name, info1); } case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: { const struct dom_sid *sid = samdb_result_dom_sid(mem_ctx, result, "objectSid"); const char *_acc = "", *_dom = ""; if (samdb_find_attribute(sam_ctx, result, "objectClass", "domain")) { ldb_ret = ldb_search_exp_fmt(sam_ctx, mem_ctx, &domain_res, partitions_basedn, LDB_SCOPE_ONELEVEL, domain_attrs, "(ncName=%s)", ldb_dn_get_linearized(result->dn)); if (ldb_ret != LDB_SUCCESS) { DEBUG(2, ("DsCrackNameOneFilter domain ref search failed: %s", ldb_errstring(sam_ctx))); info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR; return WERR_OK; } switch (domain_res->count) { case 1: break; case 0: info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; return WERR_OK; default: info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE; return WERR_OK; } _dom = samdb_result_string(domain_res->msgs[0], "nETBIOSName", NULL); W_ERROR_HAVE_NO_MEMORY(_dom); } else { _acc = samdb_result_string(result, "sAMAccountName", NULL); if (!_acc) { info1->status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING; return WERR_OK; } if (dom_sid_in_domain(dom_sid_parse_talloc(mem_ctx, SID_BUILTIN), sid)) { _dom = "BUILTIN"; } else { const char *attrs[] = { NULL }; struct ldb_result *domain_res2; struct dom_sid *dom_sid = dom_sid_dup(mem_ctx, sid); if (!dom_sid) { return WERR_OK; } dom_sid->num_auths--; ldb_ret = ldb_search_exp_fmt(sam_ctx, mem_ctx, &domain_res, NULL, LDB_SCOPE_BASE, attrs, "(&(objectSid=%s)(objectClass=domain))", ldap_encode_ndr_dom_sid(mem_ctx, dom_sid)); if (ldb_ret != LDB_SUCCESS) { DEBUG(2, ("DsCrackNameOneFilter domain search failed: %s", ldb_errstring(sam_ctx))); info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR; return WERR_OK; } switch (domain_res->count) { case 1: break; case 0: info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; return WERR_OK; default: info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE; return WERR_OK; } ldb_ret = ldb_search_exp_fmt(sam_ctx, mem_ctx, &domain_res2, partitions_basedn, LDB_SCOPE_ONELEVEL, domain_attrs, "(ncName=%s)", ldb_dn_get_linearized(domain_res->msgs[0]->dn)); if (ldb_ret != LDB_SUCCESS) { DEBUG(2, ("DsCrackNameOneFilter domain ref search failed: %s", ldb_errstring(sam_ctx))); info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR; return WERR_OK; } switch (domain_res2->count) { case 1: break; case 0: info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; return WERR_OK; default: info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE; return WERR_OK; } _dom = samdb_result_string(domain_res2->msgs[0], "nETBIOSName", NULL); W_ERROR_HAVE_NO_MEMORY(_dom); } } info1->result_name = talloc_asprintf(mem_ctx, "%s\\%s", _dom, _acc); W_ERROR_HAVE_NO_MEMORY(info1->result_name); info1->status = DRSUAPI_DS_NAME_STATUS_OK; return WERR_OK; } case DRSUAPI_DS_NAME_FORMAT_GUID: { struct GUID guid; guid = samdb_result_guid(result, "objectGUID"); info1->result_name = GUID_string2(mem_ctx, &guid); W_ERROR_HAVE_NO_MEMORY(info1->result_name); info1->status = DRSUAPI_DS_NAME_STATUS_OK; return WERR_OK; } case DRSUAPI_DS_NAME_FORMAT_DISPLAY: { info1->result_name = samdb_result_string(result, "displayName", NULL); if (!info1->result_name) { info1->result_name = samdb_result_string(result, "sAMAccountName", NULL); } if (!info1->result_name) { info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; } else { info1->status = DRSUAPI_DS_NAME_STATUS_OK; } return WERR_OK; } case DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL: { info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE; return WERR_OK; } case DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN: case DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY: { info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR; return WERR_OK; } default: info1->status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING; return WERR_OK; }}/* Given a user Principal Name (such as foo@bar.com), * return the user and domain DNs. This is used in the KDC to then * return the Keys and evaluate policy */NTSTATUS crack_user_principal_name(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, const char *user_principal_name, struct ldb_dn **user_dn, struct ldb_dn **domain_dn) { WERROR werr; struct drsuapi_DsNameInfo1 info1; werr = DsCrackNameOneName(sam_ctx, mem_ctx, 0, DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL, DRSUAPI_DS_NAME_FORMAT_FQDN_1779, user_principal_name, &info1); if (!W_ERROR_IS_OK(werr)) { return werror_to_ntstatus(werr); } switch (info1.status) { case DRSUAPI_DS_NAME_STATUS_OK: break; case DRSUAPI_DS_NAME_STATUS_NOT_FOUND: case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY: case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE: return NT_STATUS_NO_SUCH_USER; case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR: default: return NT_STATUS_UNSUCCESSFUL; } *user_dn = ldb_dn_new(mem_ctx, sam_ctx, info1.result_name); if (domain_dn) { werr = DsCrackNameOneName(sam_ctx, mem_ctx, 0, DRSUAPI_DS_NAME_FORMAT_CANONICAL, DRSUAPI_DS_NAME_FORMAT_FQDN_1779, talloc_asprintf(mem_ctx, "%s/", info1.dns_domain_name), &info1); if (!W_ERROR_IS_OK(werr)) { return werror_to_ntstatus(werr); } switch (info1.status) { case DRSUAPI_DS_NAME_STATUS_OK: break; case DRSUAPI_DS_NAME_STATUS_NOT_FOUND: case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY: case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE: return NT_STATUS_NO_SUCH_USER; case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR: default: return NT_STATUS_UNSUCCESSFUL; } *domain_dn = ldb_dn_new(mem_ctx, sam_ctx, info1.result_name); } return NT_STATUS_OK; }/* Given a Service Principal Name (such as host/foo.bar.com@BAR.COM), * return the user and domain DNs. This is used in the KDC to then * return the Keys and evaluate policy */NTSTATUS crack_service_principal_name(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, const char *service_principal_name, struct ldb_dn **user_dn, struct ldb_dn **domain_dn) { WERROR werr; struct drsuapi_DsNameInfo1 info1; werr = DsCrackNameOneName(sam_ctx, mem_ctx, 0, DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL, DRSUAPI_DS_NAME_FORMAT_FQDN_1779, service_principal_name, &info1); if (!W_ERROR_IS_OK(werr)) { return werror_to_ntstatus(werr); } switch (info1.status) { case DRSUAPI_DS_NAME_STATUS_OK: break; case DRSUAPI_DS_NAME_STATUS_NOT_FOUND: case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY: case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE: return NT_STATUS_NO_SUCH_USER; case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR: default: return NT_STATUS_UNSUCCESSFUL; } *user_dn = ldb_dn_new(mem_ctx, sam_ctx, info1.result_name); if (domain_dn) { werr = DsCrackNameOneName(sam_ctx, mem_ctx, 0, DRSUAPI_DS_NAME_FORMAT_CANONICAL, DRSUAPI_DS_NAME_FORMAT_FQDN_1779, talloc_asprintf(mem_ctx, "%s/", info1.dns_domain_name), &info1); if (!W_ERROR_IS_OK(werr)) { return werror_to_ntstatus(werr); } switch (info1.status) { case DRSUAPI_DS_NAME_STATUS_OK: break; case DRSUAPI_DS_NAME_STATUS_NOT_FOUND: case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY: case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE: return NT_STATUS_NO_SUCH_USER; case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR: default: return NT_STATUS_UNSUCCESSFUL; } *domain_dn = ldb_dn_new(mem_ctx, sam_ctx, info1.result_name); } return NT_STATUS_OK; }NTSTATUS crack_name_to_nt4_name(TALLOC_CTX *mem_ctx, struct event_context *ev_ctx, struct loadparm_context *lp_ctx, uint32_t format_offered, const char *name, const char **nt4_domain, const char **nt4_account){ WERROR werr; struct drsuapi_DsNameInfo1 info1; struct ldb_context *ldb; char *p; /* Handle anonymous bind */ if (!name || !*name) { *nt4_domain = ""; *nt4_account = ""; return NT_STATUS_OK; } ldb = samdb_connect(mem_ctx, ev_ctx, lp_ctx, system_session(mem_ctx, lp_ctx)); if (ldb == NULL) { return NT_STATUS_INTERNAL_DB_CORRUPTION; } werr = DsCrackNameOneName(ldb, mem_ctx, 0, format_offered, DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT, name, &info1); if (!W_ERROR_IS_OK(werr)) { return werror_to_ntstatus(werr); } switch (info1.status) { case DRSUAPI_DS_NAME_STATUS_OK: break; case DRSUAPI_DS_NAME_STATUS_NOT_FOUND: case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY: case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE: return NT_STATUS_NO_SUCH_USER; case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR: default: return NT_STATUS_UNSUCCESSFUL; } *nt4_domain = talloc_strdup(mem_ctx, info1.result_name); p = strchr(*nt4_domain, '\\'); if (!p) { return NT_STATUS_INVALID_PARAMETER; } p[0] = '\0'; if (p[1]) { *nt4_account = talloc_strdup(mem_ctx, &p[1]); } if (!*nt4_account || !*nt4_domain) { return NT_STATUS_NO_MEMORY; } return NT_STATUS_OK;}NTSTATUS crack_auto_name_to_nt4_name(TALLOC_CTX *mem_ctx, struct event_context *ev_ctx, struct loadparm_context *lp_ctx, const char *name, const char **nt4_domain, const char **nt4_account){ uint32_t format_offered = DRSUAPI_DS_NAME_FORMAT_UKNOWN; /* Handle anonymous bind */ if (!name || !*name) { *nt4_domain = ""; *nt4_account = ""; return NT_STATUS_OK; } if (strchr_m(name, '=')) { format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779; } else if (strchr_m(name, '@')) { format_offered = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL; } else if (strchr_m(name, '\\')) { format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT; } else if (strchr_m(name, '/')) { format_offered = DRSUAPI_DS_NAME_FORMAT_CANONICAL; } return crack_name_to_nt4_name(mem_ctx, ev_ctx, lp_ctx, format_offered, name, nt4_domain, nt4_account);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -