PowerShell - Get Password Expiration for all non Disabled Users in AD
passwords, powershell
Solution
Here's a revised version of your script without looping issues:
$reportObject = @()
$userList = Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" | Where-Object {$_.DisplayName -ne $null}
$userList | %{
$output = "" | Select DisplayName, ExpiryDate
$output.DisplayName = $_.DisplayName
$output.ExpiryDate = ([datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")).DateTime
$reportObject += $output
#Next 2 Lines provide debugging... I'm not sure the date time portion will work without having AD to play with
$output | fl *
([datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")).DateTime
}
$reportObject | Convertto-CSV -NoTypeInformation
Problem
My goal is to create a single object in powershell that shows the AD display name and password expiration date for all non-disabled users. This is relatively easy. However, the date is retrieved in an unreadable format so I convert the date. Creating the two variables that contain the data I want is working. The problem is when I try to combine those two variables I get a single object with two headers as expected but the two columns below are empty. I'm using PowerShell V2 on Win 7 Pro SP1 Any ideas what the issue could be? ``` # Get users DisplayName and password expiration time from AD $msdsComputed = Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" | Where-Object {$_.DisplayName -ne $null} # Convert date to human readable format $ExpiryDate = $msdsComputed | Foreach-Object { ([datetime]::FromFileTime(($_)."msDS-UserPasswordExpiryTimeComputed")) } | Select-Object "DateTime" $combined = @{ DisplayName = $msdsComputed.DisplayName ExpiryDate = $ExpiryDate.DateTime } New-Object PSObject -Property $combined | ConvertTo-Csv -NoTypeInformation ```