首页 > 系统相关 >windows AD域控密码过期邮件通知迭代版本

windows AD域控密码过期邮件通知迭代版本

时间:2024-08-06 14:06:35浏览次数:14  
标签:userobject AD 密码 windows Member 过期 noteproperty 域控 Name

利用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 ="[email protected]"
# 定义发送SMTP服务器
$SMTPServer ="smtp.qq.com"
# 定义SMTP端口,如果出现证书错误,可考虑使用25端口
$SMTPPort ="587"
# 定义发送邮件的通知邮箱
$Username = "[email protected]"
# 定义通知邮箱的密码
$Password = "password"
# 邮箱账号密码加密
$SecurePassword = ConvertTo-SecureString $Password -AsPlainText -Force
$Credentials = New-Object System.Management.Automation.PSCredential($UserName, $SecurePassword)
# 设置推送至域管理员的邮箱
$managermail = "[email protected]"
#################################################
# 检测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)

标签:userobject,AD,密码,windows,Member,过期,noteproperty,域控,Name
From: https://www.cnblogs.com/amsilence/p/18345005

相关文章

  • 解决torchaudio.load报错 (Couldn't find appropriate backend to handle uri )
    解决torchaudio.load报错(Couldn'tfindappropriatebackendtohandleuri)问题描述(报错信息):问题:Traceback(mostrecentcalllast): File"resample.py",line43,in<module>  resample_use_cuda() File"resample.py",line24,inres......
  • 拒绝自动更新,拥有一个安静的windows
    拒绝自动更新,拥有一个安静的windows前言一、启动组策略编辑器二、定位"windows更新"项目组三、禁用“配置自动更新”和“启用通过自动更新建议的更新”两个重要配置项三、其他的一些配置项四、总结前言补丁大王微软时不时的发布各种补丁程序,用户不胜其烦,总是提示你......
  • miariadb比postgre好用
    1.内存表引擎速度最快,比postgresql中的unlogged要快。postgresql内存表好像需要插件实现,原生安装不带。2.Mariadb中的Innor引擎插入和更新都要快一点。3.Mariadb中的innor选择行压缩功能,经测试能把1.5M的内容减少到700K,大约为一半。postgresql的压缩表功能好像也需要另外安装......
  • ADFS配置“声明提供方信任”时,读取url报错
    声明提供方信任,通过Haproxy2.8.5提供https服务,metadata通过url可以正常打开页面ADFS在配置“声明提供方信任”时,通过URL访问声明提供方的联合元数据,提示“SSL连接通道已关闭”或“基础连接已关闭”,查看haproxy日志发现保存日志““SSLhandshakefailure(error:14209102:SSLro......
  • 简单的mysqldump备份(windows)
    备份小数据库用mysql自带的mysqldump就可以完成备份,写一个简单的适用于windows下跑的脚本。策略每天凌晨1点全备,保留7天备份脚本dbbak.batsetday=%date:~0,4%%date:~5,2%%date:~8,2%setlocalip=xxx.xxx.xxx.xxxsetbackup_path=D:\dbbak\%localip%setbackup_dir=D:\dbb......
  • Android 广播 Broadcast Receiver
    广播(Broadcast)是Android中的一种机制,允许应用程序之间传递消息。广播在Android中扮演着重要角色,能够在不同的组件间传递信息,无论是应用内部还是跨应用。下面我将详细解释广播的机制,并提供几个示例,按照难度逐步增加。广播机制详细解释1.广播的基本概念广播允许应用程序在系统中......
  • (已解决)QT4 自定义信号函数调用报错 error: C2248: “Boss::DeadSignal”: 无法访问 pr
     (解决方法见文章末尾)报错语句如下 DeadSignal是自定义槽函数,是放在public下的,不知道为什么报错说是protected,不知道是不是版本问题Boss类和DeadSignal定义如下 mboss是在自定义类Widget中调用的Boss对象 调用位置是Widget的自定义槽函数 解决方法在Boss中定......
  • 安卓编译器gradle安装和idea配置gradle
    参考:gradle安装:https://www.cnblogs.com/darcy-hui/p/12206852.htmlgradleuserhome说明:https://blog.csdn.net/LG_15011399296/article/details/134333647gradle下载地址:https://gradle.org/releases/gradle阿里下载地址:https://mirrors.aliyun.com/gradle/gradle1.下载zip包,解......
  • Windows bat批处理 新建一个日期时间文件夹 变日期和时间两个文件夹
    前言全局说明Windowsbat批处理新建一个日期时间文件夹变日期和时间两个文件夹一、说明环境:Windows11家庭版23H222631.3737二、错误的结果文件名:time_dir_Y-M-D_H-M_err.bat@echooff::获取当前日期,格式:20190909SETyear=%date:~0,4%SETmonth=%date:~5,......
  • Windows11系统PeoplePane.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个PeoplePane.dll文件(挑选合适的版本文件)把......