如何使用 PowerShell 获取 AD 用户账户过期日期

Get-ADUser cmdlet 及其 AccountExpirationDate 属性是管理 Active Directory 中过期用户账户的基础。无论您是需要导出过期 AD 用户的 PowerShell 报告以满足合规要求,创建账户过期报告 PowerShell 脚本进行审计,还是生成过期账户的 CSV 文件以便清理操作,该 cmdlet 都提供了关键数据。然而,筛选过期用户、处理日期比较以及跨多个域执行 PowerShell 过期用户导出都需要谨慎编写脚本和正确操作日期。

配置 AD 用户的密码过期

PasswordNeverExpires 属性决定用户密码是否遵循域策略。将其设置为 False 可确保密码按照域策略过期。在某些特殊情况下,如服务账户、硬编码凭据或可能因密码更改而中断的旧版应用程序,您可能需要将 PasswordNeverExpires 设置为 True,使密码永不过期。

PowerShell

使用 PowerShell 获取账户过期用户报告的步骤:

  1. 确定要从中检索报告的域。
  2. 确定需要获取报告的 LDAP 属性。
  3. 确定用于检索报告的主 DC。
  4. 编写脚本。
  5. 脚本应包含函数,通过条件识别账户过期日期,例如账户的 Expiration Date LDAP 值不等于 NullAccount Expiration Date LDAP less 等于或早于当前日期。
  6. 在 Windows PowerShell 中执行脚本。
  7. 若要以不同格式获取报告,请根据用户需求修改脚本。
$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

使用 ADManager Plus 查找过期的 AD 用户:

  1. 导航至 Reports 标签 > User Reports > Account expired users
  2. 选择所需的域和 OU。点击 Generate
  3. 报告生成后,点击导出为,下载为 HTML、CSV、XLS 或 PDF 格式。

示例用例和脚本

示例 1:导出所有当前过期的用户账户

生成一个基本的 Get-ADUser 过期账户报告,显示所有过期用户。

Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)} -Properties AccountExpirationDate | Select Name,SamAccountName,AccountExpirationDate | Export-CSV "C:\ExpiredAccounts.csv" -NoTypeInformation

此命令识别所有账户已过期的用户。

示例 2:查找过去 30 天内过期的账户

创建一个 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 有助于识别最近过期的账户以便潜在重新激活。

示例 3:查找未来 7 天内即将过期的账户

创建一个主动的 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 提供访问过期用户信息的备用凭据

解决常见的过期账户导出问题

错误:筛选过期账户时未返回结果。

  • 原因:AccountExpirationDate 对于无过期的用户为空。
  • 解决方案: 明确过滤空值:
Get-ADUser -Filter {AccountExpirationDate -like "*" -and AccountExpirationDate -lt (Get-Date)}

错误:日期比较不正确。

  • 原因:AccountExpirationDate 格式问题或时区问题。
  • 解决方案: 使用正确的 DateTime 比较:
Get-ADUser -Filter * -Properties AccountExpirationDate | Where {$_.AccountExpirationDate -ne $null -and $_.AccountExpirationDate -lt (Get-Date)}

错误:导出显示的日期和时间格式异常。

  • 原因: Export-CSV 的默认日期时间格式。
  • 解决方案: 导出前格式化日期:
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

错误:找不到位置参数。

  • 原因: AccountExpirationDate 的筛选语法不正确。
  • 解决方案: 使用正确的筛选块语法:
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)} # Correct
# Not: Get-ADUser -Filter "AccountExpirationDate -lt (Get-Date)" # Incorrect

过期账户报告的最佳实践

  • 包含缓冲期: 检查在特定时间范围内过期的账户以便更好管理。
  • 定期调度: 每周或每月运行过期账户报告以便及时清理。
  • 包含元数据: 添加 LastLogonDate 和 WhenChanged 以做出明智决策。
  • 按账户类型分开: 分别筛选服务账户、用户账户和管理员账户。

使用 PowerShell 生成过期账户报告的限制

  • 手动日期计算: 计算用户账户过期天数需要额外的脚本和日期运算。
  • 无视觉指示: 无法创建显示过期趋势的可视化仪表盘,除非使用额外工具。
  • 复杂的调度设置: 自动报告需要复杂的配置和维护。
  • 通知选项有限: 无内置提醒功能来通知即将或最近的过期。
  • 性能问题: 对大量过期 AD 账户的查询,PowerShell 可能因未优化而超时。
  • 无审批工作流: 无法集成账户延期或删除的审批流程。
  • 格式限制: 过期 AD 用户 PowerShell 报告导出仅限基本 CSV,无法格式化。
  • 无历史跟踪: 无法在没有自定义日志的情况下跟踪过期历史或模式。

使用 ADManager Plus 生成过期账户报告的亮点

  • 自动过期监控: 实时跟踪过期账户,无需复杂的 PowerShell 脚本。
  • 批量账户管理: 轻松处理多个过期用户账户的批量管理操作。
  • 合规报告: 内置 SOX、HIPAA、PCI DSS 及其他合规性报告。
  • 历史审计追踪: 跟踪所有对过期账户的操作以确保问责。
  • 集成能力: 与工单系统连接,实现自动化过期工作流。
  • 导出灵活性: 报告可导出为 PDF、CSV、HTML 和 XLS 等多种格式。

使用 ADManager Plus 生成并导出过期用户账户报告

常见问题解答

AccountExpirationDate 和 PasswordExpiration 用途不同:

  • 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))"
}
Active Directory管理与报告的一站式解决方案
电子邮件下载链接 Email the ADManager Plus download link