遍历属性时出现ActiveDirectory错误0x8000500c

本文关键字:ActiveDirectory 错误 0x8000500c 属性 遍历 | 更新日期: 2023-09-27 18:27:57

我得到了以下代码段(SomeName/SomeDomain在我的代码中包含实值)

var entry = new DirectoryEntry("LDAP://CN=SomeName,OU=All Groups,dc=SomeDomain,dc=com");
foreach (object property in entry.Properties)
{
    Console.WriteLine(property);
}

它对前21个属性打印正常,但随后失败:

COMException {"Unknown error (0x8000500c)"}
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.PropertyEnumerator.get_Entry()
   at System.DirectoryServices.PropertyCollection.PropertyEnumerator.get_Current()
   at ActiveDirectory.Tests.IntegrationTests.ObjectFactoryTests.TestMethod1() in MyTests.cs:line 22

为什么?我该如何预防?

更新

这是一个失败的自定义属性。

在枚举属性之前,我尝试过使用entry.RefreshCache()entry.RefreshCache(new[]{"theAttributeName"})(这没有帮助)。

更新2

entry.InvokeGet("theAttributeName")工作(并且没有RefreshCache)。

有人能解释一下原因吗?

更新3

如果我为项目提供FQDN,它就会工作:LDAP://srv00014.ssab.com/CN=SomeName,xxxx

赏金

我正在寻找一个解决以下问题的答案:

  • 为什么entry.Properties["customAttributeName"]出现上述异常而失败
  • entry.InvokeGet("customAttributeName")工作原理
  • 异常的原因
  • 如何让两者都发挥作用

遍历属性时出现ActiveDirectory错误0x8000500c

如果要从不是自定义属性所在域的一部分(凭据登录用户的数量无关紧要)对象的限定名正在尝试访问架构客户端计算机上的缓存没有正确刷新,更不用说了进行的schema.refresh()调用

在这里找到。考虑到问题的更新,这听起来像是你的问题。

我也有同样的故障。通过列出DirectoryEntry中的属性,我读到并看到了很多关于错误0x8000500c的问题。使用进程监视器(Sysinternals),我可以看到我的进程已经读取了一个模式文件。此架构文件保存在C: ''Users''xxxx''AppData''Local''Microsoft''Windows''SchCache''xyz.sch.

删除此文件,程序运行良好:)

在此处使用Err.exe工具

http://www.microsoft.com/download/en/details.aspx?id=985

它吐出:
对于十六进制0x8000500c/decimal-2147463156:
E_ADS_CANT_CONVERT_DATATYPE adserr.h
目录数据类型无法转换为本机数据类型或从本机数据数据类型转换而来
DS数据类型
为"0x8000500c"找到1个匹配项

在谷歌上搜索"目录数据类型无法转换为本机数据类型",发现此KB:http://support.microsoft.com/kb/907462

我刚刚遇到了这个问题,我的问题是一个web应用程序。我有一段代码,它将用户从IIS中的windows身份验证中拉出来,并从AD中提取他们的信息

using (var context = new PrincipalContext(ContextType.Domain))
{
    var name = UserPrincipal.Current.DisplayName;
    var principal = UserPrincipal.FindByIdentity(context, this.user.Identity.Name);
    if (principal != null)
    {
        this.fullName = principal.GivenName + " " + principal.Surname;
    }
    else
    {
        this.fullName = string.Empty;
    }
}

这在我的测试中运行良好,但当我发布网站时,它会在FindByIdentity调用中出现此错误。

我通过在网站的应用程序池中使用正确的用户来解决这个问题。我一解决这个问题,这个就开始起作用了

我在使用一个奇怪数据类型的自定义属性时遇到了同样的问题。我有一个实用程序可以提取价值,但服务中的一些更结构化的代码不会。

当服务使用DirectoryEntry时,实用工具直接使用SearchResult对象。

它浓缩成这样。

SearchResult result;
result.Properties[customProp];     // might work for you
result.Properties[customProp][0];  // works for me. see below
using (DirectoryEntry entry = result.GetDirectoryEntry())
{
    entry.Properties[customProp]; // fails
    entry.InvokeGet(customProp);  // fails as well for the weird data
}

我的直觉是,SearchResult不像是一个执行器,它会返回它所拥有的一切。

当它被转换为DirectoryEntry时,这段代码会混淆奇怪的数据类型,这样即使InvokeGet也会失败。

我的实际提取代码和额外的[0]看起来像:

byte[] bytes = (byte[])((result.Properties[customProp][0]));
String customValue = System.Text.Encoding.UTF8.GetString(bytes);

我从网站上的另一个帖子中找到了第二行。