Active DirectoryのUserAccountControl属性とは?ビットマスク値の解読・設定方法を徹底解説
UserAccountControlは、Active Directory(AD)におけるユーザーオブジェクトおよびコンピューターオブジェクトの最も重要な属性の1つです。この属性は、ADドメイン内でのアカウントの状態を決定します。例えば、アカウントが有効か無効か、次回ログオン時にパスワード変更を必須にするか、ユーザーがパスワードを変更できるかどうかなどが含まれます。しかし、すべての管理者がUserAccountControl属性の仕組みやADでの用途を十分に理解しているわけではありません。
Active DirectoryにおけるUserAccountControl属性/フラグ
「Active Directory ユーザーとコンピューター」(ADUC、dsa.msc)コンソールで任意のADアカウントのプロパティを開き、「アカウント」タブに移動してください。「アカウントオプション」セクションのユーザー属性グループに注目すると、以下のようなオプションが確認できます。
- ユーザーは次回ログオン時にパスワード変更が必要
- ユーザーはパスワードを変更できない
- パスワードを無期限にする(デフォルトでは、ADのドメインパスワードポリシーにより、ユーザーは定期的にパスワードを変更する必要があります)
- 可逆暗号化を使用してパスワードを保存する(安全ではない)
- アカウントを無効にする
- 対話型ログオンにスマートカードが必要
- アカウントは重要であり、委任できない
- このアカウントにKerberos DES暗号化タイプを使用する
- このアカウントでKerberos AES 128/256ビット暗号化をサポートする
- Kerberos事前認証を必要としない

これらの各ユーザーアカウント属性は、本質的には1(True)または0(False)のいずれかを取るビット値(フラグ)です。ただし、これらの値は個別のAD属性として保存されるのではなく、UserAccountControl属性として一括管理されます。
上記のすべてのオプションの合計値がUserAccountControl属性の値として保存されます。これらのオプションを異なるユーザー属性に分けて保存する代わりに、単一のActive Directory属性が使用されます。UserAccountControlはビットマスクであり、その各ビットが個別のフラグとなり、On(True)またはOff(False)の値を持ちます。有効になっているアカウントオプションによって、ユーザーのUserAccountControl属性値は異なります。現在の属性値は、対応する「属性エディター」タブまたはPowerShellのGet-ADUserコマンドレットで確認できます。
get-aduser jkelly -properties *|select name,UserAccountControl | ft


この例では、属性値は0x10202(10進数で66050)です。これらの数値は何を意味するのでしょうか?
利用可能なADアカウントフラグの一覧を以下の表に示します。各フラグは特定のUserAccountControlビットに対応し、UserAccountControl値はすべてのフラグの合計値になります。
| UserAccountControl フラグ | 16進数値 | 10進数値 |
|---|---|---|
| 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値は以下の通りです。
- 通常のADユーザー:0x200(512)
- ドメインコントローラー:0x82000(532480)
- ワークステーション/サーバー:0x1000(4096)
LDAPフィルターを使用して、特定のuseraccountcontrol値を持つADオブジェクトを選択できます。例えば、すべてのアクティブ(通常)アカウントを表示するには:
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ビットマスクの値を人間が読みやすい形式に自動変換するツールがあると便利です。ここでは、UserAccountControl属性の10進数値を受け取り、有効になっているアカウントオプションのリストを返すシンプルなPowerShell関数を作成してみましょう。UserAccountControlはビットマスクなので、各ビットにテキスト説明を割り当てることができます。
UserAccountControl値を読み取り可能な形式に変換するために、DecodeUserAccountControlというPowerShell関数を作成しました。
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",
"RESERVED"
)
return (0..($UACPropertyFlags.Length) | ?{$UAC -bAnd [math]::Pow(2,$_)} | %{$UACPropertyFlags[$_]}) -join " | "
}
それでは、UserAccountControl値66050が何を意味するのか確認してみましょう。
DecodeUserAccountControl 66050
ご覧の通り、スクリプトはこのユーザーに対して以下のフラグが有効であることを返しました。
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD

同じスクリプトを使って、Get-ADUserやGet-ADComputerコマンドレットでADアカウント情報を取得する際に、UserAccountControl値をリアルタイムで解読することもできます。例えば:
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

PowerShellでADのUserAccoutControl属性を設定するには?
Set-ADUserおよびSet-ADComputerのPowerShellコマンドレットを使用して、Active DirectoryのUserAccountControl属性の個別オプションを変更できます。どちらのコマンドレットにも専用のパラメーターが用意されています。例えば:
- 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

また、UserAccountControl属性を介して正確な値を直接指定することで、両方のユーザーアカウントオプションを同時に有効化することも可能です。
Set-ADUser jkelly -Replace @{UserAccountControl= 66048}
-
Windows 10でActive Directoryを有効にする方法【RSAT導入から設定まで解説】
Active Directoryは、Windows Server環境を管理するための重要なツールです。ネットワーク上のユーザーやリソースへのアクセス権限を、管理者が制御・付与するために使用されます。Windows PCにはデフォルトではインストールされていませんが、Microsoftの公式サイトから入手して、自分のデバイスにインストールすることが可能です。 「Windows 10でActive Directoryをどう使えばいいのか分からない」とお悩みの方も多いのではないでしょうか。本記事では、Windows 10でActive Directoryを有効にする方法を、初心者の方にも分かりやすく
-
Active Directoryでユーザーの最終ログイン日時を確認する2つの方法
Active Directory上のユーザーが最後にログインした日時を確認したい場合は、本チュートリアルをご活用ください。ここでは、ADユーザーの最終ログイン時刻を調べるための2つの方法(GUI操作とPowerShell)をわかりやすく解説します。ADユーザーが任意のワークステーションからActive Directoryにログオンするたびに、システムはその日時をlastLogon属性およびlastLogonTimestamp属性に記録します。このうち、より正確なのはlastLogon属性です。この属性には、特定のドメインコントローラー(DC)が認証した直近のログオン情報が反映されます。※補足: