这工作正常:
Dim ADEntry = New DirectoryEntry(ldapPath + userName, au, ap)
Dim Name = ADEntry.Properties("FullName").Value.ToString()
Return Name
但这不会:
Dim ADEntry = New DirectoryEntry(ldapPath + userName, au, ap)
Dim firstName = ADEntry.Properties("givenName").Value.ToString()
Dim lastName = ADEntry.Properties("sn").Value.ToString()
Return firstName + " " + lastName
我也尝试使用ADEntry.Properties("givenName")(0)。Value.ToString() 当我在某处读到时,它们可能会被索引。 我得到了相同的结果,"对象引用未设置为对象的实例"。
这些确实都是索引属性,您访问它们的方式对我来说看起来不错。
不过,作为一种好的做法,您应该在尝试读取此属性之前检查以确保确实存在与此属性关联的值 - 您可以使用简单的.Contains
检查:
If ADEntry.Properties.Contains("givenName") Then
如果计算结果为 false
,您将知道没有要读取的值,因此您可以避免收到的对象引用错误。
此外,您可能希望考虑使用DirectorySearcher
来预加载您感兴趣的属性,而不是直接路径到DirectoryEntry
。我是一个C#的人,但是当我开发LDAP组件时,这个页面非常有帮助:
通过DirectorySearch
和SearchResult
检索属性 (C#) http://www.ianatkinson.net/computing/adcsharp.htm
我遇到了同样的问题。
我知道这并不能解决您的问题,但是要获得名字和姓氏,我必须使用以下代码:
System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent();
string[] a = Context.User.Identity.Name.Split('\');
System.DirectoryServices.DirectoryEntry ADEntry = new System.DirectoryServices.DirectoryEntry("WinNT://" + a[0] + "/" + a[1]);
string FullName = ADEntry.Properties["FullName"].Value.ToString();
string FirstName = FullName.Substring(FullName.IndexOf(",") + 2);
string Lastname = FullName.Substring(0, FullName.IndexOf(","));
以防万一可能对其他人有所帮助