WinNT ADSI 提供程序 - 跨域用户查找

WinNT ADSI provider - cross domain user lookup

''我在一些身份验证代码中使用 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

解决方案是确保 运行 来自的本地计算机具有远程域的 DNS 后缀

此解决方案有效,但我想指出原因。经过数小时的尝试确定 dns 后缀对 WinNT 提供程序的 NetBIOS 解析的重要性后,我发现客户端首先调用本地域控制器以对 NetBIOS 名称进行 LSA_LookupNames 调用,然后它取回远程 domain/forest 中的域控制器以转到负责该 NetBIOS 名称的域控制器。在该查找之后,它会尝试连接到 returned 的域控制器 - 但服务器的名称是简单的主机或 NetBIOS 名称!因此,它必须查找并为此使用 DNS,按照客户端网络配置中规定的顺序尝试后缀。因此,作为查找的一部分,域正在由本地 AD 域正确转换,但客户端无法弄清楚如何到达该 DC,因为 LSA_LookupNames 不是 return FQDN,只是一个主机名。

希望这会节省其他人我搜索的时间 - 有时只是崩溃并打开 wireshark 是值得的。