Get-ADUser cmdlet 及其 AccountExpirationDate 属性是管理 Active Directory 中过期用户账户的基础。无论您是需要导出过期 AD 用户的 PowerShell 报告以满足合规要求,创建账户过期报告 PowerShell 脚本进行审计,还是生成过期账户的 CSV 文件以便清理操作,该 cmdlet 都提供了关键数据。然而,筛选过期用户、处理日期比较以及跨多个域执行 PowerShell 过期用户导出都需要谨慎编写脚本和正确操作日期。
PasswordNeverExpires 属性决定用户密码是否遵循域策略。将其设置为 False 可确保密码按照域策略过期。在某些特殊情况下,如服务账户、硬编码凭据或可能因密码更改而中断的旧版应用程序,您可能需要将 PasswordNeverExpires 设置为 True,使密码永不过期。
使用 PowerShell 获取账户过期用户报告的步骤:
$OutFile = 'C:\Scripts\AccountExpiredUsers.csv' # your output file
Get-ADUser -Filter * -Properties Name, Enabled, AccountExpirationDate, LastLogonDate | ? {($_.AccountExpirationDate -NE $NULL -AND $_.AccountExpirationDate -LT (Get-Date)) } | foreach {Add-Content -path $OutFile "$($_.Name),$($_.Enabled)"}
使用 ADManager Plus 查找过期的 AD 用户:
生成一个基本的 Get-ADUser 过期账户报告,显示所有过期用户。
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)} -Properties AccountExpirationDate | Select Name,SamAccountName,AccountExpirationDate | Export-CSV "C:\ExpiredAccounts.csv" -NoTypeInformation
此命令识别所有账户已过期的用户。
创建一个 PowerShell 脚本,列出最近过期的用户。
$30DaysAgo = (Get-Date).AddDays(-30)
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date) -and AccountExpirationDate -gt $30DaysAgo} -Properties AccountExpirationDate,Department | Export-CSV "C:\RecentlyExpired.csv" -NoTypeInformation
此账户过期报告 PowerShell 有助于识别最近过期的账户以便潜在重新激活。
创建一个主动的 PowerShell AccountExpirationDate 查询,用于即将过期的账户。
$NextWeek = (Get-Date).AddDays(7)
Get-ADUser -Filter {AccountExpirationDate -gt (Get-Date) -and AccountExpirationDate -lt $NextWeek} -Properties AccountExpirationDate,EmailAddress | Export-CSV "C:\ExpiringNext7Days.csv" -NoTypeInformation
这有助于通过识别即将过期的账户防止服务中断。
| 参数 | 描述 |
|---|---|
| -Filter | 对比 AccountExpirationDate 与当前或特定日期的必备条件 |
| -SearchBase | 指定搜索过期账户的 OU 或容器 |
| -SearchScope | 控制搜索过期用户时的搜索深度 |
| -Properties | 必须包含 AccountExpirationDate,因为默认不返回该属性 |
| -LDAPFilter | 启用复杂的 LDAP 查询以实现高级过期筛选 |
| -ResultPageSize | 管理大规模过期用户查询的分页 |
| -Credential | 提供访问过期用户信息的备用凭据 |
Get-ADUser -Filter {AccountExpirationDate -like "*" -and AccountExpirationDate -lt (Get-Date)}
Get-ADUser -Filter * -Properties AccountExpirationDate | Where {$_.AccountExpirationDate -ne $null -and $_.AccountExpirationDate -lt (Get-Date)}
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)} -Properties AccountExpirationDate |
Select Name,@{N='ExpirationDate';E={$_.AccountExpirationDate.ToString('yyyy-MM-dd')}} |
Export-CSV "C:\ExpiredUsers.csv" -NoTypeInformation
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)} # Correct
# Not: Get-ADUser -Filter "AccountExpirationDate -lt (Get-Date)" # Incorrect
AccountExpirationDate 和 PasswordExpiration 用途不同:
获取两个过期日期的方法:
Get-ADUser -Identity "username" -Properties AccountExpirationDate, PasswordLastSet, PasswordNeverExpires |
Select Name, AccountExpirationDate, @{N='PasswordExpiration';E={if($_.PasswordNeverExpires) {'Never'} else {$_.PasswordLastSet.AddDays(90)}}}
常见原因及解决方案:
明确筛选空值的方法
Get-ADUser -Filter * -Properties AccountExpirationDate |
Where-Object {$_.AccountExpirationDate -ne $null -and $_.AccountExpirationDate -lt (Get-Date)}
正确语法:
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)}
错误语法:
Get-ADUser -Filter "AccountExpirationDate -lt (Get-Date)"
当 Active Directory Users and Computers 显示“Never”时,AccountExpirationDate 实际上是空值:
查找无过期日期的用户:
Get-ADUser -Filter * -Properties AccountExpirationDate |
Where-Object {$_.AccountExpirationDate -eq $null} |
Select Name, SamAccountName, @{N='ExpirationStatus';E={'Never Expires'}}
为没有设置过期日期的用户设置过期日期:
Get-ADUser -Filter {AccountExpirationDate -notlike "*"} |
Set-ADUser -AccountExpirationDate (Get-Date).AddDays(90)
使用日期运算计算剩余天数:
Get-ADUser -Filter {AccountExpirationDate -like "*"} -Properties AccountExpirationDate |
Select Name, AccountExpirationDate, @{N='DaysUntilExpiration';E={
if($_.AccountExpirationDate -gt (Get-Date)) {
($_.AccountExpirationDate - (Get-Date)).Days
} else {
"Already Expired"
}
}} | Sort-Object DaysUntilExpiration
是的,您可以延长多个账户的过期日期。
将所有即将过期的账户延长 30 天:
$NextMonth = (Get-Date).AddDays(30)
Get-ADUser -Filter {AccountExpirationDate -lt $NextMonth -and AccountExpirationDate -gt (Get-Date)} -Properties AccountExpirationDate |
ForEach-Object {
Set-ADUser $_ -AccountExpirationDate $_.AccountExpirationDate.AddDays(30)
Write-Host "Extended $($_.Name) until $($_.AccountExpirationDate.AddDays(30))"
}