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

Active Directoryユーザーのパスワード有効期限を確認し、期限切れ前に変更を通知する方法(PowerShell活用)

本記事では、PowerShellを使ってActive Directory(AD)ユーザーアカウントのパスワード有効期限を確認する方法、パスワードを無期限に設定する方法(PasswordNeverExpires = True)、そしてパスワードの期限が切れる前にユーザーへ事前に変更を促す通知の仕組みについて解説します。

ドメイン内でユーザーのパスワードが期限切れになると、アカウント自体はロックされませんが、ユーザーが新しいパスワードに変更するまでドメインリソースへアクセスできなくなります。特に問題になりやすいのはリモートユーザーです。標準的なツールではパスワードを変更できないためです。

ドメインのパスワードポリシーと最大パスワード有効期間

ドメインにおけるパスワードの有効期限(最大パスワード有効期間:Maximum Password Age)や複雑性の要件は、ADドメインのパスワードポリシーで定義されます。これらの設定は「Default Domain Policy」または「Fine-Grained Password Policy」で構成します。

現在のドメインのパスワード有効期限ポリシーは、次のPowerShellコマンドで確認できます。

Get-ADDefaultDomainPasswordPolicy | select MaxPasswordAge

この例では、ドメインの最大パスワード有効期間は60日に設定されています。

Active Directoryでユーザーのパスワード有効期限日を取得する方法

コマンドプロンプトからnet userコマンドを使えば、パスワードの経過日数や最終変更日を確認できます。

net user jsmith /domain

出力結果の中で注目すべき項目は以下の通りです。

  • Password last set — 2020/9/9 9:23:59
  • Password expires — 2021/1/7 9:23:59
  • Password changeable — 2020/9/10 9:23:59

このコマンドは任意のユーザーに対して実行可能で、管理者権限やユーザーアカウントコンテナへの委任権限は不要です。

ADアカウントの属性を確認するには、Active Directory用のPowerShellモジュールを使用します。このモジュールにより、さまざまなADオブジェクト属性の値を取得できます(Windows 10やWindows Server 2012 R2/2016へのインストール・インポート手順は別記事を参照してください)。

Get-ADUserコマンドレットを使うと、パスワードの最終変更日時や、PasswordNeverExpiresオプションが設定されているかどうかを確認できます。

get-aduser jsmith -properties PasswordLastSet, PasswordNeverExpires, PasswordExpired | ft Name, PasswordLastSet, PasswordNeverExpires, PasswordExpired

  • PasswordLastSet — パスワードの最終変更日時
  • PasswordNeverExpires — パスワードが無期限の場合にTrueを返す
  • PasswordExpired — パスワードが期限切れならTrue、未期限切れならFalseを返す

GUIで確認したい場合は、MMCスナップインの「Active Directory ユーザーとコンピューター」(dsa.msc)からユーザープロパティを開き、「属性エディター」タブでpwdLastSet属性の値を確認します。ただし、MMCスナップインには最終変更日時しか表示されず、有効期限日は分かりません。

msDS-UserPasswordExpiryTimeComputed属性を使った有効期限日の取得

パスワードの最終変更日ではなく有効期限日を直接取得するには、特別な構築済みAD属性であるmsDS-UserPasswordExpiryTimeComputedを使用します。この値は、最終パスワード変更日とドメインのパスワードポリシーに基づいて自動的に計算されます。

この属性はTimeStamp形式で返されるため、FromFileTime関数で人間が読める形式に変換します。

Get-ADUser -Identity jsmith -Properties msDS-UserPasswordExpiryTimeComputed | select-object @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") }}

これでユーザーのパスワード有効期限日を取得できました。

なお、msDS-UserPasswordExpiryTimeComputedの値が0の場合は、pwdLastSetが空(null)または0であることを意味します(パスワードが一度も変更されていない状態)。

特定OU内の全ユーザーの有効期限日を一括取得するスクリプト

ADの特定コンテナ(OU)に属する全ユーザーのパスワード有効期限日を取得するには、次のPowerShellスクリプトを使用します。

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
$Users | select Name, @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime ($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordLastSet

実行すると、有効なユーザーの一覧と、それぞれの有効期限日・最終パスワード変更日時を含むテーブルが出力されます。

期限切れのパスワードを持つユーザーだけを表示したい場合は、以下のようにフィルタリングできます。

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
foreach($user in $Users){
if( [datetime]::FromFileTime($user."msDS-UserPasswordExpiryTimeComputed") -lt (Get-Date)) {
$user.Name
}
}

ADユーザーのパスワードを無期限に設定する方法

特定のアカウントに恒久的なパスワードを設定したい場合は、ADユーザープロパティの「パスワードを無期限にする(Password Never Expires)」チェックボックスをオンにします(これはUserAccountControl属性のビット値の1つです)。

PowerShellで設定する場合は、次のコマンドを実行します。

Get-ADUser jsmith | Set-ADUser -PasswordNeverExpires:$True

テキストファイルに記載した複数ユーザーに対して一括で適用することも可能です。

$users = Get-Content "C:\PS\users_password_never_expire.txt"
Foreach ($user in $users) {
Set-ADUser $user -PasswordNeverExpires:$True
}

逆に、パスワード無期限オプションが有効になっている全ユーザーの一覧を表示するには、次のコマンドを使います。

Get-ADUser -filter * -properties Name, PasswordNeverExpires | where {$_.passwordNeverExpires -eq "true" } | Select-Object DistinguishedName, Name, Enabled | ft

Active Directoryのパスワード有効期限通知ポリシー

Windowsには、パスワード変更が必要であることをユーザーに通知するためのグループポリシー設定が用意されています。

該当するポリシーは「対話型ログオン: パスワードの有効期限が切れる前に変更を促す(Interactive logon: Prompt user to change password before expiration)」で、GPOの以下の場所にあります。

コンピューターの構成 → ポリシー → Windowsの設定 → セキュリティの設定 → ローカルポリシー → セキュリティオプション

既定ではローカルのWindows設定で有効になっており、パスワードの期限切れ5日前から通知が表示されます。通知を表示し始める日数は変更可能です。

このポリシーを有効にすると、パスワードの有効期限が近づくと、ユーザーがログオンするたびにタスクトレイにパスワード変更の通知が表示されます。

パスワードの変更を検討してください
パスワードの有効期限は xx 日後に切れます。

PowerShellでパスワード変更ダイアログを自動表示する

より柔軟な対応として、パスワードの有効期限が5日以内になった場合に自動的にダイアログウィンドウを表示するシンプルなPowerShellスクリプトも利用できます。

Add-Type -AssemblyName PresentationFramework
$curruser = Get-ADUser -Identity $env:username -Properties 'msDS-UserPasswordExpiryTimeComputed','PasswordNeverExpires'
if ( -not $curruser.'PasswordNeverExpires') {
$timediff = (new-timespan -start (get-date) -end ([datetime]::FromFileTime($curruser."msDS-UserPasswordExpiryTimeComputed"))).Days
if ($timediff -lt 5) {
$msgBoxInput = [System.Windows.MessageBox]::Show("パスワードの有効期限はあと "+ $timediff + " 日です!`n今すぐ変更しますか?","重要!","YesNo","Warning")
switch ($msgBoxInput) {
'Yes' {
cmd /c "explorer shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}"
}
'No' { }
}
}
}

ユーザーが「はい」を選択すると、Ctrl+Alt+Del(RDP/RDS接続の場合はCtrl+Alt+End)を押したときに表示されるWindowsセキュリティ画面が開き、そこからパスワードを変更できます。

このスクリプトは、ユーザーのPCにActive Directory用PowerShellモジュールがインストールされていることを前提としています。RSATが未インストールでも利用可能です(詳細は「RSATなしでADモジュールを使用する方法」の記事を参照)。スクリプトはスタートアップに登録するか、GPOのログオンスクリプトとして実行してください。

PowerShellによるパスワード有効期限のメール通知

パスワードの有効期限をメールでユーザーに通知したい場合は、次のPowerShellスクリプトを使用します。

$Sender = "info@woshub.com"
$Subject = '重要:パスワードの有効期限が近づいています!'
$BodyTxt1 = 'あなたのパスワード('
$BodyTxt2 = ')はあと '
$BodyTxt3 = ' 日で期限切れになります。早めにパスワードを変更してください。ご不明な点はヘルプデスクまでご連絡ください。'
$smtpserver = "smtp.woshub.com"
$warnDays = (get-date).adddays(7)
$2Day = get-date
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, EmailAddress, Name | select Name, @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, EmailAddress
foreach ($user in $users) {
if (($user.ExpirationDate -lt $warnDays) -and ($2Day -lt $user.ExpirationDate) ) {
$lastdays = ( $user.ExpirationDate -$2Day).days
$EmailBody = $BodyTxt1, $user.name, $BodyTxt2, $lastdays, $BodyTxt3 -join ''
Send-MailMessage -To $user.EmailAddress -From $Sender -SmtpServer $smtpserver -Subject $Subject -Body $EmailBody
}
}

このスクリプトは、パスワードの有効期限が近づいているすべての有効なドメインユーザーをチェックします。期限切れの7日前から、ADに登録されたメールアドレス宛てに通知メールが送信され始め、パスワードが変更されるか期限切れになるまで送信が続きます。

なお、管理者がSet-ADAccountPasswordコマンドレットを使えば、ユーザーのパスワード変更を強制することもできます。

このスクリプトは、ドメイン内の任意のコンピューター/サーバーで定期的に実行してください(タスクスケジューラを使うのが簡単です)。また、SMTPサーバー側で、メール送信ホストのIPアドレスを認証なしで送信できる許可済み送信者リストに追加しておく必要があります。

  1. Windows 10のパスワードを変更する5つの方法【設定・コントロールパネル・コマンドプロンプトなど】

    Windowsオペレーティングシステムはユーザーのセキュリティを非常に重視しており、すべてのバージョンにユーザーアカウントを保護するための多彩なツールが搭載されています。その中でも多くのユーザーが選ぶのがパスワードによる保護です。パスワードは信頼性と安全性が高く、最もシンプルなアカウント保護手段だからです。これは最新OSのWindows 10にも当てはまり、パスワードをはじめとする複数のセキュリティ対策でアカウントを守ることができます。さまざまな理由から、Windowsユーザーはアカウントのパスワードを変更したい場面に度々出くわします。Windows 10ではパスワードの変更方法が複数用意され

  2. Windows 7のパスワードを変更する方法【初心者向け手順とセキュリティ対策】

    Windows 7で個人情報を守るためには、パスワードの管理が非常に重要です。ログインパスワードは、コンピュータ内の重要なデータへの不正アクセスを防ぐための第一防衛線となります。そのため、Windows 7のパスワードを定期的に変更することは、セキュリティ維持のために欠かせません。 Windows 7でログインパスワードを簡単に変更する手順 1. 「スタート」ボタンをクリックし、「コントロールパネル」を選択します。 2. コントロールパネルの中から「ユーザーアカウントと家族による使用状況の記録」をクリックします。 3. 「ユーザーアカウント」の項目にある「Windows パスワードの変更」