ADのパスワード有効期限をDirectorySearcherを使ってPowerShellで取得する方法について
この方法を利用した背景
ActiveDirectoryでGPO(Group Policy Object)とPSO(Password Setting Object)を組み合わせてパスワード有効期限のポリシーを設定した際、net userコマンドでは正しいパスワード有効期限を表示できないことがあった。
RSATをインストールしてPowerShellでGet-ADUserコマンドを利用すれば確認ができるが、一般ユーザーのクライアントPC側ではRSATをインストールされておらず、インストールもしたくない。
上記のような状況でRSATのインストールが不要でクライアントPCから追加モジュールなしでパスワード有効期限を確認する方法について説明します。
パスワード有効期限確認方法
ユーザーID t001 のパスワード有効期限を確認する方法
※t001の部分は置き換えて利用してください。
$DS = New-Object System.DirectoryServices.DirectorySearcher
$DS.Filter = [string]::Format("sAMAccountName={0}","t001")
$DS.PropertiesToLoad.Add("msDS-UserPasswordExpiryTimeComputed")
[datetime]::FromFileTime((($DS.FindOne()).Properties.'msds-userpasswordexpirytimecomputed')[0])
実行内容説明
(1) 以下のコマンドを実行することでDirectorySearcher クラスを呼び出しています。.NetのモジュールですがPowerShellでも扱うことが可能です。
$DS = New-Object System.DirectoryServices.DirectorySearcher
(2) Lightweight Directory Access Protocol (LDAP) 形式のフィルター文字列で記載する必要があるのでstringのformatで形式をあわせています。
LDAPでは大文字小文字が区別されるのでそのまま記載する必要があります。
$DS.Filter = [string]::Format("sAMAccountName={0}","t001")
(3) 通常ではパスワード有効期限のスキーマー(msDS-UserPasswordExpiryTimeComputed)が表示されないのでスキーマーを以下のコマンドで追加しています。
$DS.PropertiesToLoad.Add("msDS-UserPasswordExpiryTimeComputed")
(4) 以下のコマンドは複数の内容をまとめているので分解して説明します。
[datetime]::FromFileTime((($DS.FindOne()).Properties.'msds-userpasswordexpirytimecomputed')[0])
(4-1) ADの検索を実行し、最初に見つかったエントリだけを返します。他にはFindAllなど全部を返すコマンドも存在します。
$DS.FindOne()
(4-2) FindOne()で取り出した内容のパスワード有効期限のスキーマ(msds-userpasswordexpirytimecomputed)を取り出します。最後の[0]で最初のデータを取り出します。
(($DS.FindOne()).Properties.'msds-userpasswordexpirytimecomputed')[0]
(4-3) パスワード有効期限のスキーマ(msds-userpasswordexpirytimecomputed)はFILETIME形式で指定されているので以下のようにFILETIME形式を変換する必要があります。
[datetime]::FromFileTime((($DS.FindOne()).Properties.'msds-userpasswordexpirytimecomputed')[0])
参考情報
今回利用したDirectorySearcher クラスは以下のページに詳細が書かれています。主にC#を基準に記載されていますが、今回はこれをPowerShellで実行しています。
FILETIME形式については以下をページに詳細が書かれています。