Розшифровка значення атрибута userAccountControl в Active Directory

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 (Запуск сценарію входу)0x00011
ACCOUNTDISABLE (Рахунок відключена)0x00022
HOMEDIR_REQUIRED (Потрібно домашня папка)0x00088
LOCKOUT (Рахунок заблокована)0x001016
PASSWD_NOTREQD (Пароль не потрібний)0x002032
PASSWD_CANT_CHANGE (Заборонити зміну пароля користувачем)0x004064
ENCRYPTED_TEXT_PWD_ALLOWED (Зберігати пароль допомогою оборотне шифрування)0x0080128
TEMP_DUPLICATE_ACCOUNT (обліковий запис користувача, чия основна обліковий запис зберігається в іншому домені)0x0100256
NORMAL_ACCOUNT (Обліковий запис за замовчуванням. Звичайна активна обліковий запис)0x0200512
INTERDOMAIN_TRUST_ACCOUNT0x08002048
WORKSTATION_TRUST_ACCOUNT0x10004096
SERVER_TRUST_ACCOUNT0x20008192
DONT_EXPIRE_PASSWORD (Термін дії пароля не обмежений)0x1000065536
MNS_LOGON_ACCOUNT0x20000131072
SMARTCARD_REQUIRED (Для інтерактивного входу в мережу потрібна смарт-карта)0x40000262144
TRUSTED_FOR_DELEGATION0x80000524288
NOT_DELEGATED0x1000001048576
USE_DES_KEY_ONLY0x2000002097152
DONT_REQ_PREAUTH (Не потрібна попередня перевірка достовірності Kerberos)0x4000004194304
PASSWORD_EXPIRED (Термін дії пароля користувача минув)0x8000008388608
TRUSTED_TO_AUTH_FOR_DELEGATION0x100000016777216
PARTIAL_SECRETS_ACCOUNT0x0400000067108864

Наприклад, є звичайна обліковий запис, для якої відключено вимога зміни пароля. Значення 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