使用 C# DirectoryServices 访问活动目录时出现问题

Posted

技术标签:

【中文标题】使用 C# DirectoryServices 访问活动目录时出现问题【英文标题】:Problem while accessing active directory using C# DirectoryServices 【发布时间】:2011-11-16 00:53:51 【问题描述】:
  string ldapPath = "ldap://db.debian.org:389/uid=ma,ou=users,dc=debian,dc=org";
            DirectoryEntry dEntry = new DirectoryEntry(ldapPath, null, null, AuthenticationTypes.Anonymous);

            DirectorySearcher search = new DirectorySearcher(dEntry);

            search.Filter = "((objectClass=*))";
            search.FindAll();

我正在使用我的 C# 表单应用程序中的上述代码。每当我调用 FindAll() 时,我都会收到如下异常。

System.Runtime.InteropServices.COMException 未处理 消息="未知错误 (0x80005000)" Source="System.DirectoryServices" 错误代码=-2147463168 堆栈跟踪: 在 System.DirectoryServices.DirectoryEntry.Bind(布尔 抛出如果失败) 在 System.DirectoryServices.DirectoryEntry.Bind() 在 System.DirectoryServices.DirectoryEntry.get_AdsObject() 在 System.DirectoryServices.DirectorySearcher.FindAll(布尔 找到MoreThanOne) 在 System.DirectoryServices.DirectorySearcher.FindAll() 在 LDAPApp.Form1.button1_Click(Object sender, EventArgs e) 中 H:\Raj\LDAP\LDAPApp\LDAPApp\Form1.cs:第 37 行 在 System.Windows.Forms.Control.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs 事件) 在 System.Windows.Forms.Control.WmMouseUp(消息& m, MouseButtons 按钮,Int32 点击) 在 System.Windows.Forms.Control.WndProc(消息和 m) 在 System.Windows.Forms.ButtonBase.WndProc(消息和 m) 在 System.Windows.Forms.Button.WndProc(消息和 m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息& m) 在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(味精和味精) 在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 原因, Int32 pvLoopData) 在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 原因,ApplicationContext 上下文) 在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 原因,ApplicationContext 上下文) 在 System.Windows.Forms.Application.Run(窗体 mainForm) 在 LDAPApp.Program.Main() 中 H:\Raj\LDAP\LDAPApp\LDAPApp\Program.cs:第 18 行 在 System.AppDomain._nExecuteAssembly(程序集程序集, 字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile, 证据 assemblySecurity, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象 状态) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态) 在 System.Threading.ThreadHelper.ThreadStart() 内部异常:

请告诉我我在这里做错了什么。

提前致谢。

【问题讨论】:

这并不完全适用于您的情况,但在我的情况下,当我有一个尾随“/”并且不需要包含专有名称时,我遇到了这个错误。例如:LDAP://db.debian.org:389 有效,但 LDAP://db.debian.org:389/ 异常,错误代码为 -2147463168。 【参考方案1】:

LDAP 路径中的 LDAP 协议标识符 (LDAP://) 必须为大写。 如果您以小写形式编写 LDAP 协议标识符,则会收到 0x80005000 错误 代码(未知错误)。以下代码 sn-p 应该可以工作:

string ldapPath = "LDAP://db.debian.org:389/uid=ma,ou=users,dc=debian,dc=org";
        DirectoryEntry dEntry = new DirectoryEntry(ldapPath, null, null,  AuthenticationTypes.Anonymous);

DirectorySearcher search = new DirectorySearcher(dEntry);

search.Filter = "((objectClass=*))";
search.FindAll();

希望,这会有所帮助。

【讨论】:

以上是关于使用 C# DirectoryServices 访问活动目录时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

无法在 IIS 托管应用程序上使用 System.DirectoryServices.AccountManagement 获取 LDAP 数据

.NET 3.5 - System.DirectoryServices.AccountManagement - 组上的 AdvancedSearchFilter?

System.DirectoryServices & IIS - 获取用户名

错误 0x80005000 和 DirectoryServices

引用 System.DirectoryServices.ResultPropertyCollection

模拟不适用于 DirectoryServices