1

我正在尝试在 C# 中绑定到 Active Directory 服务器,但在现场我似乎在测试环境中遇到了无法重现的问题。

我得到一个例外

System.Runtime.InteropServices.COMException (0x8007203A): The server is not operational.
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.RefreshCache()
   at System.DirectoryServices.DirectoryEntry.FillCache(String propertyName)
   at System.DirectoryServices.DirectoryEntry.get_NativeGuid()  

代码看起来像这样

// domainStr = "LDAP://domainname/rootDSE
using (var de = new DirectoryEntry(domainStr, Username, Password))
{
    var guid = de.NativeGuid;
}

但是,如果我尝试连接域控制器(domainStr = "LDAP://domainController/rootDSE"或完全限定domainStr = "LDAP://domainController.DomainName"),它就可以正常工作。

我试过

var d = Domain.GetDomain(new DirectoryContext(
            DirectoryContextType.Domain,
            domainStr,
            Username,
            Password));

但是这样做时我得到了完全相同的异常。

我想知道我是否做错了什么,也许不同的 LDAP URL 会更好,或者这是我遇到的常见问题(即使谷歌搜索提出了这个问题,我还没有找到适合我的解决方案)

另外可能值得指出的是,运行该软件的服务器不在任何 Active Directory 中,并且我有一个我连接到的 AD 列表(因此尝试连接时的用户名和密码)

4

1 回答 1

2

这是因为 DNS 服务器没有该域的 A 记录。当您将域名传递给 DNS 服务器时,它不知道要解析到哪个 IP 地址。通常,您不会遇到此问题,因为默认情况下 MS Windows 内置 DNS 服务器会为您添加此 A 记录。然而,在大型企业中,很多时候,他们并没有使用 MS Windows 内置的 DNS 服务器。在许多情况下,人们只是懒得在域名中添加 A 记录。

如果可能,您可以要求您的客户将 A 记录添加到 DNS 服务器。或者,请您的客户修复 c:\windows\system32\drivers\etc\hosts 文件。然后,在此处添加一条 A 记录。你可以让它指向任何一个域控制器。但是,这种方法无法扩展,因为不同站点的用户都将域名解析为相同的 IP 地址。对于一些远程站点用户,他们可能会遇到速度缓慢的问题。

如果您还想解决可伸缩性问题,您可以考虑模拟用户而不是将用户名密码传递到DirectoryEntry. 一旦你模拟了域用户,你就可以像这样使用无服务器绑定LDAP://RootDSE

于 2011-03-22T02:24:16.953 回答