0

Я пытаюсь прочитать флаг группы groupType SECURITY_ENABLED. Проблема заключается в том, что значение, которое я извлечь с помощьюЧтение флага SECURITY_ENABLED группы в Active Directory

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

является int32, чей диапазон -2,147,483,647 to 2,147,483,648 (or -0x7FFFFFFF to 0x80000000)

quickWatch

Так всегда есть GROUP_TYPE_SECURITY_ENABLED и любой другой набор флаг arbitraty, числовое значение превышает диапазон int32 и происходит переполнение.

groupTypeScreen

Кто-нибудь знает, как избежать этого переполнения, чтобы прочитать правильное значение?

+0

флаг должен быть int 0x80000000 вписывается в устройство красиво. – urbanlemur

+1

По умолчанию Int32 подписан. Можете ли вы использовать UInt32 ?? – fourpastmidnight

+0

Entry.Properties ["groupType"]. Возвращает значение -2147483646. Когда я пытаюсь передать его в uint, я получаю InvalidCastException – wodzu

ответ

1

Я думаю, вам нужно использовать 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 
} 

Позвольте мне знать, если это решит вашу проблему.

EDIT: ОК, я не был уверен, был ли объект Entry объектом, который вы создали, или частью API Active Directory. Сказав это, я быстро создал следующие переменные в проекте я в настоящее время работает над и составлен следующим образом:

// 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; 

я не получил каких-либо ошибок во время компиляции. Фактически, пересматривая значение 0x80000000, это хорошо в диапазоне Int32.

Повторное рассмотрение вашего кода выше, на какой строке именно вы получаете сообщение об ошибке? Я вижу этот код подозрительности:

Возможно, этот код можно было бы упростить?

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.

+0

, как уже сказано: Entry.Properties ["groupType"]. Значение возвращает -2147483646. Когда я пытаюсь передать его в uint, я получаю InvalidCastException. Поэтому я не могу даже комбинировать returnvalue с перечислениями – wodzu

+0

в режиме отладки, вы можете видеть, что это целое число со знаком http://img845.imageshack.us/img845/2369/grouptype.png – wodzu

+0

«подозрительный» код является обходным путем, чтобы прочитать флаг, даже есть bufferoverflow. Пока это работает, если установлены два флага. Сначала я получаю флаг, это не флаг SERUCITY_ENABLED. Затем я конвертирую данное значение flagval и преобразовываю его в длинный, чтобы восстановить начальное значение, вычитая значение первого флага, поэтому я могу проверить, установлен ли флаг SERUCITY_ENABLED. В частности, я получаю COMException, когда пытаюсь установить флаг следующим образом: var val = (long) ((int) this.Entry.Properties ["groupType"]. Значение); \t \t \t \t \t this.Entry.Properties ["groupType"]. Значение = val & ~ 0x80000000; – wodzu

1

Реферирование ответ @ fourpastmidnight в и эти статьи object-group-attribute-grouptype и msdn 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 

Вы можете использовать .ToString() на величину GroupType, которая будет возвращать запятыми строку каждого флага.
Или вы можете использовать.HasFlag, чтобы проверить, является ли это Группой безопасности

Смежные вопросы