PowerShellのSet-ADAccountPasswordでは、ADユーザーのパスワードを変更またはリセットできます。ただし、現在のパスワードを使う「変更」と、権限を持つ管理者による「リセット」は別の操作です。この記事では、オンプレミスのActive Directory Domain Services(AD DS)を対象に、使い分けと対話入力の例を紹介します。
実行前に確認すること
ここでは、組織が管理するドメイン参加済みのWindows管理端末とWindows PowerShell 5.1を前提にします。Microsoft Entra IDのクラウド専用ユーザーやWindowsのローカルユーザー、AD LDSは対象外です。組織の承認を得た通常のユーザーアカウントで確認し、サービス用・特権アカウントへそのまま適用しないでください。
操作対象のドメイン、ユーザーの識別名(DN)、接続する書き込み可能なドメインコントローラー(DC)を事前に確認します。管理端末からDCへの名前解決と必要な管理通信が可能であることも必要です。読み取り専用DC(RODC)やグローバルカタログのポートは、このコマンドの更新先には使えません。
リセットには、対象ユーザーに対するパスワードリセット権限が必要です。必要な範囲に委任された権限で実行し、むやみにDomain Admins権限を使わないでください。端末で「管理者として実行」することと、AD上の操作権限を持つことは別です。参考:Microsoft Learn:AD DSの管理委任。
ActiveDirectoryモジュールを準備する
MicrosoftのActiveDirectoryモジュールは、RSATのAD DS管理ツールに含まれます。Install-Module -Name ActiveDirectoryでPowerShell Galleryから導入する手順ではありません。未導入の場合は、端末管理者が組織の配布方法に従って準備してください。
Windows 11 Pro/Enterpriseでは「オプション機能」のRSAT:Active Directory Domain ServicesおよびLightweight Directory Servicesツールを利用します。対応するWindows Serverでは、サーバーマネージャーの「役割と機能の追加」からAD DS/AD LDS管理ツールのPowerShell用モジュールを選びます。OS・構成により導入方法が異なるため、Microsoft LearnのRSAT導入手順で対象環境を確認してください。管理ツールのためにDCを新設する必要はありません。
Get-Module -ListAvailable -Name ActiveDirectory
何も表示されなければ、利用できるモジュールの準備を先に確認します。以下のスクリプトでは、読み込みに失敗した場合も処理を止めます。
「変更」と「リセット」を選んで実行する
Changeは現在のパスワードと新しいパスワードを指定する変更です。対象の現在のパスワードを知っており、変更が許可されている必要があります。Resetは現在のパスワードを使わず、委任された権限などで新しい値を設定するリセットです。変更が失敗したときに、無断でResetへ切り替えてはいけません。パラメーターの仕様はSet-ADAccountPasswordの公式リファレンスを参照してください。
次の例は、C:\など通常のファイルシステム上から、必要なAD権限を持つアカウントで実行する前提です。$Serverと$Identityは例示値なので、承認済みの値へ置き換えてください。リセットが目的の場合に限り$ModeをResetに変更します。表示された対象が正しいことを確認してから進めます。
# 実環境の書き込み可能な DC と、承認済みの対象 DN に置き換える
$Server = 'dc01.example.com'
$Identity = 'CN=Test User,OU=Users,DC=example,DC=com'
$Mode = 'Change' # Change: 旧→新の変更 / Reset: 権限を持つ管理者のリセット
$OldPassword = $null
$NewPassword = $null
try {
Import-Module ActiveDirectory -ErrorAction Stop
if ($Mode -notin @('Change', 'Reset')) { throw '操作モードが不正です。' }
$User = Get-ADUser -Identity $Identity -Server $Server -ErrorAction Stop
Write-Host ("操作: {0} / DC: {1} / 対象: {2}" -f $Mode, $Server, $User.DistinguishedName)
if ((Read-Host '対象と操作を確認し、実行する場合のみ YES と入力') -cne 'YES') {
Write-Host '中止しました。パスワード更新は要求していません。'
return
}
if ($Mode -eq 'Change') {
$OldPassword = Read-Host '現在のパスワード' -AsSecureString
if ($OldPassword.Length -eq 0) { throw '現在のパスワードは空にできません。' }
}
$NewPassword = Read-Host '新しいパスワード' -AsSecureString
if ($NewPassword.Length -eq 0) { throw '新しいパスワードは空にできません。' }
$Target = @{
Identity = $User.ObjectGUID
Server = $Server
ErrorAction = 'Stop'
}
if ($Mode -eq 'Reset') {
Set-ADAccountPassword @Target -Reset -NewPassword $NewPassword
} else {
Set-ADAccountPassword @Target -OldPassword $OldPassword -NewPassword $NewPassword
}
Write-Host 'コマンドはエラーを返さず終了しました。サインイン確認は別途必要です。'
} catch {
Write-Warning '処理完了を確認できませんでした。原因と実際の状態を確認し、連続して再実行しないでください。'
throw
} finally {
if ($null -ne $OldPassword) { $OldPassword.Dispose() }
if ($null -ne $NewPassword) { $NewPassword.Dispose() }
$OldPassword = $null
$NewPassword = $null
}
パスワードはRead-Host -AsSecureStringで実行時に入力し、コードやコマンド履歴に平文を埋め込まない形にしています。入力値をログ・メール・チャットへ出力しないでください。SecureStringを使っても、端末自体の安全や運用上の秘密管理まで保証されるわけではありません。
エラーと結果の確認
-ErrorAction Stopによって非終了エラーもcatchへ渡し、エラー時には後続の完了メッセージを表示しません。finallyでは入力に使ったSecureStringを破棄します。詳しくは共通パラメーターとtry/catch/finallyの説明を参照してください。
エラーが出た場合は、対象の指定、実行アカウントの権限、DCへの接続、現在のパスワード、対象に適用されるパスワードポリシーを確認します。ポリシーを弱めて通そうとせず、組織のルールに合う値と手順を使ってください。通信切断などで結果が不明な場合は、変更されていないと決めつけず、管理担当者と状態を確認してから再試行します。
Get-ADUserでユーザーを取得できることは、新しいパスワードで認証できる証明ではありません。この例の取得処理は、更新前に対象を確認するためのものです。Get-ADUserはユーザーオブジェクトを取得するコマンドであり、パスワードを検証するものではありません。実際のサインインは、利用者が組織の手順で別途確認し、失敗を繰り返してロックアウトを招かないようにします。
まとめ
ADユーザーのパスワード操作では、RSATの準備、対象DCとユーザーの確認、変更とリセットの使い分けが重要です。必要な権限で実行し、パスワードは対話入力にして、コマンドの終了と実際のサインイン確認を区別しましょう。掲載コードは説明用の例であり、本記事の改訂にあたり実際のAD環境でのパスワード変更・認証テストは行っていません。






コメント