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

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

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

访问被拒绝

但是,在将客户端的登录用户添加到服务器的“管理员”组中后,它可正常工作。

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

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