Vb.net 可以从LDAP获取全名,但不能从givenName或sn获取全名

Vb.net 可以从LDAP获取全名,但不能从givenName或sn获取全名,vb.net,ldap,Vb.net,Ldap,这很好: 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 = ADEntr

这很好:

    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(),因为我在某个地方读到它们可能会被索引。我得到了相同的结果,“对象引用未设置为对象的实例”。

这些实际上都是索引属性,您访问它们的方式在我看来很好

不过,作为一种良好的做法,在尝试读取该属性之前,您应该检查以确保确实存在与该属性关联的值-您可以使用一个简单的
。包含
检查:

If ADEntry.Properties.Contains("givenName") Then
如果计算结果为
false
,您将知道没有可读取的值,因此可以避免收到的对象引用错误

此外,您可能希望研究使用
DirectorySearcher
预加载您感兴趣的属性,而不是直接路径到
DirectoryEntry
。我是一个C#人,但当我开发LDAP组件时,这个页面非常有用:

通过
DirectorySearch
SearchResult
(C#)检索属性

我遇到了同样的问题

我知道这并不能解决你的问题,但要得到名字和姓氏,我必须使用以下代码:

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(",")); 

以防万一,这可能会对其他人有所帮助

谢谢你的回复,但我使用了两个不同的帐户,并通过Active Directory用户和计算机界面手动确认他们确实列出了名字和姓氏。我将尝试使用“Contains”检查,但无论结果是真是假,我仍然存在一些问题:)