我不明白为什么在Active Directory中为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,则一切正常。
任何人都可以让我知道如何摆脱这个问题吗?

c# - 为什么在事件目录中无法将组创建为groupType = Local-LMLPHP

最佳答案

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


1(0x00000001)指定系统创建的组。
2(0x00000002)指定具有全局范围的组。
4(0x00000004)指定具有域本地范围的组。
8(0x00000008)指定具有通用范围的组。
16(0x00000010)指定Windows Server授权管理器的APP_BASIC组。
32(0x00000020)指定Windows Server授权管理器的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));

关于c# - 为什么在事件目录中无法将组创建为groupType = Local,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56805544/

10-12 21:20