
UserAccountControl является одним из наиболее важных атрибутов объектов пользователей и компьютеров в Active Directory. Этот атрибут определяет состояние учетной записи в домене AD: является ли она активной или заблокированной, включена ли опция смены пароля при следующем входе в систему, могут ли пользователи менять свои пароли и т. д. Однако не все администраторы знают, как работает атрибут UserAccountControl и для чего он используется в AD
Атрибут/флаг UserAccountControl в Active Directory
Откройте свойства любой учетной записи AD в Active Directory Users and Computers (ADUC, dsa.msc
) и перейдите к разделу Аккаунт вкладка. Обратите внимание на группу атрибутов пользователя в разделе Параметры учетной записи раздел. Здесь вы можете увидеть следующие опции:
- Пользователь должен изменить пароль при следующем входе в систему;
- Пользователь не может изменить пароль;
- Срок действия пароля не истекает;
По умолчанию политика паролей домена в AD требует, чтобы пользователь периодически менял свой пароль.
- Хранить пароль с помощью обратимого шифрования (небезопасно);
- Учетная запись отключена;
- Для интерактивного входа в систему требуется смарт-карта;
- Учетная запись является конфиденциальной и не может быть делегирована;
- Используйте типы шифрования Kerberos DES для этой учетной записи;
- Эта учетная запись поддерживает 128/256-битное шифрование Kerberos AES;
- Не требует предварительной аутентификации Kerberos.
Каждый из этих атрибутов учетной записи пользователя — это, по сути, битовое значение (флаг), которое может быть либо 1 (True
) или 0 (False
). Однако эти значения не хранятся как отдельные атрибуты AD, вместо них используется атрибут UserAccountControl.
Суммарное значение всех опций, указанных выше, хранится в значении UserAccountControl атрибут. Вместо того чтобы хранить все эти параметры в разных атрибутах пользователя, используется один атрибут Active Directory. UserAccountControl представляет собой битовая маска, каждый бит которой является отдельным флагом и имеет значение На сайте (True) или Выключено (Ложь). В зависимости от включенных опций учетной записи у пользователя будут разные значения атрибута UserAccountControl. Текущее значение атрибута можно посмотреть на соответствующей вкладке редактора атрибутов или с помощью команды Get-ADUser в PowerShell:
get-aduser jkelly -properties *|select name,UserAccountControl | ft
В этом примере значение атрибута равно 0x10202 (десятичное значение 66050). Что означают эти цифры?
Ниже приведена таблица доступных флагов учетных записей AD. Каждый флаг соответствует определенному биту UserAccountControl, а значение 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 |
МЕЖДОМЕННЫЙ_ДОВЕРИТЕЛЬНЫЙ_АККАУНТ | 0x0800 | 2048 |
РАБОЧАЯ СТАНЦИЯ_ДОВЕРИТЕЛЬНЫЙ_АККАУНТ | 0x1000 | 4096 |
СЕРВЕРНЫЙ_ДОВЕРИТЕЛЬНЫЙ_АККАУНТ | 0x2000 | 8192 |
DONT_EXPIRE_PASSWORD (учетные записи пользователей с паролями, срок действия которых не истекает) | 0x10000 | 65536 |
MNS_LOGON_ACCOUNT | 0x20000 | 131072 |
SMARTCARD_REQUIRED (Для входа в сеть пользователю необходима смарт-карта) | 0x40000 | 262144 |
ДОВЕРЕННЫЙ_ДЛЯ_ДЕЛЕГИРОВАНИЯ | 0x80000 | 524288 |
НЕ_ДЕЛЕГАТИРОВАН | 0x100000 | 1048576 |
ИСПОЛЬЗОВАТЬ_ДЕС_КЛЮЧ_ТОЛЬКО | 0x200000 | 2097152 |
DONT_REQ_PREAUTH (предварительная аутентификация Kerberos не требуется) | 0x400000 | 4194304 |
PASSWORD_EXPIRED (Срок действия пароля пользователя истек) | 0x800000 | 8388608 |
ДОВЕРЕННЫЙ_К_АВТОРУ_ДЛЯ_ДЕЛЕГИРОВАНИЯ | 0x1000000 | 16777216 |
ЧАСТИЧНЫЙ_СЕКРЕТНЫЙ_АККАУНТ | 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 по умолчанию для типичных объектов домена:
- Обычный пользователь AD: 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}
Декодирование значений UserAccountControl с помощью сценария PowerShell
Чтобы сделать его более удобным, я хочу иметь инструмент для автоматического преобразования значения битовой маски UserAccountControl в прозрачный для человека вид. Попробуем написать простую функцию PowerShell, которая принимает десятичное значение атрибута UserAccountControl и возвращает список включенных опций учетной записи. Поскольку UserAccountControl — это битовая маска, каждому биту можно присвоить текстовое описание.
Я написал эту функцию PowerShell DecodeUserAccountControl для преобразования значения UserAccountControl в читаемый вид:
Function DecodeUserAccountControl ([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 ” | ”
}
Давайте проверим, что означает значение 66050 в UserAccountControl:
DecodeUserAccountControl 66050
Как видите, скрипт выдал, что для этого пользователя включены следующие флаги:
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
Этот же сценарий можно использовать для декодирования значений UserAccountControl «на лету» при получении информации об учетных записях AD в удобной форме, например, с помощью команд Get-ADUser или Get-ADComputer:
get-aduser ms-pam -properties *|select @{n='UsrAcCtrl';e={DecodeUserAccountControl($_.userAccountControl)}}
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
get-adcomputer rome-dc01 -properties *|select @{n='UsrAcCtrl';e={DecodeUserAccountControl($_.userAccountControl)}}
SERVER_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION
Как установить атрибут UserAccoutControl в AD с помощью PowerShell?
Вы можете изменить отдельные параметры атрибута UserAccountControl в Active Directory с помощью командлетов Set-ADUser и Set-ADComputer PowerShell. Обе эти команды имеют отдельные опции, например:
- AccountNotDelegated
- AllowReversiblePasswordEncryption
- CannotChangePassword
- ChangePasswordAtLogon
- KerberosEncryptionType
- PasswordNeverExpires
- PasswordNotRequired
- PrincipalsAllowedToDelegateToAccount
Итак, чтобы изменить некоторые параметры пользователя, необходимо использовать следующую команду:
Set-ADUser jkelly –CannotChangePassword:$true -PasswordNeverExpires:$true
Или вы можете использовать общую команду Set-UserAccountControl команда:
Set-ADAccountControl -Identity jkelly -CannotChangePassword $True -PasswordNeverExpires $True
Вы также можете включить обе эти опции учетной записи пользователя напрямую, установив точное значение через атрибут UserAccountControl:
Set-ADUser jkelly -Replace @{UserAccountControl= 66048}