windows AD域控密码过期邮件通知迭代版本
利用poweshell脚本在域控服务器上查找即将过期的账号,并邮件推送至用户和管理员
针对 windows AD域控密码过期邮件通知 - 二乘八是十六 - 博客园 (cnblogs.com)文章的升级版本
- 脚本升级内容:
- 对账号设置三种形式:即将过期、已经过期、未激活三种状态进行通知
- 对密码过期时间进行算法优化,解决一些不存在的参数时脚本报错
- 针对已经过期、未激活账号推送至域控管理员
- 优化脚本可读性
############################################
#Author: kidwu
#Email:
#For:检测AD密码过期时间并邮件通知
#Version:1.3
##############################################
Import-Module Activedirectory
# 排除某个OU里面的数据
$ouToExclude = "OU=External,OU=SEC,DC=sec,DC=local"
# 筛选出账号为开启,且密码未设置为永不过期的用户,并排查掉External OU
$alladuser = Get-ADUser -SearchBase "OU=sec,DC=SEC,DC=local" -Filter {Enabled -eq $true -and PasswordNeverExpires -eq $false} | Where-Object { $_.DistinguishedName -notlike "*$ouToExclude" } | %{$_.Samaccountname}
# 定义密码即将过期用户的占位符
$userlist = @()
# 定义密码已经过期的用户占位符
$expiredUsers = @()
# 定义账号未激活的用户占位符
$soonToExpireUsers = @()
#################################################
#检测AD密码过期后发送邮件的邮箱
##################################################
# 定义发送邮箱
$From ="xxx@qq.com"
# 定义发送SMTP服务器
$SMTPServer ="smtp.qq.com"
# 定义SMTP端口,如果出现证书错误,可考虑使用25端口
$SMTPPort ="587"
# 定义发送邮件的通知邮箱
$Username = "xxx@qq.com"
# 定义通知邮箱的密码
$Password = "password"
# 邮箱账号密码加密
$SecurePassword = ConvertTo-SecureString $Password -AsPlainText -Force
$Credentials = New-Object System.Management.Automation.PSCredential($UserName, $SecurePassword)
# 设置推送至域管理员的邮箱
$managermail = "xxxx@qq.com"
#################################################
# 检测AD密码过期时间并邮件通知相应账户和管理员
#################################################
foreach ($user in $alladuser) {
$userpassinfo = Get-ADUser $user -Properties msDS-UserPasswordExpiryTimeComputed
$pwdExpiryTimeFileTime = $userpassinfo.'msDS-UserPasswordExpiryTimeComputed'
$usermail=Get-ADUser $user -Properties * | %{$_.mail}
$userdisName=Get-ADUser $user -Properties * | %{$_.displayName}
$PasswordLastSet = Get-ADUser $user -Properties * | %{$_.pwdLastSet}
$plastTimeFileTime = [datetime]::FromFileTime([int64]$PasswordLastSet)
$pwdExpiryTime = [datetime]::FromFileTime([int64]$pwdExpiryTimeFileTime)
$now = Get-Date
$expire_days = ($pwdExpiryTime - $now).Days
if($expire_days -eq 15){
$chineseusername= Get-ADUser $user -Properties * | %{$_.Displayname}
#邮件正文
$Emailbody=
"亲爱的 $chineseusername 同学 :
您的域账户密码即将在 $expire_days 天后过期, $pwdExpiryTime 之后密码过期未修改会导致您无法使用域账号登陆各种系统,请您尽快更改。
重置密码过程请遵循以下原则:
○ 密码长度最少 8 位;
○ 密码可使用最长时间 90天,过期需要更改密码;
○ 密码不得重新设置为初始密码;
○ 强制密码历史 2个(不能使用之前最近使用的 2 个密码);
○ 密码符合复杂性需求(大写字母、小写字母、数字和符号四种中必须有三种、且密码口令中不得包括全部或部分用户名)
密码修改系统如下:
○ 修改密码连接:密码修改的URL
○ 重置密码链接:密码重置系统的URL
谢谢,祝您生活愉快!
"
#################################################
#发送告警邮件
##################################################
Send-MailMessage -from $From -to $usermail -subject "您的域控账户密码即将过期" -body $Emailbody -smtpserver $SMTPServer -port $SMTPPort -UseSsl -Credential $credentials -Encoding ([System.Text.Encoding]::UTF8)
#############################################
$username=Get-ADUser $user -Properties *
$userobject=New-object psobject
$userobject | Add-Member -membertype noteproperty -Name 用户名 -value $username.displayname
$userobject | Add-Member -membertype noteproperty -Name 邮箱 -Value $username.mail
$userobject | Add-Member -membertype noteproperty -Name 最后一次密码设置 -Value $plastTimeFileTime
$userobject | Add-Member -membertype noteproperty -Name 密码过期时间 -Value $pwdExpiryTime
$userobject | Add-Member -membertype noteproperty -Name 距离密码过期天数 -Value $expire_days
$userlist+=$userobject
}
elseif($expire_days -eq 7){
$chineseusername= Get-ADUser $user -Properties * | %{$_.Displayname}
#邮件正文
$Emailbody=
"亲爱的 $chineseusername 同学 :
您的域账户密码即将在 $expire_days 天后过期, $pwdExpiryTime 之后密码过期未修改会导致您无法使用域账号登陆各种系统,请您尽快更改。
重置密码过程请遵循以下原则:
○ 密码长度最少 8 位;
○ 密码可使用最长时间 90天,过期需要更改密码;
○ 密码不得重新设置为初始密码;
○ 强制密码历史 2个(不能使用之前最近使用的 2 个密码);
○ 密码符合复杂性需求(大写字母、小写字母、数字和符号四种中必须有三种、且密码口令中不得包括全部或部分用户名)
密码修改系统如下:
○ 修改密码连接:密码修改的URL
○ 重置密码链接:密码重置系统的URL
谢谢,祝您生活愉快!
"
#################################################
#发送告警邮件
##################################################
Send-MailMessage -from $From -to $usermail -subject "您的域控账户密码即将过期" -body $Emailbody -smtpserver $SMTPServer -port $SMTPPort -UseSsl -Credential $credentials -Encoding ([System.Text.Encoding]::UTF8)
#############################################
$username=Get-ADUser $user -Properties *
$userobject=New-object psobject
$userobject | Add-Member -membertype noteproperty -Name 用户名 -value $username.displayname
$userobject | Add-Member -membertype noteproperty -Name 邮箱 -Value $username.mail
$userobject | Add-Member -membertype noteproperty -Name 最后一次密码设置 -Value $plastTimeFileTime
$userobject | Add-Member -membertype noteproperty -Name 密码过期时间 -Value $pwdExpiryTime
$userobject | Add-Member -membertype noteproperty -Name 距离密码过期天数 -Value $expire_days
$userlist+=$userobject
}
elseif($expire_days -ge 0 -and $expire_days -le 2){
$chineseusername= Get-ADUser $user -Properties * | %{$_.Displayname}
#邮件正文
$Emailbody=
"亲爱的 $chineseusername 同学 :
您的域账户密码即将在 $expire_days 天后过期, $pwdExpiryTime 之后密码过期未修改会导致您无法使用域账号登陆各种系统,请您尽快更改。
重置密码过程请遵循以下原则:
○ 密码长度最少 8 位;
○ 密码可使用最长时间 90天,过期需要更改密码;
○ 密码不得重新设置为初始密码;
○ 强制密码历史 2个(不能使用之前最近使用的 2 个密码);
○ 密码符合复杂性需求(大写字母、小写字母、数字和符号四种中必须有三种、且密码口令中不得包括全部或部分用户名)
密码修改系统如下:
○ 修改密码连接:密码修改的URL
○ 重置密码链接:密码重置系统的URL
谢谢,祝您生活愉快!
"
#################################################
#发送告警邮件
##################################################
Send-MailMessage -from $From -to $usermail -subject "您的域控账户密码即将过期" -body $Emailbody -smtpserver $SMTPServer -port $SMTPPort -UseSsl -Credential $credentials -Encoding ([System.Text.Encoding]::UTF8)
#############################################
$username=Get-ADUser $user -Properties *
$userobject=New-object psobject
$userobject | Add-Member -membertype noteproperty -Name 用户名 -value $username.displayname
$userobject | Add-Member -membertype noteproperty -Name 邮箱 -Value $username.mail
$userobject | Add-Member -membertype noteproperty -Name 最后一次密码设置 -Value $plastTimeFileTime
$userobject | Add-Member -membertype noteproperty -Name 密码过期时间 -Value $pwdExpiryTime
$userobject | Add-Member -membertype noteproperty -Name 距离密码过期天数 -Value $expire_days
$userlist+=$userobject
}
elseif($expire_days -gt -10000 -and $expire_days -lt 0) {
$username=Get-ADUser $user -Properties *
$userobject=New-object psobject
$userobject | Add-Member -membertype noteproperty -Name 用户名 -value $username.displayname
$userobject | Add-Member -membertype noteproperty -Name 邮箱 -Value $username.mail
$userobject | Add-Member -membertype noteproperty -Name 最后一次密码设置 -Value $plastTimeFileTime
$userobject | Add-Member -membertype noteproperty -Name 密码过期时间 -Value $pwdExpiryTime
$userobject | Add-Member -membertype noteproperty -Name 距离密码过期天数 -Value $expire_days
$expiredUsers+=$userobject
}
elseif($expire_days -lt -15470) {
$username=Get-ADUser $user -Properties *
$userobject=New-object psobject
$userobject | Add-Member -membertype noteproperty -Name 用户名 -value $username.displayname
$userobject | Add-Member -membertype noteproperty -Name 邮箱 -Value $username.mail
$userobject | Add-Member -membertype noteproperty -Name 最后一次密码设置 -Value $plastTimeFileTime
$userobject | Add-Member -membertype noteproperty -Name 密码过期时间 -Value $pwdExpiryTime
$userobject | Add-Member -membertype noteproperty -Name 距离密码过期天数 -Value $expire_days
$soonToExpireUsers+=$userobject
}
}
$EmailbodyHTML=$userlist|
sort-object 距离密码过期天数 |
ConvertTo-Html |
Out-String
Send-Mailmessage -from $From –to $managermail -Bodyashtml $EmailbodyHTML -Subject "域控管理员通知-密码即将过期用户" -smtpserver $SMTPServer -port $SMTPPort -UseSsl -Credential $credentials -Encoding ([System.Text.Encoding]::UTF8)
$EmailbodyHTML=$expiredUsers|
sort-object 已过期用户信息 |
ConvertTo-Html |
Out-String
Send-Mailmessage -from $From –to $managermail -Bodyashtml $EmailbodyHTML -Subject "域控管理员通知-密码已经过期用户" -smtpserver $SMTPServer -port $SMTPPort -UseSsl -Credential $credentials -Encoding ([System.Text.Encoding]::UTF8)
$EmailbodyHTML=$soonToExpireUsers|
sort-object 未激活用户信息 |
ConvertTo-Html |
Out-String
Send-Mailmessage -from $From –to $managermail -Bodyashtml $EmailbodyHTML -Subject "域控管理员通知-账号未激活用户" -smtpserver $SMTPServer -port $SMTPPort -UseSsl -Credential $credentials -Encoding ([System.Text.Encoding]::UTF8)