Использование флагов в моем собственном элементе управления C#, таком как настройки в UserAccountControl в Active Directory
Я работал с 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 ответ
Давайте определим тип помощника:
[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) {
// ...
}
}
Это те же побитовые операторы, которые работают для целых чисел, но enum
типы рекомендуются в C#, потому что они более типизированы. Побитовое манипулирование целыми числами имеет гораздо больший смысл в C или C++, потому что вы можете тестировать непосредственно на целых числах в условных выражениях и потому что эти языки в любом случае не так строго типизированы.
Тем не менее, если вы собираетесь реализовать это как часть библиотеки или выполнять эти операции часто, я бы подумал о том, чтобы придать ей больше дизайна, с несколькими enum
свойства, представляющие группы схожих настроек, и int ToADValue
а также UserAccountControl FromADValue
методы. Это дало бы вам ясное место для размещения любой логики проверки и сделало бы код, который манипулирует этими свойствами, еще более читабельным.