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