查找“ pwdLastSet”和当前日期/时间之间的差异

时间:2019-08-29 14:43:35

标签: powershell active-directory

使用PowerShell我得到了Active Directory中所有操作系统的总数。我拥有所有Windows 10操作系统的数量,现在我需要数量超过90天或更早密码的计算机。

我已经使用“ Get-Date”在命令之外尝试了脚本,但是如果可能的话,我需要将其合并到单个命令中。

Get-ADComputer -SearchBase "OU=Computers,DC=DomainName,DC=com" -Filter {OperatingSystem -Like "Windows 10*"} -Property , OperatingSystem, pwdLastSet, |
    select OperatingSystem, @{Name="pwdLastSet";Expression={([DateTime]::FromFileTime($_.pwdLastSet))}}

数量:操作系统数量

“超过90天”:?

2 个答案:

答案 0 :(得分:3)

属性PwdLastSet返回AD属性pwdLastSet的文字值,其中包含编码为filetime的时间戳。您可以自己通过DateTime将该值解码为[DateTime]::FromFileTime()值。但是,PowerShell已经为您完成了此操作,并将解码后的值存储在属性PasswordLastSet中,请改用它。

要获取计算机的密码年龄,您需要计算当前日期与PasswordLastSet之间的差值,然后获取重新开始的Days对象的Timespan属性的值。将其放在计算出的属性中,然后可以筛选密码使用期限大于90天的计算机。

$ou    = 'OU=Computers,DC=DomainName,DC=com'
$fltr  = 'OperatingSystem -like "Windows 10*"'
$props = 'OperatingSystem', 'PasswordLastSet'

$cutoff = (Get-Date).Date.AddDays(-90)

$hosts = Get-ADComputer -SearchBase $ou -Filter $fltr -Property $props |
         Select-Object OperatingSystem,
             @{n='PasswordAge';e={((Get-Date) - $_.PasswordLastSet).Days}}

($hosts | Where-Object { $_.PasswordAge -gt 90 }).Count

答案 1 :(得分:1)

如果我们根据您拥有的资源进行构建,则可以执行以下操作:

Get-ADComputer -SearchBase "OU=Computers,DC=DomainName,DC=com" -Filter {OperatingSystem -Like "Windows 10*"} -Property , OperatingSystem, pwdLastSet, | Select-Object OperatingSystem, @{Name="pwdLastSet";Expression={[datetime]::FromFileTime($_.pwdLastSet)}},@{Name="90_Days_Old";Expression={([datetime]::FromFileTime($_.pwdLastSet)).AddDays(90) -le (Get-Date)}}

说明:

如果密码为90天或更早,则Select-Object计算的属性90_Days_Old将输出True。否则,将输出False。 此处的关键是使用DateTime对象中的.AddDays()方法。您可以选择在PwdLastSet.AddDays(90))值中添加90天,或从当前日期和时间(.AddDays(-90))中减去90天。


由于以下原因,这不是解决此问题的最佳方法:

  • 您应该将可重复使用的值存储在变量中。这样可以提高代码整洁度并减少冗余代码执行。
  • PwdLastSet可能不是最佳属性,因为它以文件时间格式输出。 PasswordLastSet以易于理解的格式显示日期。