Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

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事前認証を必要としない

Active DirectoryのUserAccountControl属性とは?ビットマスク値の解読・設定方法を徹底解説

これらの各ユーザーアカウント属性は、本質的には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

Active DirectoryのUserAccountControl属性とは?ビットマスク値の解読・設定方法を徹底解説

Active DirectoryのUserAccountControl属性とは?ビットマスク値の解読・設定方法を徹底解説

この例では、属性値は0x10202(10進数で66050)です。これらの数値は何を意味するのでしょうか?

利用可能なADアカウントフラグの一覧を以下の表に示します。各フラグは特定のUserAccountControlビットに対応し、UserAccountControl値はすべてのフラグの合計値になります。

UserAccountControl フラグ16進数値10進数値
SCRIPT(ログオンスクリプトの実行)0x00011
ACCOUNTDISABLE(アカウントが無効)0x00022
HOMEDIR_REQUIRED(ホームフォルダーが必須)0x00088
LOCKOUT(アカウントがロック中)0x001016
PASSWD_NOTREQD(パスワード不要)0x002032
PASSWD_CANT_CHANGE(ユーザーによるパスワード変更を禁止)0x004064
ENCRYPTED_TEXT_PWD_ALLOWED(可逆暗号化でパスワードを保存)0x0080128
TEMP_DUPLICATE_ACCOUNT(プライマリアカウントが別ドメインにあるユーザーのアカウント)0x0100256
NORMAL_ACCOUNT(デフォルトのアカウント、一般的なアクティブなアカウント)0x0200512
INTERDOMAIN_TRUST_ACCOUNT0x08002048
WORKSTATION_TRUST_ACCOUNT0x10004096
SERVER_TRUST_ACCOUNT0x20008192
DONT_EXPIRE_PASSWORD(パスワードが無期限のユーザーアカウント)0x1000065536
MNS_LOGON_ACCOUNT0x20000131072
SMARTCARD_REQUIRED(ネットワークへのログオンにスマートカードが必要)0x40000262144
TRUSTED_FOR_DELEGATION0x80000524288
NOT_DELEGATED0x1000001048576
USE_DES_KEY_ONLY0x2000002097152
DONT_REQ_PREAUTH(Kerberos事前認証が不要)0x4000004194304
PASSWORD_EXPIRED(ユーザーパスワードの有効期限切れ)0x8000008388608
TRUSTED_TO_AUTH_FOR_DELEGATION0x100000016777216
PARTIAL_SECRETS_ACCOUNT0x0400000067108864

例えば、パスワード変更の要件が無効になっている通常のアカウントがある場合、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

Active DirectoryのUserAccountControl属性とは?ビットマスク値の解読・設定方法を徹底解説

同じスクリプトを使って、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

Active DirectoryのUserAccountControl属性とは?ビットマスク値の解読・設定方法を徹底解説

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

Active DirectoryのUserAccountControl属性とは?ビットマスク値の解読・設定方法を徹底解説

また、UserAccountControl属性を介して正確な値を直接指定することで、両方のユーザーアカウントオプションを同時に有効化することも可能です。

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

  1. Windows 10でActive Directoryを有効にする方法【RSAT導入から設定まで解説】

    Active Directoryは、Windows Server環境を管理するための重要なツールです。ネットワーク上のユーザーやリソースへのアクセス権限を、管理者が制御・付与するために使用されます。Windows PCにはデフォルトではインストールされていませんが、Microsoftの公式サイトから入手して、自分のデバイスにインストールすることが可能です。 「Windows 10でActive Directoryをどう使えばいいのか分からない」とお悩みの方も多いのではないでしょうか。本記事では、Windows 10でActive Directoryを有効にする方法を、初心者の方にも分かりやすく

  2. Active Directoryでユーザーの最終ログイン日時を確認する2つの方法

    Active Directory上のユーザーが最後にログインした日時を確認したい場合は、本チュートリアルをご活用ください。ここでは、ADユーザーの最終ログイン時刻を調べるための2つの方法(GUI操作とPowerShell)をわかりやすく解説します。ADユーザーが任意のワークステーションからActive Directoryにログオンするたびに、システムはその日時をlastLogon属性およびlastLogonTimestamp属性に記録します。このうち、より正確なのはlastLogon属性です。この属性には、特定のドメインコントローラー(DC)が認証した直近のログオン情報が反映されます。※補足: