为什么在 active directory 组中不能创建为 groupType = Local
Why in active directory group cannot be created as groupType = Local
我无法理解为什么在 Active Directory 中创建组类型为 "local" 的组不起作用。它抛出以下异常:
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,一切正常。
谁能告诉我如何解决这个问题?
According to Microsoft,组类型枚举的定义方式:
- 1 (0x00000001) 指定由系统创建的组。
- 2 (0x00000002) 指定具有全局范围的组。
- 4 (0x00000004) 指定具有域本地作用域的组。
- 8 (0x00000008) 指定具有通用范围的组。
- 16 (0x00000010) 为 Windows 服务器授权管理器指定一个 APP_BASIC 组。
- 32 (0x00000020) 为 Windows 服务器授权管理器指定一个 APP_QUERY 组。
- 2147483648 (0x80000000) 指定安全组。如果未设置此标志,则该组为通讯组。
但这也是一个标志枚举 - 这意味着可以通过将它们相加来组合值。所以是的,0x80000004
实际上是一个有效值,表示 "a domain local security group"。 (0x4
是域本地通讯组)
但是你必须转换为整数(它不会让你用十六进制值设置它)。我很惊讶你得到的例外是 "The server is unwilling to process the request" 因为当我这样做时:
(int) 0x80000004
我收到这个编译器错误:
CS0221: Constant value '2147483652' cannot be converted to a 'int' (use 'unchecked' syntax to override)
那是因为0x80000004
的十进制值为2147483652,不适合32位整数
但是你确实需要给它一个 32 位整数(你不能只转换为 long
)。所以你必须按照建议,在投射时使用unchecked
:
unchecked((int) 0x80000004)
它给你一个十进制值 -2147483644。
因此您的代码应如下所示:
groupToCreate.Properties["groupType"].Add(unchecked((int) GroupType.DomainLocalGroup));
我无法理解为什么在 Active Directory 中创建组类型为 "local" 的组不起作用。它抛出以下异常:
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,一切正常。 谁能告诉我如何解决这个问题?
According to Microsoft,组类型枚举的定义方式:
- 1 (0x00000001) 指定由系统创建的组。
- 2 (0x00000002) 指定具有全局范围的组。
- 4 (0x00000004) 指定具有域本地作用域的组。
- 8 (0x00000008) 指定具有通用范围的组。
- 16 (0x00000010) 为 Windows 服务器授权管理器指定一个 APP_BASIC 组。
- 32 (0x00000020) 为 Windows 服务器授权管理器指定一个 APP_QUERY 组。
- 2147483648 (0x80000000) 指定安全组。如果未设置此标志,则该组为通讯组。
但这也是一个标志枚举 - 这意味着可以通过将它们相加来组合值。所以是的,0x80000004
实际上是一个有效值,表示 "a domain local security group"。 (0x4
是域本地通讯组)
但是你必须转换为整数(它不会让你用十六进制值设置它)。我很惊讶你得到的例外是 "The server is unwilling to process the request" 因为当我这样做时:
(int) 0x80000004
我收到这个编译器错误:
CS0221: Constant value '2147483652' cannot be converted to a 'int' (use 'unchecked' syntax to override)
那是因为0x80000004
的十进制值为2147483652,不适合32位整数
但是你确实需要给它一个 32 位整数(你不能只转换为 long
)。所以你必须按照建议,在投射时使用unchecked
:
unchecked((int) 0x80000004)
它给你一个十进制值 -2147483644。
因此您的代码应如下所示:
groupToCreate.Properties["groupType"].Add(unchecked((int) GroupType.DomainLocalGroup));