C#和VB.NET LDAP搜索不同?
发布时间:2020-12-15 08:39:17 所属栏目:百科 来源:网络整理
导读:有谁知道C#和VB.NET中DirectorySearcher对象上的FindAll()方法的实现是否有区别?根据我的理解,它们都被“编译”到MSIL并由CLR以相同的方式处理.与我们的ADAM / LDAP系统相反,下面的C#代码会抛出错误,而下面的VB.NET则不会. 这是C#异常堆栈: at System.Dire
有谁知道C#和VB.NET中DirectorySearcher对象上的FindAll()方法的实现是否有区别?根据我的理解,它们都被“编译”到MSIL并由CLR以相同的方式处理.与我们的ADAM / LDAP系统相反,下面的C#代码会抛出错误,而下面的VB.NET则不会.
这是C#异常堆栈: at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) at System.DirectoryServices.DirectoryEntry.Bind() at System.DirectoryServices.DirectoryEntry.get_AdsObject() at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne) at System.DirectoryServices.DirectorySearcher.FindAll() 这是C#错误: System.Runtime.InteropServices.COMException was unhandled Message="The parameter is incorrect.rn" Source="System.DirectoryServices" ErrorCode=-2147024809 C#代码: private void button1_Click(object sender,EventArgs e) { DirectoryEntry root = new DirectoryEntry("LDAP://directory.corp.com/OU=Person,OU=Lookups,O=Corp,C=US",null,AuthenticationTypes.Anonymous); DirectorySearcher mySearcher = new DirectorySearcher(root); mySearcher.Filter = "(uid=ssnlxxx)"; mySearcher.PropertiesToLoad.Add("cn"); mySearcher.PropertiesToLoad.Add("mail"); SearchResultCollection searchResultCollection = null; searchResultCollection = mySearcher.FindAll(); //this is where the error occurs try { foreach (SearchResult resEnt in searchResultCollection) { Console.Write(resEnt.Properties["cn"][0].ToString()); Console.Write(resEnt.Properties["mail"][0].ToString()); } } catch (DirectoryServicesCOMException ex) { MessageBox.Show("Failed to connect LDAP domain,Check username or password to get user details."); } } 这是有效的VB.NET代码: Private Sub Button1_Click(ByVal sender As Object,ByVal e As EventArgs) Handles Button1.Click Dim root As New DirectoryEntry("LDAP://directory.corp.com/OU=People,O=corp,vbNull,authenticationType:=DirectoryServices.AuthenticationTypes.Anonymous) Dim searcher As New DirectorySearcher(root) searcher.Filter = "(uid=ssnlxxx)" searcher.PropertiesToLoad.Add("cn") searcher.PropertiesToLoad.Add("mail") Dim results As SearchResultCollection Try results = searcher.FindAll() Dim result As SearchResult For Each result In results Console.WriteLine(result.Properties("cn")(0)) Console.WriteLine(result.Properties("mail")(0)) Next result Catch ex As Exception MessageBox.Show("There was an error") End Try End Sub 解决方法
我猜想在VB.NET代码中,你在DirectoryEntry构造函数中为两个参数传递vbNull(而不是Nothing),并且在C#代码中传递null. vbNull大概来自邪恶的Microsoft.VisualBasic程序集,不应该使用它.
DirectoryEntry的构造函数检查用户名和密码参数以查看它们是否为空.如果vbNull!= Nothing,构造函数将不会将它们视为null并且行为会有所不同. 如果你使用Nothing,看看VB.NET代码是否抛出异常,或者看看C#代码是否通过使用String.Empty而不是null来工作. 此外,在您的C#代码中,对FindAll的调用不在try块之内. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |