DirectoryEntry 仅调用域下的 dns 配置的 dc 服务器

Posted

技术标签:

【中文标题】DirectoryEntry 仅调用域下的 dns 配置的 dc 服务器【英文标题】:DirectoryEntry call to only dns configured dc servers under a domain 【发布时间】:2022-01-11 17:22:57 【问题描述】:

我们正在使用 DirectoryEntry 方法通过传递域名来查询 Active Directory。 在这个域下,有40个DC,其中20个配置了DNS,其余的都是非DNS配置的,维护不好也不可靠(连接到这些非DNS配置的DC通常会超时或线程被中止)。

现在,在使用 directoryEntry 方法进行 AD 调用时,有没有办法只查询配置了 DNS 的 DC?

目前,代码选择非 DNS 配置的 DC。

我知道根据地理位置和其他因素,在域中选择 DC 是一项域服务器任务。有什么方法可以修改代码以指示 DirectoryEntry 在我们传递域名时仅选择 DNS 配置的 DC。

c# .net 中的示例代码:

DirectoryEntry obEntry = new DirectoryEntry(@"LDAP://" + DomainName + "/<SID=" + new SecurityIdentifier(groupSid, 0).Value + ">", serviceAccountUser, serviceAccountPassword);                                                    
if (obEntry.Guid != null)

    string distinguishedNameObtained = Convert.ToString(obEntry.Properties["distinguishedName"].Value);

【问题讨论】:

【参考方案1】:

您不能告诉DirectoryEntry 选择 DC 的子集,但您可以告诉它使用一个特定的 DC。在您的代码中,您可以将 DomainName 变量设置为 DC 的名称:

var DomainName = "dc1.example.com";

这是最简单的方法,但现在您已经硬编码了一个 DC,如果该 DC 出现故障,您必须更改代码,这并不理想。

如果您想从可用的 DC 中进行选择,您可以尝试使用 Domain.GetCurrentDomain()Domain.GetDomain()(如果您运行它的计算机不在您要连接的同一域上),然后检查DomainControllers 收藏。我不知道您所说的没有为 DNS 配置 DC 是什么意思,所以我不确定这是否可以从 DomainController 类中确定。看看documentation for DomainController,看看是否有什么可以使用的。如果您想从特定站点选择 DC,则有一个 SiteName 属性。

如果您能够做到这一点,那么您可以在 LDAP 字符串中使用 DomainControllerName 属性。

【讨论】:

以上是关于DirectoryEntry 仅调用域下的 dns 配置的 dc 服务器的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp cookie 只在本页有效,相同域下的其他页面就调用无效了,我也加了时间

DirectoryEntry.Invoke() 在“ChangePassword”调用中引发错误

DNS and BIND

C++反汇编第一讲,不同作用域下的构造和析构的识别

跨域下的iframe自适应高度

dns配置和各种文件中注意的点