如何获取Active Directory中账户的实际过期日期?
解决Active Directory过期账户日期显示多一天的问题
问题原因
Active Directory存储账户过期日期时,会将设置的过期日期次日00:00:00作为实际过期时间点。比如你设置用户11月15日过期,AD实际存储的是11月16日00:00,这意味着用户在15日当天仍可正常登录,次日才会被限制登录。这就是PowerShell查询返回的日期比实际设置多一天的核心原因。
修正后的PowerShell代码
方式一:显示实际过期日期并准确过滤已过期账户
Get-ADUser -Filter * -Properties AccountExpirationDate | Where-Object { $_.AccountExpirationDate -ne $null -and $_.Enabled -eq $True -and # 转换为实际过期日期后,判断是否早于当前日期 $_.AccountExpirationDate.AddDays(-1).Date -lt (Get-Date).Date } | Select-Object Name, SamAccountName, # 新增计算属性,返回实际设置的过期日期(去掉时间部分) @{Name='ActualExpirationDate'; Expression={$_.AccountExpirationDate.AddDays(-1).Date}} | Sort-Object -Property ActualExpirationDate -Descending
方式二:优化查询效率(服务器端过滤)
将部分过滤逻辑放在Get-ADUser的Filter参数中,减少本地处理的数据量,提升查询速度:
Get-ADUser -Filter {Enabled -eq $True -and AccountExpirationDate -ne $null} -Properties AccountExpirationDate | Where-Object { $_.AccountExpirationDate.AddDays(-1).Date -lt (Get-Date).Date } | Select-Object Name, SamAccountName, @{Name='ActualExpirationDate'; Expression={$_.AccountExpirationDate.AddDays(-1).Date}} | Sort-Object -Property ActualExpirationDate -Descending
关键说明
- 使用
AddDays(-1)将AD存储的时间转换为实际设置的过期日期,.Date用于去除时间部分,确保日期对比的准确性。 - 过滤时必须用转换后的实际日期与当前日期的日期部分对比,避免因当前时间(比如下午)与AD存储的次日零点时间对比导致的误判。
内容的提问来源于stack exchange,提问作者ak2595
相关产品推荐
相关产品推荐

