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)
posted @ 2024-08-06 14:01  二乘八是十六  阅读(108)  评论(0编辑  收藏  举报