Esempio n. 1
0
        private string GetDomainController(string server, string domainDns, DsGetDcNameFlags flags, ref DcLocatorMode mode)
        {
            string key = BuildDcCacheKey(server, domainDns, flags);

            DcLocatorMode mode2 = mode;

            try
            {
                if (flags.HasFlag(DsGetDcNameFlags.DS_FORCE_REDISCOVERY))
                {
                    return(dcCache.AddOrUpdate(
                               key,
                               a => this.GetDc(server, domainDns, flags, ref mode2),
                               (a, b) =>
                    {
                        this.logger.LogTrace("New DC requested");
                        return this.GetDc(server, domainDns, flags, ref mode2);
                    }));
                }

                return(dcCache.GetOrAdd(key, k => this.GetDc(server, domainDns, flags, ref mode2)));
            }
            finally
            {
                mode = mode2;
            }
        }
Esempio n. 2
0
        public string GetDc(string server, string domainDns, DsGetDcNameFlags flags, ref DcLocatorMode mode)
        {
            string dc;

            if (server != null)
            {
                bool hadNextClosestSite = flags.HasFlag(DsGetDcNameFlags.DS_TRY_NEXTCLOSEST_SITE);

                if (mode.HasFlag(DcLocatorMode.RemoteDcLocator))
                {
                    try
                    {
                        flags |= DsGetDcNameFlags.DS_TRY_NEXTCLOSEST_SITE;
                        this.logger.LogTrace("Remote DCLocator: Finding domain controller for server {server}, domain {domainDns} with flags {flags}", server, domainDns, flags.ToString());
                        dc = NativeMethods.GetDomainControllerForDnsDomain(server, domainDns, null, flags);
                        this.logger.LogTrace("Remote DCLocator: Found DC {dc} for server {server} in domain {domainDns}, with flags {flags}", dc, server, domainDns, flags.ToString());
                        return(dc);
                    }
                    catch (DirectoryException dex) //when (dex.InnerException is Win32Exception wex && wex.NativeErrorCode == 1722)
                    {
                        mode &= ~DcLocatorMode.RemoteDcLocator;
                        this.logger.LogWarning(dex, "Could not connect to server {server} to find DC", server);
                    }
                }

                if (!hadNextClosestSite)
                {
                    flags &= ~DsGetDcNameFlags.DS_TRY_NEXTCLOSEST_SITE;
                }

                if (mode.HasFlag(DcLocatorMode.SiteLookup))
                {
                    this.logger.LogTrace("Manual DCLocator: Finding site for server {server}, domain {domainDns} with flags {flags}", server, domainDns, flags.ToString());
                    string site = this.GetComputerSiteNameManual(domainDns, server);

                    if (site != null)
                    {
                        try
                        {
                            this.logger.LogTrace("Manual DCLocator: Attempting to find domain controller for site {site}, in domain {domainDns} with flags {flags}", site, domainDns, flags.ToString());

                            dc = NativeMethods.GetDomainControllerForDnsDomain(null, domainDns, site, flags);
                            this.logger.LogTrace("Manual DCLocator: Found DC {dc} for site {site} in domain {domainDns}, with flags {flags}", dc, site, domainDns, flags.ToString());
                            return(dc);
                        }
                        catch (DirectoryException dex) when(dex.InnerException is Win32Exception wex && wex.NativeErrorCode == 1355)
                        {
                            mode &= ~DcLocatorMode.SiteLookup;
                            this.logger.LogWarning(dex, "There are no domain controllers in the site {site}", site);
                        }
                    }
                    else
                    {
                        this.logger.LogTrace("Manual DCLocator: No site found for server {server}", server);
                    }
                }
            }

            this.logger.LogTrace("Local DCLocator: Finding domain controller for domain {domainDns} with flags {flags}", domainDns, flags.ToString());
            dc = NativeMethods.GetDomainControllerForDnsDomain(null, domainDns, null, flags);
            this.logger.LogTrace("Local DCLocator: Found DC {dc} for domain {domainDns}, with flags {flags}", dc, domainDns, flags.ToString());
            return(dc);
        }