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 (Срок действия пароля не ограничен);По умолчанию доменная политика паролей в AD требует от пользователя периодически менять пароль.
- 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).
Каждый из этих атрибутов учетной записи является битовым значением (флагом), которое можно находится в состоянии 1 (
True
) или 0 (
False
). Однако эти значения не хранятся в виде отельных атрибутов AD, вместо этого используется атрибут UserAccountControl.
Суммарное значение всех этих параметров хранится в значении атрибута учетной записи 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)
С помощью 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
Этот же скрипт можно использовать для расшифровки значений 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
Как изменить атрибут 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
Также вы можете включить оба эти параметра напрямую, задав точное значение через атрибут UserAccountControl:
Set-ADUser a.khramov -Replace @{UserAccountControl= 66048}