DS_NAME_RESULT_ITEMW LookupUnknownName(DsServer dc, uint flags, uint formatDesired, string name)
        {
            DS_NAME_RESULT_ITEMW result = new DS_NAME_RESULT_ITEMW();

            uint[] formatOrder = new uint[] {
                (uint)DS_NAME_FORMAT.DS_FQDN_1779_NAME,
                (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME,
                (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME,
                (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME,
                (uint)DS_NAME_FORMAT.DS_UNIQUE_ID_NAME,
                (uint)DS_NAME_FORMAT.DS_DISPLAY_NAME,
                (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME,
                (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME,
                (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX
            };

            foreach (uint format in formatOrder)
            {
                result = LookupNames(dc, flags, format, formatDesired, name);
                if (result.status != DS_NAME_ERROR.DS_NAME_ERROR_NOT_FOUND)
                {
                    return(result);
                }
            }

            return(result);
        }
        /// <summary>
        /// Verify CrackNames results.
        /// </summary>
        /// <param name="machine"></param>
        /// <param name="retVal"></param>
        /// <param name="dwInVersion"></param>
        /// <param name="req"></param>
        /// <param name="outVersion"></param>
        /// <param name="reply"></param>
        public void VerifyDrsCrackNames(
            EnvironmentConfig.Machine machine,
            uint retVal,
            uint dwInVersion,
            DRS_MSG_CRACKREQ req,
            uint?outVersion,
            DRS_MSG_CRACKREPLY?reply)
        {
            // IDL_DRSCrackNames supports only V1
            testSite.Assert.IsTrue(outVersion == 1,
                                   "IDL_DRSCrackNames: Checking outVersion - got: {0}, expect: {1}, outVersion should be 1.", outVersion, 1);
            testSite.Assert.IsNotNull(reply, "IDL_DRSCrackNames: Checking outMessage - outMessage should not be null.");
            testSite.Assert.IsNotNull(reply.Value.V1.pResult, "IDL_DRSCrackNames: Checking pResult - pResult in outMessage should not be null.");


            DsServer srv = (DsServer)EnvironmentConfig.MachineStore[machine];

            uint flag = req.V1.dwFlags;

            switch (flag)
            {
            case (uint)DRS_MSG_CRACKREQ_FLAGS.DS_NAME_FLAG_GC_VERIFY:
            {
                const uint ERROR_DS_GCVERIFY_ERROR = 0x20e1;

                bool isGc = ldapAd.IsGc(srv);
                if (!isGc)
                {
                    testSite.Assert.IsTrue(
                        retVal == ERROR_DS_GCVERIFY_ERROR,
                        "IDL_DRSCrackNames: Cannot verify the GC server {0}",
                        srv.NetbiosName);
                }
                else
                {
                    testSite.Assert.IsTrue(
                        retVal == (uint)DS_NAME_ERROR.DS_NAME_NO_ERROR,
                        "IDL_DRSCrackNames: DC {0} is not a GC server",
                        srv.NetbiosName);
                }
            }
            break;

            default:
                break;
            }

            // formats
            uint formatOffered = req.V1.formatOffered;

            switch (formatOffered)
            {
            case (uint)DS_NAME_FORMAT.DS_INVALID_NAME:
                // Invalid name, just break.
                break;

            case (uint)formatOffered_Values.DS_LIST_SITES:
                VerifyCrackNamesListAllSites(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_SERVERS_IN_SITE:
                VerifyCrackNamesListServersInSite(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_DOMAINS_IN_SITE:
                VerifyCrackNamesListDomainsInSite(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_SERVERS_FOR_DOMAIN_IN_SITE:
                VerifyCrackNamesListServersForDomainInSite(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_INFO_FOR_SERVER:
                VerifyCrackNamesListInfoForServer(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_ROLES:
                VerifyCrackNamesListRoles(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_DOMAINS:
                VerifyCrackNamesListDomains(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_NCS:
                VerifyCrackNamesListNcs(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_SERVERS_WITH_DCS_IN_SITE:
                VerifyCrackNamesListServersWithDcsInSite(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_LIST_GLOBAL_CATALOG_SERVERS:
                VerifyCrackNamesListGlobalCatalogServers(srv, req, reply);
                break;

            case (uint)formatOffered_Values.DS_MAP_SCHEMA_GUID:
                VerifyCrackNamesMapSchemaGuid(srv, req, reply);
                break;

            case (uint)DS_NAME_FORMAT.DS_UNKNOWN_NAME:
            case (uint)DS_NAME_FORMAT.DS_FQDN_1779_NAME:
            case (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME:
            case (uint)DS_NAME_FORMAT.DS_DISPLAY_NAME:
            case (uint)DS_NAME_FORMAT.DS_UNIQUE_ID_NAME:
            case (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME:
            case (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME:
            case (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX:
            case (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME:
            case (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME:
            case (uint)DS_NAME_FORMAT.DS_DNS_DOMAIN_NAME:
            case (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN:
            case (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX:
            case (uint)formatOffered_Values.DS_ALT_SECURITY_IDENTITIES_NAME:
            case (uint)formatOffered_Values.DS_STRING_SID_NAME:
            case (uint)formatOffered_Values.DS_USER_PRINCIPAL_NAME_AND_ALTSECID:
            {
                for (int i = 0; i < req.V1.cNames; ++i)
                {
                    DS_NAME_RESULT_ITEMW r = ldapAd.LookupNames(
                        srv,
                        req.V1.dwFlags,
                        req.V1.formatOffered,
                        req.V1.formatDesired,
                        req.V1.rpNames[i]
                        );

                    // status code
                    testSite.Assert.IsTrue(
                        r.status == reply.Value.V1.pResult[0].rItems[i].status,
                        "IDL_DRSCrackNames: Verify status failed, expect: {0}, got: {1}",
                        r.status,
                        reply.Value.V1.pResult[0].rItems[i].status
                        );

                    // name
                    if (r.pName == null)
                    {
                        testSite.Assert.IsNull(reply.Value.V1.pResult[0].rItems[i].pName,
                                               "IDL_DRSCrackNames: Verify pName failed, expect: null, got: {0}.",
                                               reply.Value.V1.pResult[0].rItems[i].pName);
                    }
                    else
                    {
                        testSite.Assert.IsTrue(
                            r.pName == reply.Value.V1.pResult[0].rItems[i].pName,
                            "IDL_DRSCrackNames: Verify pName failed, expect: {0}, got: {1}.",
                            r.pName,
                            reply.Value.V1.pResult[0].rItems[i].pName
                            );
                    }

                    // domain
                    if (r.pDomain == null)
                    {
                        testSite.Assert.IsNull(reply.Value.V1.pResult[0].rItems[i].pDomain,
                                               "IDL_DRSCrackNames: Verify pDomain failed, expect: null, got: {0}.",
                                               reply.Value.V1.pResult[0].rItems[i].pDomain);
                    }
                    else
                    {
                        testSite.Assert.IsTrue(
                            r.pDomain == reply.Value.V1.pResult[0].rItems[i].pDomain,
                            "IDL_DRSCrackNames: Verify pDomain failed, expect: {0}, got: {1}.",
                            r.pDomain,
                            reply.Value.V1.pResult[0].rItems[i].pDomain
                            );
                    }
                }
            }
            break;

            default:
                throw new NotImplementedException();
            }
        }
Beispiel #3
0
 internal static DirectoryServiceNameResult Create(DS_NAME_RESULT_ITEMW item)
 {
     return(new DirectoryServiceNameResult(item));
 }
        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);
        }
Beispiel #5
0
 private DirectoryServiceNameResult(DS_NAME_RESULT_ITEMW item)
 {
     Status = item.status;
     Domain = item.pDomain;
     Name   = item.pName;
 }