我正在尝试使用C#和.NET库“System.DirectoryServices”从LDAP(而非AD)条目中读取属性。
我的LDAP条目如下:
dn: uid=foo,ou=People,dc=companyname,dc=local
objectClass: posixAccount
objectClass: top
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
gidNumber: 0
givenName: Foo
sn: Bar
displayName: Foo Bar
uid: foo
homeDirectory: /
cn: foo bar
uidNumber: 9846
userPassword: {SHA}Ys23Ag/5IOWqZCw9QGaVDdHwH00=
mail: foo@dodo.net
我使用的Linux LDAP服务器是“389”,也称为“Fedora Directory Server”。我的C#代码如下所示:
string value = null;
DirectoryEntry ouEntry = null;
string path = "LDAP://192.168.150.192/ou=People, dc=companyname, dc=local";
string adminUserName = "cn=Directory Manager";
string adminPassword = "supersecureadminpassword";
ouEntry = new DirectoryEntry(path, adminUserName, adminPassword, AuthenticationTypes.None);
DirectorySearcher searcher = new DirectorySearcher(ouEntry, "uid=foo");
SearchResult result = searcher.FindOne();
DirectoryEntry userEntry = result.GetDirectoryEntry();
var props = userEntry.Properties.PropertyNames;
if(userEntry.Properties.Contains("givenName"))
value = userEntry.Properties["givenName"].Value.ToString();
代码完美无缺。但是,如果我将“givenName”替换为“displayName”,则代码会在if(userEntry.Properties.Contains("displayName"))
行System.Runtime.InteropServices.COMException: Unknown error (0x8000500c)
上失败。
即使在检查属性列表props
时显示属性“displayName”,也会发生这种情况。
我已阅读this post,因为它似乎是一个类似的问题。但是,我不知道如何解决问题,因为我所拥有的只是一个静态IP地址,而不是我的LDAP服务器的完全限定名称。
有谁知道我的代码中的问题是什么,以及它是否与上述帖子有关?我该如何解决这个问题呢?
提前多多感谢。
更新1:
我也尝试用LDAP服务器的Linux主机名(shell命令hostname
的输出)替换IP地址,但这也不起作用。另外,据我所知,“displayName”不是自定义属性。因此,我的问题可能与链接帖子中的问题不匹配。
我真的很绝望,不知道该怎么办。任何帮助将不胜感激。
答案 0 :(得分:0)
少数事情:
尝试使用PropertiesToLoad
DirectorySearcher searcher = new DirectorySearcher(ouEntry, ...);
searcher.PropertiesToLoad.Add("displayName");
虽然您说它适用于" givenName",但您可能会尝试测试第三方工具以检查您的连接是否存在问题。例如。您可以尝试LDAP Browser,尝试提供相同的连接数据并搜索您的过滤字符串,看看它是否返回所有必需的数据。