''我在一些身份验证代码中使用WinNT ADSI提供程序,该代码从Active Directory中查找用户并检查其组成员身份。
我们遇到了一个问题,这个问题让这个问题适用于跨域访问。我们按照here(https://support.microsoft.com/kb/241737?wa=wsignin1.0)列出的步骤在Active Directory中设置了对外部域的交叉引用。这应该是允许WinNT查找用户所需的全部内容。
当代码运行时,我们只在域下找到一个对象(在下面的循环中) - " Schema"。这是不正确的 - 有很多子对象。
这个问题似乎是间歇性的 - 同一个系统一个月前没有这个问题。我意识到这将很难调查,但对ADSI有更好理解的人可能会更清楚。
以下代码说明了问题:
Dim objUser
Dim sUserName
Set ns = GetObject("WinNT://DOMAINNAME")
msgbox "Found " & ns.AdsPath & " (" & ns.Class &")" ' Shown
'ns.Filter = Array("User") ' Commented to show ALL objects
For Each UserObj in ns
Dim UserName
UserName = UserObj.Name & " " & UserObj.Class ' Returns "Schema Schema"
msgbox UserName
Next
答案 0 :(得分:1)
此解决方案有效,但我想指出原因。经过几个小时的尝试来确定dns后缀对WinNT提供程序的NetBIOS解析的重要性,我发现客户端首先调用本地域控制器对NetBIOS名称进行LSA_LookupNames调用,然后它返回一个域远程域/林中的控制器转到哪个负责该NetBIOS名称。在该查找之后,它尝试连接到返回的域控制器 - 但服务器的名称是简单主机或NetBIOS名称!因此,它必须查看它并使用DNS,按照客户端的网络配置中规定的顺序尝试后缀。因此,作为查找的一部分,本地AD域正在正确地翻译域,但是客户端无法弄清楚如何到达该DC,因为LSA_LookupNames不返回FQDN,只返回主机名。 / p>
希望这可以节省其他人搜索时间 - 有时候只需要分解并打开wireshark就可以了。
答案 1 :(得分:0)
解决方案是确保运行查询的本地计算机具有远程域的DNS后缀