# ==================================================================== # Search in AD for expiring password accounts. To be used through NRPE / nsclient++ # Author: Alessandro Tosi # mail: tosiale82@gmail.com # version 0.1 # ==================================================================== # # Do not change anything behind that line! # param ( [int]$DaysWarningExpiration = 8, [int]$DaysErrorExpiration = 3 ) # check that powershell ActiveDirectory module is present if(Get-Module -Name "ActiveDirectory" -ListAvailable) { try { Import-Module -Name ActiveDirectory } catch { Write-Host "CRITICAL: Missing PowerShell ActiveDirectory module" exit 2 } } else { Write-Host "CRITICAL: Missing PowerShell ActiveDirectory module" exit 2 } #Set the days where the password is already expired and needs to change. -- Do Not Modify -- $MaxPwdAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Days $expiredDate = (Get-Date).addDays(-$MaxPwdAge) #Set the number of days until you would like to begin notifing the users. -- Do Not Modify -- $WarningDate = (Get-Date).addDays(-($MaxPwdAge - $DaysWarningExpiration -1)) $ErrorDate = (Get-Date).addDays(-($MaxPwdAge - $DaysErrorExpiration -1)) #Filters for all users who's password is within date of expiration. $WarningUsers = Get-ADUser -Filter {(PasswordLastSet -lt $WarningDate) -and (PasswordLastSet -gt $ErrorDate) -and (PasswordNeverExpires -eq $false) -and (Enabled -eq $true)} -Properties PasswordNeverExpires, PasswordLastSet | select SamAccountName, PasswordLastSet, @{name = "DaysUntilExpired"; Expression = {$_.PasswordLastSet - $ExpiredDate | select -ExpandProperty Days}} | Sort-Object PasswordLastSet $ErrorUsers = Get-ADUser -Filter {(PasswordLastSet -lt $ErrorDate) -and (PasswordLastSet -gt $expiredDate) -and (PasswordNeverExpires -eq $false) -and (Enabled -eq $true)} -Properties PasswordNeverExpires, PasswordLastSet | select SamAccountName, PasswordLastSet, @{name = "DaysUntilExpired"; Expression = {$_.PasswordLastSet - $ExpiredDate | select -ExpandProperty Days}} | Sort-Object PasswordLastSet $Critical = @() $Warning = @() $Critical = $ErrorUsers $Warning = $WarningUsers if($ErrorUsers.Count -gt 0) { $state="CRITICAL" Write-Host "CRITICAL: ", $ErrorUsers.Count, "users has the password expiring in the next", $DaysErrorExpiration, "days " Write-Host "" foreach ($Critical in $Critical) { Write-Host "\n $($Critical.SamAccountName) ($($Critical.DaysUntilExpired) days) " } Write-Host "\n\n WARNINGS (from $DaysErrorExpiration to $DaysWarningExpiration days):" foreach ($Warning in $Warning){ Write-Host "\n $($Warning.SamAccountName) ($($Warning.DaysUntilExpired) days) " } exit 2 } elseif($WarningUsers.Count -gt 0) { $state="WARNING" Write-Host "WARNING: ", $WarningUsers.Count, "users has the password expiring in the next", $DaysWarningExpiration, "days " foreach ($Warning in $Warning){ Write-Host "\n $($Warning.SamAccountName) ($($Warning.DaysUntilExpired) days) " } exit 1 } else { $state="OK" Write-Host "OK: No user has the password expiring in the next", $DaysWarningExpiration, "days" exit 0 }