- This is a copy of Pearlman's original script. I do not support this script; please go to the original author.
- My highly modified verion is here: https://gist.github.com/meoso/3488ef8e9c77d2beccfd921f991faa64 .
-
-
Save meoso/de56bdc68eced50a65d38e99e306ee42 to your computer and use it in GitHub Desktop.
################################################################################################################# | |
# | |
# Version 1.4 February 2016 | |
# Robert Pearman (WSSMB MVP) | |
# TitleRequired.com | |
# Script to Automated Email Reminders when Users Passwords due to Expire. | |
# | |
# Requires: Windows PowerShell Module for Active Directory | |
# | |
# For assistance and ideas, visit the TechNet Gallery Q&A Page. http://gallery.technet.microsoft.com/Password-Expiry-Email-177c3e27/view/Discussions#content | |
# Or Checkout my Youtube Channel - https://www.youtube.com/user/robtitlerequired | |
# | |
################################################################################################################## | |
# Please Configure the following variables.... | |
$smtpServer="mail.server.com" | |
$expireindays = 21 | |
$from = "Company Administrator <support@mycompany.com>" | |
$logging = "Enabled" # Set to Disabled to Disable Logging | |
$logFile = "<log file path>" # ie. c:\mylog.csv | |
$testing = "Enabled" # Set to Disabled to Email Users | |
$testRecipient = "testuser@company.com" | |
# | |
################################################################################################################### | |
# Check Logging Settings | |
if (($logging) -eq "Enabled") | |
{ | |
# Test Log File Path | |
$logfilePath = (Test-Path $logFile) | |
if (($logFilePath) -ne "True") | |
{ | |
# Create CSV File and Headers | |
New-Item $logfile -ItemType File | |
Add-Content $logfile "Date,Name,EmailAddress,DaystoExpire,ExpiresOn,Notified" | |
} | |
} # End Logging Check | |
# System Settings | |
$textEncoding = [System.Text.Encoding]::UTF8 | |
$date = Get-Date -format ddMMyyyy | |
# End System Settings | |
# Get Users From AD who are Enabled, Passwords Expire and are Not Currently Expired | |
Import-Module ActiveDirectory | |
$users = get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false } | |
$DefaultmaxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge | |
# Process Each User for Password Expiry | |
foreach ($user in $users) | |
{ | |
$Name = $user.Name | |
$emailaddress = $user.emailaddress | |
$passwordSetDate = $user.PasswordLastSet | |
$PasswordPol = (Get-AduserResultantPasswordPolicy $user) | |
$sent = "" # Reset Sent Flag | |
# Check for Fine Grained Password | |
if (($PasswordPol) -ne $null) | |
{ | |
$maxPasswordAge = ($PasswordPol).MaxPasswordAge | |
} | |
else | |
{ | |
# No FGP set to Domain Default | |
$maxPasswordAge = $DefaultmaxPasswordAge | |
} | |
$expireson = $passwordsetdate + $maxPasswordAge | |
$today = (get-date) | |
$daystoexpire = (New-TimeSpan -Start $today -End $Expireson).Days | |
# Set Greeting based on Number of Days to Expiry. | |
# Check Number of Days to Expiry | |
$messageDays = $daystoexpire | |
if (($messageDays) -gt "1") | |
{ | |
$messageDays = "in " + "$daystoexpire" + " days." | |
} | |
else | |
{ | |
$messageDays = "today." | |
} | |
# Email Subject Set Here | |
$subject="Your password will expire $messageDays" | |
# Email Body Set Here, Note You can use HTML, including Images. | |
$body =" | |
Dear $name, | |
<p> Your Password will expire $messageDays<br> | |
To change your password on a PC press CTRL ALT Delete and choose Change Password <br> | |
<p>Thanks, <br> | |
</P>" | |
# If Testing Is Enabled - Email Administrator | |
if (($testing) -eq "Enabled") | |
{ | |
$emailaddress = $testRecipient | |
} # End Testing | |
# If a user has no email address listed | |
if (($emailaddress) -eq $null) | |
{ | |
$emailaddress = $testRecipient | |
}# End No Valid Email | |
# Send Email Message | |
if (($daystoexpire -ge "0") -and ($daystoexpire -lt $expireindays)) | |
{ | |
$sent = "Yes" | |
# If Logging is Enabled Log Details | |
if (($logging) -eq "Enabled") | |
{ | |
Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson,$sent" | |
} | |
# Send Email Message | |
Send-Mailmessage -smtpServer $smtpServer -from $from -to $emailaddress -subject $subject -body $body -bodyasHTML -priority High -Encoding $textEncoding | |
} # End Send Message | |
else # Log Non Expiring Password | |
{ | |
$sent = "No" | |
# If Logging is Enabled Log Details | |
if (($logging) -eq "Enabled") | |
{ | |
Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson,$sent" | |
} | |
} | |
} # End User Processing | |
# End |
**Try some variation of [...]
I tried it but it didnt work.
I tried it but it didnt work.
so
$users = (Get-ADGroup -Identity $GroupName -properties members).Members | get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }
where $GroupName
is set for your group, still fails?
EDIT: do not use -filter *
$users = (Get-ADGroup -Identity $GroupName -properties members).Members | get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }
Thanks, my bad. I missed something. After fixing it, it runs but it gets notification for everyone not the people in the specific security group I specified.
[...]] it runs but it gets notification for everyone not the people in the specific security group I specified.
try without the -filter *
. This is an interesting use-case. maybe i should do some coding/testing myself.
try without the
-filter *
. This is an interesting use-case. maybe i should do some coding/testing myself.
Thanks! I will try that and let you know.
@Odakolo , i just tested without -filter *
; It works.
$users = (Get-ADGroup -Identity $GroupName -properties members).Members | get-aduser -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }
where my group had 4 users. 1 of which with a soon to expire password.
seems like there would be a way to simplify this as well, rather than piping, but i'm happy enough with that line.
@Odakolo , i just tested without
-filter *
; It works.
THANKS! it works!
Try some variation of
(Get-ADGroup -Identity $GroupName -properties members).Members | Get-ADUser
,where this format of
(Get-ADGroup -Identity $GroupName -properties members).Members
is a workaround for a 5000 user-count limitation existing inGet-ADGroupMember -Identity $GroupName