当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] AD用户密码即将过期时的密码修改通知

作者:精品下载站 日期:2024-12-14 22:54:59 浏览:13 分类:玩电脑

AD用户密码即将过期时的密码修改通知


在本文中,我们将展示如何使用 PowerShell 查找 Active Directory 用户帐户的密码何时过期,如何将密码设置为永不过期(

PasswordNeverExpires = True

),并提前通知用户修改密码。

如果域中的用户密码过期,该帐户不会被锁定,但无法使用该帐户访问域资源,直到用户将过期密码更改为新密码。最常见的是,远程用户会遇到密码过期的问题,因为他们无法使用标准工具更改密码。

AD 域密码策略中设置了域中的用户密码到期时间限制、必须更改的频率(密码最长期限)和复杂性要求。这些参数在默认域策略或细粒度密码策略中设置。

您可以使用以下 PowerShell 命令获取域中当前的密码过期策略设置:

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

在我们的示例中,域中用户密码的最长期限为 60 天。

[玩转系统] AD用户密码即将过期时的密码修改通知

如何获取 Active Directory 中的用户密码到期日期?

您可以使用 Net user 命令在命令提示符中查看密码期限和上次更改密码的日期:

net user jsmith /domain

[玩转系统] AD用户密码即将过期时的密码修改通知

您可以在以下几行中找到您需要的信息:

  • 最后设置的密码 — 9/9/2020 9:23:59 AM

  • 密码过期 - 2021 年 1 月 7 日上午 9:23:59

  • 密码可更改 — 9/10/2020 9:23:59 AM

您可以获取任何用户的密码到期日期。为此,您不需要具有用户帐户的 AD 容器的管理员权限或委派权限。

要查看 AD 帐户的设置,我们将使用特殊的 PowerShell for Active Directory 模块,该模块允许您获取不同 AD 对象属性的值(请参阅如何在 Windows 10 和 Windows Server 2012 R2/2016 中安装和导入 AD PowerShell 模块)。

使用 Get-ADUser cmdlet,您可以查看上次更改用户密码的日期并检查是否设置了 PasswordNeverExpires 选项:

get-aduser jsmith -properties PasswordLastSet, PasswordNeverExpires, PasswordExpired |ft Name, PasswordLastSet, PasswordNeverExpires,PasswordExpired

[玩转系统] AD用户密码即将过期时的密码修改通知

  • PasswordLastSet 是最后一次更改密码的日期和时间;

  • 如果用户密码永不过期,PasswordNeverExpires 返回True

  • PasswordExpired - 如果用户密码已过期,则返回True,如果密码未过期,则返回False

您可以在图形 MMC 管理单元 Active Directory 用户和计算机 (

dsa.msc

)。为此,请打开用户属性,转到“属性编辑器”选项卡并检查 pwdLastSet 属性的值。

但正如您所看到的,MMC 管理单元仅显示密码更改的时间。目前尚不清楚密码何时到期。

[玩转系统] AD用户密码即将过期时的密码修改通知

要获取密码到期日期而不是上次更改时间,请使用特殊构造的 AD 属性:msDS-UserPasswordExpiryTimeCompulated。 msDS-UserPasswordExpiryTimeCompulated 值是根据上次密码更改的日期和域密码策略自动计算的。

UserPasswordExpiryTimeCompulated 参数返回时间戳格式的日期,因此我使用

FromFileTime

函数将其转换为人类可读的值:

Get-ADUser -Identity jsmith -Properties msDS-UserPasswordExpiryTimeComputed | select-object @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") }}

这样,我们就得到了用户密码的过期日期。

[玩转系统] AD用户密码即将过期时的密码修改通知

如果 msDS-UserPasswordExpiryTimeCompulated 的值为 0,则表示 pwdLastSet 为空 (null) 或等于 0(密码从未更改过)。

要从 AD 中的特定容器 (OU) 获取所有用户的密码到期日期,您可以使用以下 PowerShell 脚本:

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=a-d,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
$Users | select Name, @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime ($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordLastSet

它会生成一个表格,其中包含活动用户列表、到期日期和上次密码更改的时间。

[玩转系统] AD用户密码即将过期时的密码修改通知

您只能显示密码过期的用户列表:

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=a-d,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
foreach($user in $Users){
if( [datetime]::FromFileTime($user."msDS-UserPasswordExpiryTimeComputed") -lt (Get-Date)) {
$user.Name
}
}

如何设置AD用户密码永不过期?

如果要为帐户设置永久密码,请检查 AD 中用户属性中的密码永不过期选项(它是 UserAccoutControl 属性的位值之一)。

[玩转系统] AD用户密码即将过期时的密码修改通知

或者您可以通过设置用户属性使用 PowerShell 启用此选项:

Get-ADUser jsmith | Set-ADUser -PasswordNeverExpires:$True

您可以为文本文件中的列表中的多个用户一次设置“密码永不过期”选项:

$users=Get-Content "C:\PS\users_password_never_expire.txt"
Foreach ($user in $users) {
Set-ADUser $user -PasswordNeverExpires:$True
}

您可以显示禁用常规密码更改选项的所有用户的列表:

Get-ADUser -filter * -properties Name, PasswordNeverExpires | where {$_.passwordNeverExpires -eq "true" } |  Select-Object DistinguishedName,Name,Enabled |ft

Active Directory 密码过期通知策略

Windows 有一个特殊的组策略参数,可以通知用户必须更改密码。

该策略称为交互式登录:提示用户在过期前更改密码,位于 GPO 部分下:计算机配置 -> 策略 -> Windows 设置 -> 安全设置 -> 本地策略 -> 安全选项。

默认情况下,该策略在本地 Windows 设置上启用,并且通知会在密码过期前 5 天开始显示。您可以更改用户看到密码更改通知的天数。

[玩转系统] AD用户密码即将过期时的密码修改通知

启用此策略后,如果用户的密码过期,则每次用户登录时托盘中都会出现更改密码的通知。

Consider changing your password
Your password will expire in xx days.

[玩转系统] AD用户密码即将过期时的密码修改通知

您还可以使用一个简单的 PowerShell 脚本,该脚本会自动显示一个对话框窗口,并提示您更改密码(如果密码在 5 天内过期):

Add-Type -AssemblyName PresentationFramework
$curruser= Get-ADUser -Identity $env:username -Properties 'msDS-UserPasswordExpiryTimeComputed','PasswordNeverExpires'
if ( -not $curruser.'PasswordNeverExpires') {
$timediff=(new-timespan -start (get-date) -end ([datetime]::FromFileTime($curruser."msDS-UserPasswordExpiryTimeComputed"))).Days
if ($timediff -lt 5) {
$msgBoxInput = [System.Windows.MessageBox]::Show("Your password expires in "+ $timediff + " days!`nDo you want to change it now?","Important!","YesNo","Warning")
switch ($msgBoxInput) {
'Yes' {
cmd /c "explorer shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}"
}
'No' { }
}
}
}

如果用户单击“是”,则会出现一个 Windows 安全窗口,您可以在按

Ctrl+Alt+Del

或者

Ctrl+Alt+End

(如果是 RDP/RDS 连接)。

[玩转系统] AD用户密码即将过期时的密码修改通知

该脚本意味着 PowerShell for AD 模块已安装在用户的计算机上。即使未安装 RSAT 也可以使用。查看文章“在不安装RSAT的情况下使用AD模块”。

启用 PS 脚本自动启动或将其作为 GPO 登录脚本运行。

通过 Powershell 发送密码过期电子邮件通知

如果您想通过电子邮件通知用户密码到期,可以使用以下 PowerShell 脚本:

$Sender = "[email protected]"
$Subject = 'Important! Your password expires soon!'
$BodyTxt1 = 'Your password for'
$BodyTxt2 = 'expires in '
$BodyTxt3 = 'days. Remember to change your password in advance. If you have other questions, contact the HelpDesk.'
$smtpserver ="smtp.a-d.site"
$warnDays = (get-date).adddays(7)
$2Day = get-date
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=a-d,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, EmailAddress, Name | select Name, @{Name ="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, EmailAddress
foreach ($user in $users) {
if (($user.ExpirationDate -lt $warnDays) -and ($2Day -lt $user.ExpirationDate) ) {
$lastdays = ( $user.ExpirationDate -$2Day).days
$EmailBody = $BodyTxt1, $user.name, $BodyTxt2, $lastdays, $BodyTxt3 -join ' '
Send-MailMessage -To $user.EmailAddress -From $Sender -SmtpServer $smtpserver -Subject $Subject -Body $EmailBody
}
}

该脚本检查密码即将过期的所有活动域用户。在密码过期前 7 天,用户开始收到发送到 AD 中指定地址的电子邮件。电子邮件将一直发送,直至密码更改或过期。

管理员可以使用 Set-ADAccountPassword cmdlet 强制更改用户密码。

在域中的任何计算机/服务器上定期运行此 PowerShell 脚本(使用任务计划程序更容易执行)。当然,您必须将发送电子邮件的主机的 IP 地址添加到 SMTP 服务器上允许的发件人列表(无需身份验证即可发送电子邮件)。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯