Windowsのローカルユーザアカウント毎のパスワードの有効期限情報とロックの状態を取得して一覧出力します。
ADからユーザ情報を取得する場合はAD用のコマンドレットや、LDAPプロバイダーを利用しますが、今回はWindowsローカルからの情報取得なのでWINNTプロバイダーを利用します。
$result = @() $accountObjList = Get-CimInstance -ClassName Win32_Account $userObjList = Get-CimInstance -ClassName Win32_UserAccount foreach($userObj in $userObjList) { $IsLocalAccount = ($userObjList | ?{$_.SID -eq $userObj.SID}).LocalAccount if($IsLocalAccount) { $query = "WinNT://{0}/{1},user" -F $env:COMPUTERNAME,$userObj.Name $dirObj = New-Object -TypeName System.DirectoryServices.DirectoryEntry -ArgumentList $query $PasswordExpirationDate = $dirObj.InvokeGet("PasswordExpirationDate") $PasswordExpirationRemainDays = ($PasswordExpirationDate - (Get-Date)).Days $obj = New-Object -TypeName PsObject Add-Member -InputObject $obj -MemberType NoteProperty -Name "UserName" -Value $userObj.Name Add-Member -InputObject $obj -MemberType NoteProperty -Name "PasswordExpirationDate" -Value $PasswordExpirationDate Add-Member -InputObject $obj -MemberType NoteProperty -Name "PasswordExpirationRemainDays" -Value $PasswordExpirationRemainDays Add-Member -InputObject $obj -MemberType NoteProperty -Name "IsAccountLocked" -Value ($dirObj.InvokeGet("IsAccountLocked")) $result += $obj } } $result
アウトプットはこのようになります。パスワードの有効期限が無期限になっているものなどでパスワード有効期限が切れているものは、PasswordExpirationRemainDaysがマイナスになっています。
UserName PasswordExpirationDate PasswordExpirationRemainDays IsAccountLocked -------- ---------------------- ---------------------------- --------------- Administrator 2015/02/16 6:39:59 41 False Guest 2015/02/16 6:39:59 41 False appadm 2014/12/17 9:25:01 -18 False test 2015/02/04 9:20:54 30 False test2 2015/02/16 5:40:35 41 False
参考URL
ADSI Interfacesの仕様確認することで、DirectoryEntryで取得できるプロパティがわかります。
IADsUser interface (Windows)
LDAPやWINNTでそれぞれサポートされているプロパティに違いがあります。
Provider Support of ADSI Interfaces (Windows)
ディレクトリオブジェクトを一覧できるサンプルアプリまで記載あります。自分でコード書いてビルドしないといけないので若干めんどうですが。
チュートリアル : ローカル ディレクトリ オブジェクトの表示