【问题标题】:Why in active directory group cannot be created as groupType = Local为什么在活动目录组中不能创建为 groupType = Local
【发布时间】:2019-06-28 10:46:07
【问题描述】:

我无法理解为什么在活动目录中将组创建为 groupType 的“本地”不起作用。它抛出以下异常:

 System.DirectoryServices.DirectoryServicesCOMException (0x80072035): The server is unwilling to process the request.

以下是代码示例:

        var parentEntry = new DirectoryEntry(ParentContainer);

        var groupToCreate = parentEntry.Children.Add(this.AttributeType + this.Name, "group");

        groupToCreate.Properties["description"].Add(this.Description);

        groupToCreate.Properties["displayName"].Add(Name);

        groupToCreate.Properties["groupType"].Add((int)GroupType.DomainLocalGroup); --> this line throws error. 


        groupToCreate.CommitChanges();

如果我从 GroupType.DomainLocalGroup 更改为 GroupType.DomainGlobalGroup,一切正常。 任何机构都可以告诉我如何解决这个问题吗?

【问题讨论】:

  • 因为异常消息说“服务器不愿意处理请求” 我怀疑AD服务器由于某些安全限制而不愿意处理这个请求。你检查你是否有足够的权限来调用这个请求?
  • 当然,如果我用 GroupType.DomainGlobalGroup 替换它,它可以完美运行,没有任何异常。 Mroeover,我从 Microsoft 全新安装了 Windows 2016 服务器映像并设置了我的 AD 角色。所以一切都是默认的。正如我所说,它与 DomainGlobalGroup 完美配合。
  • 服务器不愿意处理请求。啊,我最喜欢的错误信息。写这部分代码的人应该受到惩罚!您是否尝试在该容器中手动创建该组,例如通过 ADUC?具有完全相同的属性?那样有用吗?本地组和全局组的属性有区别吗?
  • @Ocaso Protal:感谢您指导我。是的,它允许您在创建组时。但是当它已经创建时,您在创建时选择的选项会变得模糊(例如,您创建为“本地”类型,这将是模糊的),而其他选项(例如全局、通用)将被启用。当您通过 Windows 服务器上的 Active Directory Gui 手动创建组时,我正在说话
  • 对不起,我不能再帮你了,但根据我的记忆(上次我做一些广告编程是在 3 年前)这种错误意味着可能(!!!!!! ) 要么一个属性是错误的,要么是缺少某些东西。我真的很讨厌那个错误信息。玩得开心! ;)

标签: c# active-directory ldap distinguishedname


【解决方案1】:

According to Microsoft,组类型枚举是这样定义的:

  • 1 (0x00000001) 指定由系统创建的组。
  • 2 (0x00000002) 指定具有全局范围的组。
  • 4 (0x00000004) 指定具有域本地范围的组。
  • 8 (0x00000008) 指定具有通用范围的组。
  • 16 (0x00000010) 为 Windows Server Authorization Manager 指定一个 APP_BASIC 组。
  • 32 (0x00000020) 为 Windows Server Authorization Manager 指定一个 APP_QUERY 组。
  • 2147483648 (0x80000000) 指定一个安全组。如果未设置此标志,则该组是一个通讯组。

但这也是一个标志枚举 - 这意味着可以通过将值相加来组合它们。所以是的,0x80000004 实际上是一个有效值,表示“域本地安全组”。 (0x4 是域本地通讯组)

但您必须强制转换为整数(它不会让您使用十六进制值设置它)。我很惊讶你得到的异常是“服务器不愿意处理请求”,因为当我这样做时:

(int) 0x80000004

我得到这个编译器错误:

CS0221:常量值 '2147483652' 无法转换为 'int'(使用 'unchecked' 语法覆盖)

这是因为0x80000004 的十进制值为 2147483652,不适合 32 位整数。

但您确实需要给它一个 32 位整数(您不能只转换为 long)。所以你必须遵循建议并在投射时使用unchecked

unchecked((int) 0x80000004)

这给你一个十进制值 -2147483644。

所以你的代码应该是这样的:

groupToCreate.Properties["groupType"].Add(unchecked((int) GroupType.DomainLocalGroup));

【讨论】:

  • 感谢您宝贵的 cmets。但我想知道范围和类型之间的区别。我认为我们正在混淆或说 otehr 方式。你上面所说的和谈到的......它是 Group Scope 而不是类型。虽然我可以看到 Group Type 属性是:Security , Distribution。
  • 已编辑该帖子。我把照片放在哪里
  • AD Users and Computers 将其分为两部分,但在 AD 本身中,它只是一个属性(如果您修改“Group Scope”,它会更改 groupType 属性)
  • 感谢您的 cmets 和关于此的指导。 :-)
猜你喜欢
  • 2015-01-25
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2015-05-02
  • 2015-06-13
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多