读取 Active Directory 中组的 SECURITY_ENABLED 标志

wod*_*dzu 1 c# ldap integer-overflow active-directory active-directory-group

我正在尝试读取组 groupType 属性的SECURITY_ENABLED标志。问题是我使用的价值

DirectoryEntry entry...
entry.Properties["groupType"].Value;
Run Code Online (Sandbox Code Playgroud)

int32,其范围是-2,147,483,647 到 2,147,483,648(或 -0x7FFFFFFF 到 0x80000000)

快看

因此,只要GROUP_TYPE_SECURITY_ENABLED设置了和任何其他仲裁标志,数值就会超出 int32 的范围,就会发生溢出。

组类型屏幕

有谁知道如何避免这种溢出以读取正确的值?

Hiv*_*ive 5

参考@fourpastmidnight 的答案和这些文章object-group-attribute-grouptypemsdn Group-Type attribute,我能够找到一个不需要强制转换uint或解析if ... else if语句的解决方案。

从第一个链接和@wodzu 对 -2147483646 返回值的评论中看到负值,我尝试将 SECURITY_ENALBED 值反转为 -0x80000000。

[System.Flags]
public enum GroupType
{
    BUILTIN_LOCAL_GROUP = 0x00000001,
    ACCOUNT_GROUP       = 0x00000002,
    RESOURCE_GROUP      = 0x00000004,
    UNIVERSAL_GROUP     = 0x00000008,
    APP_BASIC_GROUP     = 0x00000010,
    APP_QUERY_GROUP     = 0x00000020,
    SECURITY_ENABLED    = -0x80000000
}
Run Code Online (Sandbox Code Playgroud)

现在当获取值并转换为 GroupType 时

var groupType = (GroupType)this.Entry.Properties["groupType"].Value
Run Code Online (Sandbox Code Playgroud)

然后您可以在 GroupType 值上使用 .ToString() ,它将返回每个标志的逗号分隔字符串。
或者你可以使用 .HasFlag 方法来检查它是否是一个安全组

bool IsSecurityGroup = groupType.HasFlag(GroupType.SECURITY_ENABLED);
Run Code Online (Sandbox Code Playgroud)