Использование флагов в моем собственном элементе управления C #, таком как настройки в UserAccountControl в Active Directory - PullRequest
0 голосов
/ 31 октября 2010

Я некоторое время работал с System.DirectoryServices в проекте, включающем Active Directory.Мне интересно узнать о реализации свойства UserAccountControl для управления атрибутами определенной учетной записи.Если бы я хотел реализовать настройки в своих собственных приложениях, используя комбинацию байтов для определения состояния параметра x или y, как бы я поступил в C #? Скажите, что я хотел бы реализовать useraccountcontrolв моем собственном классе, и я хочу использовать комбинацию байтов, чтобы определить, какие разрешения должна иметь учетная запись.

Вот как она изменяется в Active Directory: http://support.microsoft.com/kb/305144

иВот место с определением объекта: http://msdn.microsoft.com/en-us/library/ms680832%28VS.85%29.aspx

Редактировать:

Скажите, что у меня есть собственный класс User, и я хочу реализовать свойство, аналогичное реализации UserAccountControlв Active Directory.Допустим, я хочу иметь набор из четырех байтов для хранения настроек.

Я хочу использовать последний байт для определения статуса учетной записи, 0 = учетная запись не активна 1 = учетная запись активна 2 = срок действия учетной записи 4 = какой-то другой статус 8 = еще один статус.

Затем в следующем байте слева я хочу указать тип учетной записи: 16 = учетная запись администратора, 32 = обычная учетная запись, 64 = гостевая учетная запись, 128 = другая учетная запись.

Затем используйте следующий байт слева, чтобы установить другие настройки, чтобы 256 = что-то, 512 = что-то другое, 1024 = что-то еще и т. Д.

Я хотел бы объединить это сиспользуйте побитовые комбинации для установки свойств учетной записи.У меня есть идея в голове, но я не уверен, как реализовать ее или даже имеет ли смысл то, что я пытаюсь сделать.

Редактировать: Получив ответ и выполнив еще несколько копаний, я нашелэта ссылка, которая говорит больше о настройке флагов: http://msdn.microsoft.com/en-us/library/ms229062.aspx

1 Ответ

1 голос
/ 03 ноября 2010

Давайте определим тип помощника:

[Flags]
public enum UserAccountControl {
    // values from http://support.microsoft.com/kb/305144
    Script = 0x0001,
    AccountDisabled = 0x0002,
    HomeDirRequired = 0x0008,
    Lockout = 0x0010,
    PasswordNotRequired = 0x0020,
    PasswordCantChange = 0x0040,
    EncryptedTextPasswordAllowed = 0x0080,
    TempDuplicateAccount = 0x0100,
    NormalAccount = 0x0200,
    InterDomainTrustAccount = 0x0800,
    WorkstationTrustAccount = 0x1000,
    ServerTrustAccount = 0x2000,
    DontExpirePassword = 0x10000,
    MnsLogonAccount = 0x20000,
    SmartcardRequired = 0x40000,
    TrustedForDelegation = 0x80000,
    Delegated = 0x100000,
    UseDesKeyOnly = 0x200000,
    DontReqPreauth = 0x400000,
    PasswordExpired = 0x800000,
    TrustedToAuthForDelegation = 0x1000000
}

Вы можете приводить типы int и enum (я предполагаю, что вы знаете, как получить одно из этих значений в виде целого числа). Затем вы можете манипулировать значениями с помощью побитовых операторов следующим образом:

void manipulateUserFlags(UserAccountControl uac) {
    // Set the SCRIPT flag (bitwise OR)
    uac |= UserAccountControl.Script;

    // Clear the ACCOUNTDISABLE flag (complement, bitwise AND)
    uac &= ~UserAccountControl.AccountDisabled;

    // Check for the HOMEDIR_REQUIRED flag (bitwise AND)
    if((uac & UserAccountControl.HomeDirRequired) != UserAccountControl.None) {
        // ...
    }

    // Toggle the NORMAL_ACCOUNT flag (bitwise XOR)
    uac ^= UserAccountControl.NormalAccount;

    // Check for several types of trust, and a required password
    if((uac & UserAccountControl.WorkstationTrustAccount
            & UserAccountControl.ServerTrustAccount
            & ~UserAccountControl.PasswordNotRequired) != UserAccountControl.None) {
        // ...
    }
}

Это те же побитовые операторы, которые работают с целыми числами, но в C # рекомендуются enum типы, потому что они более строго типизированы. Побитовое манипулирование целыми числами имеет гораздо больший смысл в C или C ++, потому что вы можете тестировать непосредственно на целых числах в условных выражениях и потому что эти языки в любом случае не так строго типизированы.

Однако, если вы собираетесь реализовать это как часть библиотеки или выполнять эти операции обычно, я бы подумал о том, чтобы придать ей больше дизайна с несколькими enum свойствами, которые представляют группы схожих настройки, а также методы int ToADValue и UserAccountControl FromADValue. Это дало бы вам ясное место для размещения любой логики проверки и сделало бы код, который управляет этими свойствами, еще более читабельным.

...