使用 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