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

本文介绍了 WinNT 提供程序的 Active Directory 服务接口 (用户) 问题。

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

摘要

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

更多信息

Active Directory 服务接口 WinNT 提供程序使用 WNetAddConnection2 函数建立与服务器名称 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。 将忽略作为参数给定的用户名和密码。 收到以下错误消息:

访问被拒绝

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

它还适用于使用以下脚本代码。

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