使用GroupPrincipal和SAM PrincipalContext无法解释的InvalidOperationException

Ale*_*exR 2 c# api properties principal

我想创建一个这样的Principal:

PrincipalContext pc = new PrincipalContext(ContextType.Machine);
GroupPrincipal group = new GroupPrincipal(pc);

group.Name = "Some Group Name";
group.Description = "Some Group Name Description";

group.Save();
Run Code Online (Sandbox Code Playgroud)

但是,当代码执行时,我收到以下异常消息:

System.DirectoryServices.AccountManagement:属性对此商店类型无效.

如果我没有设置Description属性,上面的代码完全正常,只是没有组的描述.

难道我做错了什么?

提前致谢.

编辑: 我相信我找到了一个解决方案(对于任何可能感兴趣的人).可以使用与上面相同的方式创建组:

PrincipalContext pc = new PrincipalContext(ContextType.Machine);
GroupPrincipal group = new GroupPrincipal(pc);
group.Save();
Run Code Online (Sandbox Code Playgroud)

现在您创建一个DirectoryEntry并将其链接到新创建的组,如下所示:

string path = "WinNT://" + machineName + "/" + group.SamAccountName;
DirectoryEntry dEntry = new DirectoryEntry(path);
Run Code Online (Sandbox Code Playgroud)

这允许访问该组的属性,但我感兴趣的是描述,所以:

dEntry.Properties["description"].Add("Some Decription");
dEntry.CommitChanges();
Run Code Online (Sandbox Code Playgroud)

这应该做到这一点.

Abe*_*bel 7

答案重写

我有你的答案,但你可能不喜欢它.互联网上的信息很少,但在代码中,它是可以解释的:

  • 创建GroupPrincipal时,会向其中添加一个Context.此Context在内部属于隐藏类型:SAMStoreCtx,它继承自抽象类型StoreCtx;
  • 您调用的GroupPrincipal上的每个属性都将调用IsStalidProperty,它是SamStoreCtx的内部成员;
  • 但是,它不会对Name属性执行此操作;
  • 在SAMStoreCtx中,有一段代码如下(Reflector输出):

    internal override bool IsValidProperty(Principal p, string propertyName)
    {
        ObjectMask none = ObjectMask.None;
        if (!ValidPropertyMap.TryGetValue(propertyName, out none))
        {
            return false;
        }
        if ((MaskMap[p.GetType()] & none) <= ObjectMask.None)
        {
            return false;
        }
        return true;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 仔细看看那段代码(花了我一会儿),你就会发现错误.将位标志与none使用和运算符进行比较的行总是会产生ObjectMask.None.第二个if语句总是如此.
  • 当此方法返回false时,调用代码(Description Settor of Description)会引发异常.

我相信这是Microsoft库中的一个错误.它只发生在SAMStoreCtx上.也许它是有目的的,但因为代码存在但总是返回false使我相信程序员打算使用or-operator代替.使用DisplayName等其他属性检查我的发现会引发与预期相同的异常.

您可以与Microsoft联系并向他们展示此主题.我没有检查.NET 4.0的新版本,它可能会以不同的方式显示出来.您可以通过下载Reflector并加载相关的.NET程序集来自行检查.

编辑:我已经为您联系了Microsoft,并在此处通过connect.microsoft.com报告了该错误.如果您愿意,可以在那里关注问题.