1

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

DirectoryEntry entry...
entry.Properties["groupType"].Value;

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

快速观看

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

groupTypeScreen

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

4

3 回答 3

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
}

现在当获取值并转换为 GroupType

var groupType = (GroupType)this.Entry.Properties["groupType"].Value

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

bool IsSecurityGroup = groupType.HasFlag(GroupType.SECURITY_ENABLED);
于 2015-12-15T20:16:16.027 回答
3

我认为您需要使用以下UInt32枚举类型GroupType

[Flags]
public enum GroupType : uint
{
    BUILTIN_LOCAL_GROUP = 0x00000001,
    ACCOUNT_GROUP       = 0x00000002,
    RESOURCE_GROUP      = 0x00000004,
    UNIVERSAL_GROUP     = 0x00000008,
    APP_BASIC_GROUP     = 0x00000010,
    APP_QUERY_GROUP     = 0x00000020,
    SECURITY_ENABLED    = 0x80000000
}

让我知道这是否能解决您的问题。

编辑:好的,我不确定Entry是您创建的对象还是 Active Directory API 的一部分。话虽如此,我在我目前正在处理的项目中快速创建了以下变量,并编译如下:

// I only made it static so I could get my compiler to compile this in something I'm currently
// working on. It's not necessary for it to be static.
static int SECURITY_ENABLED = 0x80000000;

int newValue = SECURITY_ENABLED | 1;

我没有得到任何编译时错误。事实上,重新看 value 0x80000000,它在 an 的范围内很好Int32

重新查看上面的代码,究竟在哪一行,你得到错误了吗?我看到这个可疑代码:

if (groupTypes.Count == 1)
{
    var  firstFlag = (int) groupTypes[0];

    // What is this checking, exactly?
    // Is this where the error is occurring?
    var longFlag = -(((long) flag) - firstFlag);

    if ((longFlag == 0x80000000)) // Extra parentheses here...just a formatting thing
        groupTypes.Add(GroupType.SECURITY_ENABLED);
}

也许这段代码可以简化?

public List<GroupType> GetGroupType()
{
    var groupTypes = new List<GroupType>();
    var flag = (GroupType) this.Entry.Properties["groupType"].Value;

    if (flag & GroupType.ACCOUNT_GROUP > 0)
        groupTypes.Add(GroupType.ACCOUNT_GROUP;
    else if (flag & GroupType.APP_BASIC_GROUP > 0)
        groupTypes.Add(GroupType.APP_BASIC_GROUP);

    // ... Other else if ad nauseum ...

    else if (flag & GroupType.SERUCITY_ENABLED > 0)
        groupTypes.Add(GroupType.SECURITY_ENABLED);

    return groupTypes;
}

如果您ArrayList()出于某种原因确实需要一个,那么您可以这样做return groupTypes.ToArray<int>();

HTH。

于 2013-05-15T14:16:39.303 回答
0

一个小 Python 解码 groupType AD 属性值

  1. 准备一本包含所有已定义组合的字典。(参考微软

     gt_decode_dict = {
         "0x00000001": "SYSTEM CREATED",     # Specifies a group that is created by the system.
         "0x00000002": "GLOBAL",             # Specifies a group with global scope.
         "0x00000004": "LOCAL",              # Specifies a group with domain local scope.
         "0x00000008": "UNIVERSAL",          # Specifies a group with universal scope.
         "0x00000010": "APP_BASIC",          # Specifies an APP_BASIC group for Windows Server Authorization Manager.
         "0x00000020": "APP_QUERY",          # Specifies an APP_QUERY group for Windows Server Authorization Manager.
         "0x80000000": "SECURITY"}           # Specifies a security group. If this flag is not set, then the group is a distribution group.
    
  2. 定义一个函数来解码 groupType 值

     def decode_gt(_group_type):
     #
     # Decode groupType attribute.
     # 
     global gt_decode_dict
     _delta = 0
    
     _translatedGT = ""
     if _group_type > 0:
         _hex_gt = hex(_group_type)
         _gt_work = int(_hex_gt[2:])
         _gt_work = str(_gt_work).rjust(8, "0")
         _gt_key = r'0x' + str(_gt_work)
         _translatedGT += "DISTRIBUTION - "
     else:
         _delta = 2147483648 - abs(_group_type)
         if (_delta % 2) > 0:
             _translatedGT = "SECURITY - SYSTEM CREATED - "
             _gt_key = r'0x' + str(_delta - 1).rjust(8, "0")
         else:
             _translatedGT = "SECURITY - "
             _gt_key = r'0x' + str(_delta).rjust(8, "0")
    
     if _gt_key in gt_decode_dict.keys():
         _translatedGT += gt_decode_dict[_gt_key]
     else:
         notification("   Invalid groupType key: " + str(_gt_key) + ". Values dec: " + str(_group_type) + " delta:" + str(_delta) + ", for group " + _group_dn, 4)
         _translatedGT += " Error "
    
     return _translatedGT
    
  3. 调用将 groupType 作为 Integer 传递的函数

    结果 = _groupType = decode_gt(int(_groupType))

于 2021-10-04T15:03:54.120 回答