Active Directory 服务接口 WinNT 提供程序的用户身份验证问题

本文介绍 Active Directory 服务接口 (ADSI) WinNT 提供程序的用户身份验证问题。

适用于:Windows 10 - 所有版本
原始 KB 数: 218497

总结

ADSI OpenDsObject 方法或 ADsOpenDsObject C 帮助程序函数允许在打开对象时向目录服务器提供身份验证凭据。 将此方法与 Active Directory 服务接口 WinNT 提供程序配合使用时,应注意许多问题。

详细信息

Active Directory 服务接口 WinNT 提供程序使用 WNetAddConnection2 函数与 \\servername\IPC$ 建立连接,以便与远程服务器建立这些凭据。 此方法很有用,因为它不需要 NT 客户端的特殊特权,并且它在 Windows 上运行,并且支持跨不受信任的域进行身份验证。

遗憾的是,WNetAddConnection2 函数固有几个缺点,如下所示:

  • 如果客户端计算机上运行的任何进程都已建立到目标服务器的任何连接, 则 WNetAddConnection2 函数无法在用于现有连接的任何凭据下建立新连接。

    如果尝试对新帐户进行身份验证,将收到一个冲突的凭据错误。 如果尝试对现有帐户进行身份验证,则任何密码都将有效(有效或无效)。 当你从许多系统进程建立与域控制器的连接的域控制器中获取对象时,这是一个特别的问题。

  • 如果在目标计算机上启用了来宾帐户,可以同时传递无效的用户名和密码,并创建连接。

  • 因此,系统不会引用计数连接,因此,如果任何进程(包括 Active Directory 服务接口客户端进程)会删除连接,则使用该连接的所有进程都必须写入该连接以在发现连接已删除时重新建立连接。

使用 WinNT 提供程序时,建议在执行 Active Directory 服务接口代码之前,通过登录到具有适当凭据的域帐户或使用 LogonUser 函数(这需要提升的权限)来向目标服务器进行身份验证。 我们还建议不要使用 Active Directory 服务接口 OpenDsObject 方法验证客户端计算机信任的任何域中的用户凭据。

如果尝试验证来自不受信任的域的帐户,请使用 Active Directory 服务接口 OpenDsObject 方法,记住上面列出的问题,并了解将通过网络发送未加密的密码。 可以通过使用 SSL(或 HTTPS)连接在每个一组不受信任的域上运行验证代码作为服务来提供加密来克服这些限制。 为此,请使用每个不受信任的域集中 IIS 服务器上的验证.asp文件,并使用基本身份验证通过 HTTPS 连接到该文件。

Active Directory 服务接口 OpenDsObject 方法使用登录用户的凭据来访问 IIS。 将忽略作为参数提供的用户名和密码。 看到以下错误消息:

拒绝访问

但是,在将客户端登录的用户添加到服务器的 Administrators 组中后,它才有效。

如果使用以下脚本代码,它也有效。

Set objLogon = CreateObject("LoginAdmin.ImpersonateUser")  
objLogon.Logon "Administrator", "AdminPassword", "Machinename"  
Set oNS = GetObject("IIS:")
Set oRoot = oNS.OpenDSObject("IIS://SERVER/SHARE", "Mordor\administrator", "Gollum", 1)'User credentials are ignored  
objLogon.Logoff
Set objLogon = Nothing