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

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

К примеру, откройте в консоли ADUC свойства любой учетной записи AD и перейдите на вкладку Account (Учетная запись). Обратите внимание на группу атрибутов пользователя в разделе Account Control (Параметры учетной записи). Здесь имеются следующие опции аккаунта:

  • User must change password at next logon (Требовать смены пароля при следующем входе в систему);
  • User cannot change password (Запретить смены пароля пользователем);
  • Password never expires (Срок действия пароля не ограничен);
  • Store password using reversible encryption (Хранить пароли, используя обратимое шифрование) — небезопасно;
  • Account is disabled (Отключить учетную запись)
  • Smart card is required for interactive logon (Для интерактивного входа в сеть нужно смарт карта);
  • Account is sensitive and cannot 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).

Параметры учетной записи в AD

Каждый из этих атрибутов учетной записи по сути является битовым значением, которое можно находится в состоянии 1 (True) или 0 (False). Однако эти значения не хранятся в виде отельных атрибутов AD, вместо этого используется атрибут UserAccountControl.

UserAccountControl — атрибут Active Directory

Суммарное значение всех указанных опций хранится в значении атрибута учетной записи UserAccountControl, т.е. вместо, того чтобы хранить все эти опции в разных атрибутах, используется один атрибут Active Directory. Атрибут UserAccountControl представляет собой битовую маску, каждый бит которого является отдельным флагом, отображающим значение одной из указанных опций и может иметь разное значение (вкл или выкл). Соответственно, в зависимости от включенных опций учетной записи, у пользователя будет получаться разное значение атрибута UserAccountControl. Посмотреть текущее значение атрибута можно на вкладке Attribute Editor или с помощью следующей командлета PowerShell Get-ADUser:

get-aduser user1 -properties *|select name,UserAccountControl | ft

get-aduser UserAccountControl

значение UserAccountControl у пользователя в Active Directory

В этом примере значение атрибута 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

скрипт PowerShell для преобразования UserAccountControl в нормальный вид

Этот же скрипт можно использовать для расшифровки значений 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

get-aduser используем функцию для конвертации userAccountControl в текст


Предыдущая статья Следующая статья


Комментариев: 2 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)