Преобразование значений атрибутов UserAccountControl в Active Directory

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.

Параметры учетных записей пользователей AD - UserAccountControl

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

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

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

get-aduser Значение UserAccountControl

UserAccountControl атрибут пользователя в редакторе атрибутов active directory

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

Функция PowerShell DecodeUserAccountControl

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

get-adcomputer с DecodeUserAccountControl

Как установить атрибут UserAccoutControl в AD с помощью PowerShell?

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

  • AccountNotDelegated
  • AllowReversiblePasswordEncryption
  • CannotChangePassword
  • ChangePasswordAtLogon
  • KerberosEncryptionType
  • PasswordNeverExpires
  • PasswordNotRequired
  • PrincipalsAllowedToDelegateToAccount
Пароль учетной записи компьютера в AD обеспечивает доверительные отношения между компьютером и доменом.

Итак, чтобы изменить некоторые параметры пользователя, необходимо использовать следующую команду:

Set-ADUser jkelly –CannotChangePassword:$true -PasswordNeverExpires:$true

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

Set-ADAccountControl -Identity jkelly -CannotChangePassword $True -PasswordNeverExpires $True

Set-ADAccountControl изменение атрибута UserAccountControl с помощью powershell

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

Set-ADUser jkelly -Replace @{UserAccountControl= 66048}

Добавить комментарий

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