【问题标题】:Inexplainable InvalidOperationException with GroupPrincipal and SAM PrincipalContextGroupPrincipal 和 SAM PrincipalContext 无法解释的 InvalidOperationException
【发布时间】:2011-01-06 09:45:18
【问题描述】:

我正在尝试像这样创建一个委托人:

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

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

group.Save();

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

System.DirectoryServices.AccountManagement: 属性对该商店无效 输入。

如果我不设置Description属性,上面的代码工作得很好,只是没有组的描述。

我是不是做错了什么?

提前致谢。

编辑: 我相信我已经找到了解决方法(对于任何可能感兴趣的人)。 可以按照上面相同的方式创建一个组:

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

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

string path = "WinNT://" + machineName + "/" + group.SamAccountName;
DirectoryEntry dEntry = new DirectoryEntry(path);

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

dEntry.Properties["description"].Add("Some Decription");
dEntry.CommitChanges();

应该这样做。

【问题讨论】:

  • 我想你已经用谷歌搜索了这个并找到了这个线程? directoryprogramming.net/forums/thread/2163.aspx。它说明了它与域控制器一起工作,但不是与 SAM 一起工作,但没有为后者提供解决方案。
  • 是的,唯一类似的问题,但遗憾的是没有解决方案。
  • PS:通过单击“重要”按钮和“我也可以重现”链接来敦促 Microsoft 解决问题会有所帮助:connect.microsoft.com/VisualStudio/feedback/…
  • 我很乐意给你一个 UpVote,但我需要 15 个代表点才能做到这一点:)。一旦我有了这些 - 我会回到这个并履行我的职责:)还添加了一个解决方法

标签: c# api properties principal


【解决方案1】:

答案重写

我得到了你的答案,但你可能不太喜欢它。网上资料稀少,但在代码中,可以解释:

  • 创建GroupPrincipal 时,会向其中添加Context。这个 Context 在内部是一个隐藏类型:SAMStoreCtx,它继承自一个抽象类型 StoreCtx;
  • 您调用的 GroupPrincipal 上的每个属性都将调用 IsValidProperty,它是 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;
    }
    
  • 仔细查看该代码(我花了一点时间),您会发现错误。使用 and 运算符将位标志与none 进行比较的行将始终生成 ObjectMask.None。因此,第二个 if 语句始终为真。
  • 当此方法返回 false 时,调用代码(描述的属性设置器)会引发异常。

我认为这是 Microsoft 库中的错误。它只发生在 SAMStoreCtx 上。也许这是故意的,但是因为代码在那里但总是返回 false 让我相信程序员打算使用 or 运算符。使用 DisplayName 等其他属性检查我的发现会引发与预期相同的异常。

您可以就此联系 Microsoft 并向他们展示此线程。我还没有检查 .NET 4.0 的新测试版,它可能会以不同的方式出现。您可以通过下载 Reflector 并加载相关的 .NET 程序集自行检查。

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

【讨论】:

  • 这就是问题所在。当我不设置描述时,代码可以正常工作,创建组等等......它没有描述,只是因为它没有设置。但是,现在我想为组设置描述,但我不能这样做,因为我收到此错误 ->“System.DirectoryServices.AccountManagement:属性对于此商店类型无效”。我在混淆吗?
  • @GertArnold,该页面似乎是最近才被删除的,因为它仍然在 Google 搜索和站点地图中可用(connect.microsoft.com/Sitemap0.aspx,警告,非常大的页面!)。我没有收到任何警告,它似乎没有被移动......据我所知,它没有解决。
  • 谢谢 Abel,好像是一些授权问题。尽管我已登录,但我也无法访问站点地图。好吧,这不是你的小菜一碟。
【解决方案2】:

您可以使用 GetUnderlyingObject 来获取组的 DirectoryEntry 而不是搜索它。

var newGroup = new GroupPrincipal(context, groupName);

// You must save first           
newGroup.Save();

var entry = (DirectoryEntry) newGroup.GetUnderlyingObject();

entry.Properties["description"].Add(description);
entry.CommitChanges(); 

【讨论】:

  • 今天我想分配 AD LDS UserPrincipal 的 sAmAccountName 属性时,这对我有用。不支持直接分配 SamAccountName 属性。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 2020-04-13
  • 2016-09-19
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多