【问题标题】:LDAP error (0x8000500c) when accessing SOME attributes through C# code with administrator credentials使用管理员凭据通过 C# 代码访问某些属性时出现 LDAP 错误 (0x8000500c)
【发布时间】:2014-07-26 16:52:39
【问题描述】:

我正在尝试使用 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”不是自定义属性。因此,我的问题可能与链接帖子中的问题不匹配。 我真的很绝望,不知道该怎么办。任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net ldap directoryservices


    【解决方案1】:

    几件事:

    1. adminUserName 是登录名,例如“jsmith”而不是“cn=...”
    2. 如果您的盒子在同一个域中,那么通常您不需要指定用户/密码
    3. 确保 uid (uid=foo) 是正确的属性
    4. 尝试使用 PropertiesToLoad

      DirectorySearcher searcher = new DirectorySearcher(ouEntry, ...);
      searcher.PropertiesToLoad.Add("displayName");
      

    虽然您说它适用于“givenName”,但您可以尝试测试第三方工具以检查您的连接是否没有问题。例如。你可以试试LDAP Browser,尝试提供相同的连接数据并搜索你的过滤器字符串,看看它是否返回所有需要的数据。

    【讨论】:

    • 感谢您的回答。参考您的建议:1.)您确定吗?它不应该是 LDAP 专有名称吗?您还如何区分不同 OU 的用户?无论如何,即使我将"cn=Directory Manager" 替换为"Directory Manager",我仍然在同一行得到相同的错误。 2.)好的,但无论如何它都应该工作,对吧? 3.) 这是正确的财产。我还使用LDAP Admin 作为 LDAP 浏览器并检查了所有属性。 4.) 我之前尝试过,但没有任何区别。你还有其他建议吗?感谢您的帮助。
    • 对不起,我看到你说,这是一个 LDAP 而不是 AD。在这种情况下,您是对的,它可能是 CN=... 但是奇怪的是,当您在没有 CN= 的情况下更改“目录管理器”时它不会更改其输出 - 所以看起来这就是问题所在。尝试指定“abc”而不是真实密码 - 我相信你会得到相同的结果。您是否尝试过 AuthenticationType.None 以外的其他方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多