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

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

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

UserAccountControl: атрибут управления учетной записи Active Directory

Откройте в консоли ADUC свойства любого пользователя и перейдите на вкладку 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 представляет собой битовую маску, каждый бит которого является отдельным флагом, отображающим значение одной из указанных опций и может иметь значение вкл или выкл. Соответственно, в зависимости от включенных опций учетной записи, у пользователя будет получаться разное значение атрибута 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 (Запуск логон скрипта) 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)

С помощью LDAP фильтров можно выбирать из 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"
)


return (0..($UACPropertyFlags.Length) | ?{$UAC -bAnd [math]::Pow(2,$_)} | %{$UACPropertyFlags[$_]}) -join ” | ”
}

Проверим, что означает значение 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 в текст

Как изменить атрибут UserAccoutControl в Active Directory?

Вы можете изменить отдельные параметры атрибута UserAccountControl в Active Directory с помощью PowerShell командлетов Set-ADUser и Set-ADComputer. У обоих этих командлетов есть отдельные опции, например:

  • AccountNotDelegated
  • AllowReversiblePasswordEncryption
  • CannotChangePassword
  • ChangePasswordAtLogon
  • KerberosEncryptionType
  • PasswordNeverExpires
  • PasswordNotRequired
  • PrincipalsAllowedToDelegateToAccount

Т.е. чтобы изменить некоторые опций пользователя, нужно использовать такую команду:

Set-ADUser a.khramov –CannotChangePassword:$true -PasswordNeverExpires:$true

Или можно использовать универсальный командлет Set-UserAccountControl:

Set-ADAccountControl -Identity a.khramov -CannotChangePassword $True -PasswordNeverExpires $True

Set-ADAccountControl команда powershell

Также вы можете включить оба эти параметра напрямую, задав точное значение через атрибут UserAccountControl:

Set-ADUser a.khramov -Replace @{UserAccountControl= 66048}

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