1.先用powershell实现功能

脚本如下:


#定义发件人邮件地址
$From = "xxxx@xxxx.com"
#定义接收过期用户列表信息的管理人员邮箱
$toIT="xxxx@xxxx.com"
#定义smtp服务器、端口及账号密码
$smtpServer = "smtp.xxxx.com"
$smtpPort = 25
$username = "xxxx@xxxx.com"
$password = "xxxxxx"
#定义邮件发送方法
$SMTPClient = New-Object Net.Mail.SmtpClient($smtpServer, $SmtpPort)
$SMTPClient.EnableSsl = $false
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $password)

#获取所有状态为enable的用户列表
$alladuser=get-aduser -searchbase "DC=XXXXX,DC=com" -LDAPFilter '(!userAccountControl:1.2.840.113556.1.4.803:=2)' | %{$_.Samaccountname}
$userlist = @()
#检测AD密码过期时间并邮件通知相应账户
foreach ($user in $alladuser){
#密码最后一次更改时间
$pwdlastset=Get-ADUser $user -Properties * | %{$_.passwordlastset}
#密码的过期时间
$pwdlastday=($pwdlastset).adddays(180)
#当前时间
$now=get-date
#判断账户是否设置了永不过期
$neverexpire=get-aduser $user -Properties * |%{$_.PasswordNeverExpires}
#距离密码过期的时间
$expire_days=($pwdlastday - $now).Days
#判断过期时间天小于15天的并且没有设置密码永不过期的账户
if($expire_days -lt 15 -and $neverexpire -like "false" ){
if($user -notlike " "){
$chineseusername= Get-ADUser $user -Properties * | %{$_.Displayname}
#邮件正文
$Emailbody=
"亲爱的 $chineseusername 同学 :
您的Windows账户密码即将在 $expire_days 天后过期, 密码过期之后您将无法登陆xxxxxxxx等系统,请您尽快更改。
Windows用户更改方式:
按住Ctrl+Alt+Delete,选择更改密码即可;密码更改要求详见下方原则;
Linux用户更改方式:
访问 https://xxxxxxxxxxxxxx.com, 此处需要注意,用户名填写时请在前面加上公司域名(xxxxx\):
例如:张三
用户名:xxxxx\zhangsan
重置密码过程请遵循以下原则:
○密码长度最少 6 位;
○密码可使用最长时间 180天,过期需要更改密码;
○密码符合复杂性需求(大写字母、小写字母、数字和符号四种中必须有三种、且密码口令中不得包括全部或部分用户名)
如有问题,请及时联系IT,信息如下:

"#此处直接获取AD邮件地址信息,也可直接用username拼接
$tousers=Get-ADUser $user -Properties * | %{$_.mail}
$Subject="Windows密码即将过期,请及时修改"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($From, $tousers, $Subject, $Emailbody)
$SMTPClient.Send($SMTPMessage) #查找即将过期的用户信息并发送至管理员账户
$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 $pwdlastday
$userobject | Add-Member -membertype noteproperty -Name 距离密码过期天数 -Value $expire_days
$userlist+=$userobject
}
}
}
#格式化过期账号信息列表
$Emailbody=$userlist| sort-object 距离密码过期天数 | ConvertTo-Html -Fragment | Out-String
#发送信息列表通知管理员
$SMTPMessage = New-Object System.Net.Mail.MailMessage($From, $toit, "管理员通知", $Emailbody)
$SMTPMessage.IsBodyHtml = $true
$SMTPClient.Send($SMTPMessage)


2.Windows Tasks实现每天定时自动执行

PS文件无法作为脚本直接放在task执行,所以需要新建bat脚本,执行ps文件,然后在task中定时执行bat脚本;

powershell "D:\ADUserExpireNotification\ADUserExpireNotification.ps1"

注意:此脚本需要运行在AD上,普通window客户端系统powershell没有自带AD相关模块的命令