UserAccountControl є одним з важливих атрибутів облікових записів користувачів і комп'ютерів Active Directory. Даний атрибут визначає стан облікового запису в домені: активна чи обліковий запис або заблокована, чи включена опція зміни пароля при наступному вході, чи може користувач змінювати свій пароль і т.д.). Однак не всі адміністратори чітко уявляють, як працює і для чого використовується в AD атрибут UserAccountControl.
Наприклад, відкрийте в консолі ADUC властивості будь-якого облікового запису AD і перейдіть на вкладку Account (Обліковий запис). Зверніть увагу на групу атрибутів користувача в розділі Account Control (Параметри облікового запису). Тут є такі опції аккаунта:
- User must change password at next logon (Вимагати зміни пароля при наступному вході в систему);
- User can not change password (Заборонити зміни пароля користувачем);
- Password never expires (Термін дії пароля не обмежений);
- Store password using reversible encryption (Зберігати паролі, використовуючи оборотне шифрування) - небезпечно;
- Account is disabled (Відключити обліковий запис)
- Smart card is required for interactive logon (Для інтерактивного входу в мережу потрібно смарт карта);
- Account is sensitive and can not be delegated (Рахунок важлива і не може бути делегована);
- Use Kerberos DES encryption types for this account (Використовувати тільки типи шифрування Kerberos DES для цього облікового запису);
- This account supports Kerberos AES 128/256 bit encryption (Дана обліковий запис підтримує 128/256-розрядне шифрування Kerberos AES);
- Do not require Kerberos preauthentication (Без попередньої перевірки достовірності Kerberos).
Кожен з цих атрибутів облікового запису по суті є бітовим значенням, яке можна знаходиться в стані 1 (True) або 0 (False). Однак ці значення не зберігаються у вигляді готельних атрибутів AD, замість цього використовується атрибут UserAccountControl.
зміст:
- UserAccountControl - атрибут Active Directory
- PowerShell скрипт для розшифровки значення UserAccountControl
UserAccountControl - атрибут Active Directory
Сумарне значення всіх зазначених опцій зберігається в значенні атрибута облікового запису UserAccountControl, тобто замість, того щоб зберігати всі ці опції в різних атрибутах, використовується один атрибут Active Directory. Атрибут UserAccountControl є бітову маску, кожен біт якого є окремим прапором, що відображає значення однієї із зазначених опцій і може мати різне значення (вкл або викл). Відповідно, в залежності від включених опцій облікового запису, у користувача буде виходити різне значення атрибута UserAccountControl. Подивитися поточне значення атрибута можна на вкладці Attribute Editor або за допомогою наступної командлет PowerShell Get-ADUser:
get-aduser user1 -properties * | select name, UserAccountControl | ft
У цьому прикладі значення атрибута 0x10202 (В десятковому поданні 66050). Що означають ці числа?
Нижче наведено таблицю доступних прапорів облікових записів в AD. Кожен з прапорів відповідає певному біту атрибута UserAccountControl, а значення UserAccountControl дорівнює сумі всіх прапорів.
прапор | Значення в HEX | десяткове значення |
SCRIPT (Запуск сценарію входу) | 0x0001 | 1 |
ACCOUNTDISABLE (Рахунок відключена) | 0x0002 | 2 |
HOMEDIR_REQUIRED (Потрібно домашня папка) | 0x0008 | 8 |
LOCKOUT (Рахунок заблокована) | 0x0010 | 16 |
PASSWD_NOTREQD (Пароль не потрібний) | 0x0020 | 32 |
PASSWD_CANT_CHANGE (Заборонити зміну пароля користувачем) | 0x0040 | 64 |
ENCRYPTED_TEXT_PWD_ALLOWED (Зберігати пароль допомогою оборотне шифрування) | 0x0080 | 128 |
TEMP_DUPLICATE_ACCOUNT (обліковий запис користувача, чия основна обліковий запис зберігається в іншому домені) | 0x0100 | 256 |
NORMAL_ACCOUNT (Обліковий запис за замовчуванням. Звичайна активна обліковий запис) | 0x0200 | 512 |
INTERDOMAIN_TRUST_ACCOUNT | 0x0800 | 2048 |
WORKSTATION_TRUST_ACCOUNT | 0x1000 | 4096 |
SERVER_TRUST_ACCOUNT | 0x2000 | 8192 |
DONT_EXPIRE_PASSWORD (Термін дії пароля не обмежений) | 0x10000 | 65536 |
MNS_LOGON_ACCOUNT | 0x20000 | 131072 |
SMARTCARD_REQUIRED (Для інтерактивного входу в мережу потрібна смарт-карта) | 0x40000 | 262144 |
TRUSTED_FOR_DELEGATION | 0x80000 | 524288 |
NOT_DELEGATED | 0x100000 | 1048576 |
USE_DES_KEY_ONLY | 0x200000 | 2097152 |
DONT_REQ_PREAUTH (Не потрібна попередня перевірка достовірності Kerberos) | 0x400000 | 4194304 |
PASSWORD_EXPIRED (Термін дії пароля користувача минув) | 0x800000 | 8388608 |
TRUSTED_TO_AUTH_FOR_DELEGATION | 0x1000000 | 16777216 |
PARTIAL_SECRETS_ACCOUNT | 0x04000000 | 67108864 |
Наприклад, є звичайна обліковий запис, для якої відключено вимога зміни пароля. Значення userAccountControl отримують у такий спосіб
NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) = 66048
Відповідно, значення userAccountControl з мого прикладу (66050) вийшло в такий спосіб:
NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) + ACCOUNTDISABLE (2) = 66050
Для звичайної заблокованої облікового запису значення userAccountControl дорівнюватиме 514:
(NORMAL_ACCOUNT (512) + ACCOUNTDISABLE (2) = 514
Значення UserAccountControl за замовчуванням для типових об'єктів домену:
- Звичайний користувач: 0x200 (512)
- Контролер домену: 0x82000 (532480)
- Робоча станція / сервер: 0x1000 (4096)
За допомогою фільтрів можна вибирати з AD об'єкти, з певним значенням атрибута useraccountcontrol. Наприклад, для виведення всіх активних (нормальних облікових записів):
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol = 512)"
Виведемо список всіх заблокованих облікових записів:
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol = 514)"
Список акаунтів, у яких не обмежений термін дії пароля:
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol = 66048)"
Скласти потрібні біти з таблиці і вибрати об'єкти AD можна за допомогою наступних команд:
$ UserAccountControl_hex = 0x10000 + 0x0080 + 0x200000
Get-ADUser -Filter UserAccountControl -band $ UserAccountControl_hex
PowerShell скрипт для розшифровки значення UserAccountControl
Для зручності під рукою хочеться мати інструмент, який би автоматично перетворював значення бітової маски UserAccountControl в нормальний людський вигляд. Спробуємо написати просту функцію для скриптів PowerShell, який приймає десяткове значення атрибута UserAccountControl і видає список включених опцій учеткі. Оскільки атрибут UserAccountControl є бітову маску, можна призначити кожному біту текстовий опис.
У мене вийшов такий PowerShell скрипт для конвертації значення UserAccountControl в читається вигляд:
Function ConvertUserAccountControl ([int] $ UAC)
$ UACPropertyFlags = @ (
"SCRIPT",
"ACCOUNTDISABLE",
"RESERVED",
"HOMEDIR_REQUIRED",
"LOCKOUT",
"PASSWD_NOTREQD",
"PASSWD_CANT_CHANGE",
"ENCRYPTED_TEXT_PWD_ALLOWED",
"TEMP_DUPLICATE_ACCOUNT",
"NORMAL_ACCOUNT",
"RESERVED",
"INTERDOMAIN_TRUST_ACCOUNT",
"WORKSTATION_TRUST_ACCOUNT",
"SERVER_TRUST_ACCOUNT",
"RESERVED",
"RESERVED",
"DONT_EXPIRE_PASSWORD",
"MNS_LOGON_ACCOUNT",
"SMARTCARD_REQUIRED",
"TRUSTED_FOR_DELEGATION",
"NOT_DELEGATED",
"USE_DES_KEY_ONLY",
"DONT_REQ_PREAUTH",
"PASSWORD_EXPIRED",
"TRUSTED_TO_AUTH_FOR_DELEGATION",
"RESERVED",
"PARTIAL_SECRETS_ACCOUNT"
"RESERVED"
"RESERVED"
"RESERVED"
"RESERVED"
"RESERVED"
)$ Attributes = ""
1 ... ($ UACPropertyFlags.Length) | Where-Object $ UAC -bAnd [math] :: Pow (2, $ _) | ForEach-Object If ($ Attributes.Length -EQ 0) $ Attributes = $ UACPropertyFlags [$ _] Else $ Attributes = $ Attributes + "|" + $ UACPropertyFlags [$ _]
Return $ Attributes
Перевіримо, що означає значення UserAccountControl, рівне 66050:
ConvertUserAccountControl 66050
Як ви бачите, скрипт повернув, що у користувача включені атрибути:
ACCOUNTDISABLE + NORMAL_ACCOUNT + DONT_EXPIRE_PASSWORD
Цей же скрипт можна використовувати для розшифровки значень UserAccountControl на льоту, під час вивантаження інформації про облікових даних їх AD в зручному вигляді за допомогою командлета Get-AdUser або Get-AdComputer, наприклад:
get-aduser sam-prnt -properties * | select @ n = 'UsrAcCtrl'; e = ConvertUserAccountControl ($ _. userAccountControl)
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
get-adcomputer sam-dc01 -properties * | select @ n = 'UsrAcCtrl'; e = ConvertUserAccountControl ($ _. userAccountControl)
SERVER_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION