1

我需要编写一个 .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构造函数。

4

1 回答 1

1

有一种方法可以让它工作,但微软不支持它。这篇文章对我帮助很大。它可以工作、测试和批准用于部署新计算机:)

ADSIxXX.inf从 zip 文件中获取C:\ADSI

将以下文件从 Windows/System32 复制到C:\ADSI. 细心的建筑 x86 x64——

   adsldp.dll
   adsmsext.dll
   adsnt.dll
   mscoree.dll
   mscorier.dll
   mscories.dll

安装bootimage.wim

无需加载包(您的 WinPE 已配置为加载 .NET API),只需添加 ADSI 驱动程序:

Dism /Image:C:\Mount /Add-Driver /Driver:C:\ADSI\ADSIxXX.inf /forceunsigned

无需加载他的脚本

卸载bootimage.wim

然后它就完成了,如果你的 .NET 应用程序实现得很好;)我不喜欢 PIPE | 也支持作为参数,只需设置为AuthenticationTypes.Secure-

DirectoryEntry entry = new DirectoryEntry(
  path,
  username,
  password,
  AuthenticationTypes.ServerBind | AuthenticationTypes.Secure);

链接: http: //www.deploymentresearch.com/Research/tabid/62/EntryId/74/ADSI-plugin-for-WinPE-4-0.aspx#AddComment

于 2013-10-18T15:28:52.733 回答