我需要编写一个 .NET 应用程序,该应用程序将在尚未成为域成员的计算机上的Windows PE中运行时查询 Active Directory。
我们在 Microsoft 部署工具包任务序列期间运行此程序(请注意,MDT 2012 已配置为将 .NET 支持加载到 WinPE 环境中 - .NET 应用程序正在启动而没有任何问题)。
我正在使用下面的代码绑定到域:
DirectoryEntry entry = new DirectoryEntry(
path,
username,
password,
AuthenticationTypes.ServerBind | AuthenticationTypes.Secure);
我尝试了path
两种形式:
LDAP://domainServer/dc=domain,dc=name
而且也没有域控制器名称
LDAP://dc=domain,dc=name
我也尝试过使用username
两种形式domain\username
,也只是username
.
该DirectoryEntry
对象似乎构造得很好,但是当我尝试执行Console.Writeline(entry.Name)
以确认已建立有效连接时,出现以下异常:
System.Runtime.InteropServices.COMException (0x80005000): System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
在 System.DirectoryServices.DirectoryEntry.Bind() 在 System.DirectoryServices.DirectoryEntry.get_Name() 的未知错误 (0x80005000)
我尝试了此代码的其他变体,尝试使用各种过滤器执行 LDAP 查询,尝试在 VBScript 中重写它等等......但上面发布的代码是我能想出的最简单的例子,它重现了这个问题。
根据我的阅读,在这样的场景中,您总是需要使用AuthenticationTypes.ServerBind
,这就是我尝试在 ADSI LDAP 路径中指定代码的原因。但是上面的代码有什么问题?对我来说,它看起来像是将参数中所有需要的信息传递给DirectoryEntry
构造函数。