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);
        }