BLOG zzy.my

合抱之木, 生于毫末; 九层之台, 起于累土; 千里之行, 始于足下。

PowerShell 检测域用户密码过期时间

环境 AD 域服务器 Windows 2012 R2,Exchange

首先定制脚本,本脚本是参考网上一些资料然后进行改良的,3000用户的域执行约1分钟。

参考文章 http://lixiaosong.blog.51cto.com/705126/1409113/
这篇文章中的脚本如果直接放域里执行肯定会有问题,还有就是它的效率很低。
因为它在循环语句中多次执行 Get-ADUser,每执行一次必消耗额定时间。
如果企业中有3000用户,运行一次要执行12000次Get-ADUser。
我这边测试,在不执行发送邮件命令下,等待执行约半个多小时,并且还有大量报错
错误大致分为部分用户 pwdlastset 为空等两类错误

改版:
排除没必要通知的用户
直接读取用户的密码过期时间
Get-ADUser 全脚本仅执行一次并筛选好
循环中仅作判断及发送邮件

Import-Module Activedirectory
#指定域中指定OU下的用户
#排除已禁用、密码永不过期、显示名为空、无邮箱、帐户不能修改密码的帐户
#排除已经过期的用户(因为已经不能登录了,发邮件通知毫无意义)
$allUsers = Get-ADUser -SearchBase "OU=AllUsers,DC=zzy,DC=my" -Filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties DisplayName,PasswordExpired,mail,CannotChangePassword,"msDS-UserPasswordExpiryTimeComputed" | Where-Object {$_.DisplayName -ne $null -and $_.PasswordExpired -eq $False -and $_.CannotChangePassword -eq $False -and $_.mail -ne $null} 
$passExpiresUsersList = @()
$nowTime = Get-Date

foreach ($user in $allUsers){
$ExpiryDate = [datetime]::FromFileTime($user."msDS-UserPasswordExpiryTimeComputed")
$expire_days = ($ExpiryDate - $nowTime).Days

#密码在3天内即将过期的帐户(小于4即3天)
if($expire_days -lt 4 -and $expire_days -gt -1 ){
$displayname= $user.Displayname
#定制邮件内容
$email=
"Deer $displayname :

你的密码即将在 $expire_days 天后过期,请尽快更改。"

#发送邮件
Send-MailMessage -From "no-reply@zzy.my" -To $user.mail -Subject "你的密码即将过期" -Body $email -SmtpServer exchange01.zzy.my -Encoding ([System.Text.Encoding]::UTF8)

#记录该账户信息
$userobject=New-object psobject
$userobject | Add-Member -membertype noteproperty -Name 用户名 -value $user.SamAccountName
$userobject | Add-Member -membertype noteproperty -Name 邮箱 -Value $user.mail
$userobject | Add-Member -membertype noteproperty -Name 密码过期时间 -Value $ExpiryDate
$userobject | Add-Member -membertype noteproperty -Name 剩余密码过期天数 -Value $expire_days
$passExpiresUsersList+=$userobject
}
}
#发送给指定管理帐户
$EmailbodyHTML = $passExpiresUsersList | sort-object 剩余密码过期天数 | ConvertTo-Html | Out-String
Send-Mailmessage -From  "no-reply@zzy.my" –To “zzy@zzy.my” -BodyAsHtml $EmailbodyHTML -Subject "管理员通知" -SmtpServer exchange01.zzy.my -Encoding ([System.Text.Encoding]::UTF8)

 

将脚本拷贝到AD上(一般只要是域内的机器都可以)

默认服务器的脚本执行策略都是允许的,如果不允许可执行可 Set-ExecutionPolicy RemoteSigned

然后通过计划任务定期执行,但可能需要修改执行策略

开始 - 运行 - gpedit.msc - 电脑配置 - Windows设置 - 安全设置 - 本地策略 - 安装选项

找到 网络访问: 不允许存储网络身份验证的密码和凭据 设置为 已禁用.

 

然后在用户权限分配中找到 作为批处理作业登录 添加相应帐户

.

完成后开始创建计划任务

创建基本任务 选择每天执行 操作选择 启动程序

程序或脚本填写: %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe

添加参数填写: C:\PassNotice\PasswordExpired.ps1 (脚本的路径)

点击 "完成" 时打开属性对话框

在 "常规" 标签页中勾选 不管用户是否登录都要运行

完成.

 

评论 (2) -

  • heyc

    2022-05-02 11:01:34 | 回复

    测试了脚本,为啥只发送给管理员,怎么设置其他用户能收到邮件?

    • zzy

      2024-01-24 21:29:53 | 回复

      自己可以动手改

Loading