有効期限切れのパスワードを持つActive Directoryユーザーを検索する方法(PowerShell)

アクティブディレクトリユーザーの期限切れパスワードを見つける(PowerShell)。あなたは、Active Directory(AD)環境でパスワードを管理する責任がありますか?重要なタスクの1つは、パスワードの期限が切れたユーザーを特定することです。これらのユーザーは、パスワードをリセットするまでアカウントにログインできなくなります。この記事では、PowerShellを効率的に使用して期限切れのパスワードを持つActive Directoryユーザーを見つける方法を紹介します。

私たちの記事ブログ、「アクティブディレクトリユーザーの期限切れパスワードを見つける(PowerShell)」を始めましょう。

PowerShellを使用して期限切れのパスワードを持つADユーザーを見つける

パスワードリセットや有効期限の通知など、特定のユーザーを素早く対象にすることで、この記事に従うことで時間と労力を節約できます。ネットワーク管理者であるか、単にActive Directory環境のセキュリティを向上させたい場合でも、このガイドには始めるために必要な情報が提供されています。

前提条件

この記事に従う予定であれば、次のものが必要です:

  • A Windows computer joined to an Active Directory domain.
  • コンピューターにインストールされたActiveDirectoryモジュール 。
  • コンピューターには、少なくともWindows PowerShell 5.1以上が必要です。

Active Directoryでユーザーを見つける

ユーザーパスワードをリセットする前に、まずアカウントを特定する必要があります。そのため、最初のステップはリザーブが存在するかどうかを判断することです。これを行うには、Get-ADUserコマンドレットをIdentityパラメーターをアカウントの名前に設定して実行します。

Identityパラメーターは、4つの識別子のいずれかを受け入れます:識別名(DN)、GUID(objectGUID)、セキュリティID(objectSID)、またはSAMアカウント名(SAMAccountName)。

たとえば、特定のユーザーのパスワードをリセットする場合、アカウントリセットを発行する前にユーザーが存在することを最初に確認する必要があります。これを行うには、次のコマンドをコピーして、PowerShell コンソールに貼り付けます。まず、ユーザー名を正しいものに変更してください:

Get-ADUser -Identity

コマンドは、ユーザーのプロパティを返し、以下のスクリーンショットに示すように、アカウントが存在し、ユーザー名が正しいことを確認しました:

AD内の有効期限切れパスワードを持つユーザーを見つける

単一のユーザーのパスワード有効期限を迅速に取得するには、Get-ADUser コマンドに msDS-UserPasswordExpiryTimeComputed 属性を追加して使用します:

Get-ADUser -Identity USERNAME -Properties 'msDS-UserPasswordExpiryTimeComputed'

ただし、このコードだけでは人間に読み取れない出力が生成されますので、以下の行を追加して結果を読み取りやすい形式に変換する必要があります。以下の行を追加するには、新しい PowerShell パイプライン 上で Select-Object -Property コマンドを使用します:

Select-Object -Property {[datetime]::FromFileTime($_.”msDS-UserPasswordExpiryTimeComputed”)}

同じ属性 msDS-UserPasswordExpiryTimeComputed を適切なフィルターとともに実行すると、Active Directory アカウントとそのパスワード有効期限の一覧が得られます:

Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property "Displayname",@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}

上記のスクリプトを改良し、ユーザーのリストを後で使用できるテキストファイルにエクスポートします。これには、出力をテキストファイルに送信する Out-File コマンドを使用できます。

Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property "GivenName" |
Out-File -FilePath .\userslist.txt

上記のスクリプトは、後で使用できるuserslist.txtという名前のファイルを生成します。また、出力からExpiryDateプロパティを省略しました。期限切れのアカウントのユーザーIDのみ必要です。このリストは後述の大規模なリクメディエーションに使用されます。

アクティブディレクトリユーザーパスワードのリセット

今、Get-ADUserを使用してユーザーアカウントを検証する方法を学びましたので、結果が有効であることとユーザーIDが存在することを知っています。今度は、ユーザーのパスワードをリセットするためにSet-ADAccountPasswordコマンドレットを使用する必要があります。

Set-ADAccountPasswordコマンドは、古いパスワードを提供すればユーザーのパスワードを変更します。古いパスワードがない場合、コマンドレットはResetパラメーターでそれをリセットします。

新しくランダムに生成されたパスワードは、5つの非アルファヌメリック文字を含む14文字のランダムなパスワードです。実行するには、PowerShellウィンドウを開いて、コードをコピーし、PowerShellに貼り付けてEnterキーを押します:

$username = USERNAME
Add-Type -AssemblyName 'System.Web'
$randomPassword = [System.Web.Security.Membership]::GeneratePassword(14, 5)
$newPassword = $randomPassword | ConvertTo-SecureString -AsPlainText -Force
Set-ADAccountPassword -Identity $username -NewPassword $newPassword -Reset |
Set-ADUser -ChangePasswordAtLogon true
$randomPassword
  • 行1: パスワードをリセットするユーザー名を指定します。実際のユーザーIDでUSERNAME文字列を置き換えてください。
  • 行2: System.Web .NETアセンブリオブジェクトクラスをインポートします。
  • 行3: 14文字の長さで、5つの非英数字文字を持つランダムなパスワードを生成します。
  • 行4: 平文パスワードをセキュアな文字列パスワードオブジェクトに変換します。
  • 行5: パスワードのリセットを容易にします。
  • 行6: 次回のログオン時にパスワードの変更をADアカウントに強制します。
  • 行7: 新しいパスワードをコンソールに表示します。ただし、セキュリティの目的上、これを推奨していません。行6はパスワードの変更をユーザーの好みに合わせ、この手順の最良の方法と見なされます。

Active DirectoryセキュリティとAzure ADを向上させる

無料で試してみてください。全機能にアクセス可能。- 200以上のADレポートテンプレートが利用可能です。独自のADレポートを簡単にカスタマイズできます。




Active Directoryパスワードリセットツールの作成

現在、ユーザーのパスワードをリセットするために使用するスクリプトがあります。次のステップは、スクリプトをツールにすることです。再利用可能なツールは、最小限の手動ユーザー操作で同じアクションを実行します。

ツールを構築する際の重要な側面の1つは、ツールを実行する人が毎回コードを編集する必要がないことです。残念ながら、私たちのコードはまだ$username変数を編集する必要があります。

ツールのユーザーが手動で値を変更できないようにする代わりに、パラメータを受け入れるスクリプトを書くのはどうでしょうか?そうするために、以下の手順を実行してください。

  1. Windows PowerShell ISEを開きます。
  2. 新しいPowerShellファイルを作成し、ファイル名をReset-ADPassword.ps1にして保存します。この記事では、ファイルをC:\PS\scriptsフォルダに保存します。
  3. スクリプトエディタに以下のコードをコピーして貼り付け、スクリプトを保存してください。
param (
     $username
 )

 if (-not($username)) {
     Write-Host "Username not found. Exiting script"
     return $null
 }

 try {
     $null = Get-ADUser -Identity $username -ErrorAction Stop
 } catch {
     Write-Host $_.Exception.Message
     return $null
 }

$randomPassword = [System.Web.Security.Membership]::GeneratePassword(14, 5)
$newPassword = $randomPassword | ConvertTo-SecureString -AsPlainText -Force

 try {
     Set-ADAccountPassword -Identity $username -NewPassword $newPassword -Reset -ErrorAction Stop
     Set-ADuser -Identity $username -ChangePasswordAtLogon $true

     [pscustomobject]@{
         Username = $username
         NewPassword = $randomPassword
     }
 } catch {
     Write-Host "There was an error performing the password reset. Please find additional information below."
     Write-host $_.Exception.Message
     return $null
 }
  • 行1: パラメーターを追加します。 ユーザー名という名前です。
  • 行5: ユーザーがユーザー名の値を提供したかどうかを確認します。ifブロックは、条件が満たされた場合にメッセージを表示し、スクリプトを終了します。
  • 行10: ユーザー名が有効かどうかを確認します。
  • 行12: ユーザー名が無効である場合に検証します。メッセージを表示し、スクリプトの実行を停止します。
  • 行17: 5つの非アルファベット文字を含む14文字のランダムなパスワードを生成します。
  • 行18: プレーンテキストのパスワードをセキュリティ文字列のパスワードオブジェクトに変換します。
  • 行20: パスワードのリセットを容易にします。
  • 行22: ADアカウントに次回ログオン時にパスワードを変更するように強制します。
  • 行24: 新しいパスワードをコンソールに表示します。ただし、セキュリティ上の理由からこれは推奨されていません。行6はユーザーの好みに合わせてパスワードを変更することを担当し、この手順において最良の実践と見なされています。
  • 行28: リセットが失敗した場合にエラーメッセージを表示します。

Example Executions of the AD Password Reset Tool

A PowerShell console pane is already available if we use Windows PowerShell ISE. If not, we should launch a separate PowerShell session. Change the current working directory to the destination folder where the script was saved, such as Set-Location C:\PS\Scripts.

パスワードのリセットを行うユーザー単位

たとえば、1人のユーザーのパスワードをリセットする必要があるとします。まず、Active Directoryのパスワードリセットツールを実行し、対象となるユーザー名を指定します。たとえば、1人のユーザーのパスワードをリセットするために、以下のようにスクリプトを実行します。

.\Reset-ADPassword.ps1 -username USERNAME

その結果、スクリプトはパスワードをリセットし、画面に表示します。たとえば、この出力は、新しいパスワードを影響を受けるユーザーに送信します。

複数のユーザーのパスワードをリセットする

幸いなことに、PowerShellで配列とforeachループを使用してリストをループ処理できます。さらに、ForEach-Objectコマンドレットを使用すると、複数のアイテムを同時に処理できます。このコマンドレットを使用すると、さまざまなアイテムをパイプラインに渡すことができます。

複数のユーザーのパスワードをリセットするには、2つ以上のユーザー名を含む配列を作成します。配列のアイテムはパイプラインを通過し、ForEach-ObjectPowerShellコマンドが各ユーザー名でパスワードリセットツールを実行します。

@('user1', 'user2') | ForEach-Object {.\Reset-ADPassword.ps1 -username $PSItem}

ただし、2つ以上のユーザーアカウントを修復する場合は、これを改善できます。前に作成したテキストファイルを覚えていますか?このセクションではそれを利用します。

ユーザーアカウントを含むテキストファイルを読み込んで、それぞれにADパスワードリセットツールを実行する必要があります。これを行うには、Get-Content cmdletを使用してテキストファイルの内容をPowerShellにインポートします。その後、スクリプトはデータをパイプラインに送信し、各アカウントでADパスワードリセットスクリプトを実行します。

Get-Content .\userslist.txt | ForEach-Object {.\Reset-ADPassword.ps1 -username $PSItem}

上記のスニペットを実行した後、1回の実行で複数のユーザーパスワードをリセットすることができます。

「PowerShellで有効期限切れのパスワードを持つActive Directoryユーザーを検索する方法(ブログ記事)」をお読みいただき、ありがとうございます。これで終了します。

有効期限切れのパスワードを持つADユーザーを検索するPowerShellの結論

結論として、PowerShellを使用してActive Directoryのパスワードの期限が切れたユーザーを見つけることは、時間と労力を節約するための簡単なプロセスです。Get-ADUserコマンドレットを使用し、パスワードの期限が切れたユーザーをフィルタリングすることで、パスワードのリセットや期限切れの通知の対象となる特定のユーザーを迅速に特定することができます。このコマンドは、多数のユーザーを持つ組織にとって便利であり、パスワードの期限切れの管理を積極的に行い、セキュリティ侵害のリスクを減らすことができます。

さらに、当社のブログのActive Directoryセクションをこちらで、PowerShellセクションをこちらで、他のコンテンツを読むこともできます。

Source:
https://infrasos.com/find-active-directory-users-with-expired-password-powershell/