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

C# 遍历属性时出现ActiveDirectory错误0x8000500c,c#,active-directory,directoryservices,C#,Active Directory,Directoryservices,我得到了以下代码片段(SomeName/SomeDomain在我的代码中包含真实值) 它会为前21个属性打印OK,但在以下情况下失败: COMException {"Unknown error (0x8000500c)"} at System.DirectoryServices.PropertyValueCollection.PopulateList() at System.DirectoryServices.PropertyValueCollection..ctor(Directo

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

它会为前21个属性打印OK,但在以下情况下失败:

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(新[]{“theAttributeName”})
(这没有帮助)

更新2

entry.InvokeGet(“theAttributeName”)
可以工作(并且没有
RefreshCache

有人能解释一下原因吗

更新3

如果我将FQDN提供给以下项,它将起作用:
LDAP://srv00014.ssab.com/CN=SomeName,xxxx

赏金

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

  • 为什么
    entry.Properties[“customAttributeName”]
    会失败并出现上述异常
  • 为什么
    entry.InvokeGet(“customAttributeName”)
    有效
  • 异常的原因
  • 如何让两者都起作用

在此处使用Err.exe工具

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

谷歌搜索“目录数据类型无法转换为本机数据类型/从本机数据类型转换为本机数据类型”,并找到以下KB:

如果您希望从一台不支持的机器访问自定义属性 自定义属性所在域的一部分(凭据 登录用户的身份(无所谓)需要完全通过 对象的限定名正在尝试访问架构 客户端计算机上的缓存未正确刷新,无需全部刷新 您进行的schema.refresh()调用


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

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


删除这个文件,程序就可以正常工作:)

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

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调用中出现此错误


我通过为网站的应用程序池使用正确的用户解决了这个问题。一旦我解决了这个问题,它就开始工作了。

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

该实用程序直接使用SearchResult对象,而服务使用的是DirectoryEntry

它浓缩成这样

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);

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

我的第一个猜测是为什么会是权限。您是在什么环境下运行的?@Mr.defessional:刚刚使用一个应该具有足够权限的帐户进行了尝试。没有区别:(您可以尝试通过构造函数显式指定“God”凭据吗?就像一个健全性检查一样。@Mr.D:我们有一个自定义属性,我无法访问该属性。@jgauffin您可以告诉我们什么操作系统版本和SP级别吗?这第22个属性是什么?您可以使用ADSIEDIT.MSC查看它吗?当您查看此第22个属性?查看此属性时,MMC AD管理单元会起什么作用?woops自定义属性忘记MMC位,看,这可能是一个误会,但不是一个未设置的属性,是吗?
byte[] bytes = (byte[])((result.Properties[customProp][0]));
String customValue = System.Text.Encoding.UTF8.GetString(bytes);