DSNAME[] LookupSPN(DsServer dc, uint flags, string name) { DSNAME[] rt = null; Guid? dcGuid = null; string[] spnMappings = null; string mappedSpn = null; RootDSE rootDse = LdapUtility.GetRootDSE(dc); rt = LookupAttr(dc, flags, "servicePrincipalName", name); if (rt != null) { return(rt); } string dsService = "CN=Directory Service,CN=Windows NT,CN=Services," + rootDse.configurationNamingContext; spnMappings = LdapUtility.GetAttributeValuesString(dc, dsService + rootDse.configurationNamingContext, "sPNMappings"); if (spnMappings != null) { mappedSpn = MapSPN(name, spnMappings); if (mappedSpn != null) { rt = LookupAttr(dc, flags, "servicePrincipalName", mappedSpn); if (rt != null) { return(rt); } } } if (GetServiceClassFromSPN(name) == DrsrUtility.DRSUAPI_RPC_INTERFACE_UUID.ToString().ToUpper() && GetServiceNameFromSPN(name) == DomainNameFromDN(rootDse.defaultNamingContext)) { dcGuid = new Guid(GetInstanceNameFromSPN(name)); if (dcGuid != null) { string objDn = LdapUtility.GetObjectDnByGuid(dc, rootDse.configurationNamingContext, dcGuid.Value); if (objDn != null) { objDn = GetParentObjectDn(objDn); if (objDn != null) { string srvRef = (string)GetAttributeValue(dc, objDn, "serverReference"); rt = new DSNAME[] { GetDsName(dc, srvRef).Value }; } } } } return(rt); }
public DS_NAME_RESULT_ITEMW LookupNames( DsServer dc, uint flags, uint formatOffered, uint formatDesired, string name) { DS_NAME_RESULT_ITEMW result = new DS_NAME_RESULT_ITEMW(); string referredDomain = ""; // Unknown name if (formatOffered == (uint)DS_NAME_FORMAT.DS_UNKNOWN_NAME) { return(LookupUnknownName(dc, flags, formatDesired, name)); } DSNAME[] rt = null; string domainName = null; switch (formatOffered) { case (uint)DS_NAME_FORMAT.DS_UNKNOWN_NAME: return(LookupUnknownName(dc, flags, formatDesired, name)); case (uint)DS_NAME_FORMAT.DS_FQDN_1779_NAME: { rt = LookupAttr(dc, flags, "distinguishedName", name); if (EnvironmentConfig.TestDS) { DSNAME?dcDsname = GetDsName(dc, RetrieveDCSuffixFromDn(name)); if (dcDsname != null) { domainName = DomainDNSNameFromDomain(dc, dcDsname.Value); } } } break; case (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME: { rt = LookupAttr(dc, flags, "sAMAccountName", LdapUtility.UserNameFromNT4AccountName(name)); if (EnvironmentConfig.TestDS) { domainName = LdapUtility.DomainNameFromNT4AccountName(name); } } break; case (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME: { rt = LookupUPNAndAltSecID(dc, flags, false, name); if (EnvironmentConfig.TestDS) { domainName = DomainNameFromUPN(name); } } break; case (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME: { DSNAME?v = LookupCanonicalName(dc, name); if (v != null) { rt = new DSNAME[] { v.Value } } ; else { rt = null; } if (EnvironmentConfig.TestDS) { domainName = DomainNameFromCanonicalName(name); } } break; case (uint)DS_NAME_FORMAT.DS_UNIQUE_ID_NAME: { RootDSE rootDse = LdapUtility.GetRootDSE(dc); // The GUID is in the curly braced form, so we need // to remove the braces first. if (!name.Contains("{") && name.Contains("}")) { rt = null; break; } string guidStr = name.Substring(1, name.Length - 2); Guid guid = new Guid(guidStr); string dn = null; dn = LdapUtility.GetObjectDnByGuid(dc, rootDse.rootDomainNamingContext, guid); if (dn == null) { dn = LdapUtility.GetObjectDnByGuid(dc, rootDse.configurationNamingContext, guid); } if (dn == null) { dn = LdapUtility.GetObjectDnByGuid(dc, rootDse.schemaNamingContext, guid); } if (dn == null) { break; } rt = new DSNAME[] { LdapUtility.CreateDSNameForObject(dc, dn) }; } break; case (uint)DS_NAME_FORMAT.DS_DISPLAY_NAME: { rt = LookupAttr(dc, flags, "displayName", name); } break; case (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME: { rt = LookupSPN(dc, flags, name); if (EnvironmentConfig.TestDS) { domainName = GetServiceNameFromSPN(name); } } break; case (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME: case (uint)formatOffered_Values.DS_STRING_SID_NAME: { rt = LookupSID(dc, flags, SidFromStringSid(name)); if (EnvironmentConfig.TestDS) { domainName = DomainNameFromSid(dc, DomainSidFromSid(SidFromStringSid(name))); } } break; case (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX: { DSNAME?v = LookupCanonicalName(dc, CanonicalNameFromCanonicalNameEx(name)); if (v == null) { rt = null; } else { rt = new DSNAME[] { v.Value } }; if (EnvironmentConfig.TestDS) { domainName = DomainNameFromCanonicalName(name); } } break; case (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN: case (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX: { rt = LookupAttr(dc, flags, "sAMAccountName", name); } break; case (uint)formatOffered_Values.DS_ALT_SECURITY_IDENTITIES_NAME: { rt = LookupAttr(dc, flags, "altSecurityIdentities", name); } break; case (uint)formatOffered_Values.DS_USER_PRINCIPAL_NAME_AND_ALTSECID: { rt = LookupUPNAndAltSecID(dc, flags, true, name); if (EnvironmentConfig.TestDS) { domainName = DomainNameFromUPN(name); } } break; default: rt = null; break; } if (rt == null && domainName != null) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_DOMAIN_ONLY; if (formatOffered == (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME || formatOffered == (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME || formatOffered == (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME || formatOffered == (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME || formatOffered == (uint)formatOffered_Values.DS_STRING_SID_NAME || formatOffered == (uint)formatOffered_Values.DS_USER_PRINCIPAL_NAME_AND_ALTSECID) { if (TrustInfo.IsDomainNameInTrustedForest(dc, domainName, ref referredDomain)) { result.pDomain = referredDomain; if ((flags & (uint)DRS_MSG_CRACKREQ_FLAGS.DS_NAME_FLAG_TRUST_REFERRAL) > 0) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_TRUST_REFERRAL; } else { result.status = DS_NAME_ERROR.DS_NAME_ERROR_DOMAIN_ONLY; } } } return(result); } if (rt == null) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NOT_FOUND; return(result); } if (rt.Length > 1) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NOT_UNIQUE; return(result); } DSNAME obj = rt[0]; if (formatOffered == (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX) { string uacStr = (string)GetAttributeValue( dc, LdapUtility.ConvertUshortArrayToString(obj.StringName), "userAccountControl"); uint uac = Convert.ToUInt32(uacStr); const uint ADS_UF_ACCOUNTDISABLE = 0x0002; const uint ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0x0100; if ((uac & (ADS_UF_ACCOUNTDISABLE | ADS_UF_TEMP_DUPLICATE_ACCOUNT)) > 0) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NOT_FOUND; return(result); } } string[] names = ConstructOutput(dc, obj, formatDesired); if ((names == null) && (obj.SidLen != 0) && ((flags & (uint)DRS_MSG_CRACKREQ_FLAGS.DS_NAME_FLAG_PRIVATE_RESOLVE_FPOS) > 0)) { if (formatDesired == (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME || formatDesired == (uint)DS_NAME_FORMAT.DS_DISPLAY_NAME || formatDesired == (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME || formatDesired == (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX || formatDesired == (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME || formatDesired == (uint)formatDesired_Values.DS_USER_PRINCIPAL_NAME_FOR_LOGON || formatDesired == (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME) { bool fCanonicalEx = false; if (formatDesired == (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX) { fCanonicalEx = true; } result = LookupFPO(fCanonicalEx, obj, result); return(result); } } if (names == null) { if (formatDesired == (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME || formatDesired == (uint)DS_NAME_FORMAT.DS_UNKNOWN_NAME) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_RESOLVING; } else { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NO_MAPPING; } return(result); } if (names.Length > 1) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NOT_UNIQUE; return(result); } result.pName = names[0]; if (EnvironmentConfig.TestDS) { string objDn = LdapUtility.ConvertUshortArrayToString(obj.StringName); DSNAME?dcDsname = GetDsName(dc, RetrieveDCSuffixFromDn(objDn)); string domainDn = ""; if (dcDsname != null) { domainDn = DomainDNSNameFromDomain(dc, dcDsname.Value); } result.pDomain = domainDn; } else { result.pDomain = ""; } result.status = DS_NAME_ERROR.DS_NAME_NO_ERROR; return(result); }