読者です 読者をやめる 読者になる 読者になる

Windowsローカルユーザーのパスワード有効期限確認用PowerShellスクリプト

PowerShell

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)
 

ディレクトリオブジェクトを一覧できるサンプルアプリまで記載あります。自分でコード書いてビルドしないといけないので若干めんどうですが。
チュートリアル : ローカル ディレクトリ オブジェクトの表示