【问题标题】:Finding the difference between "pwdLastSet" and current date/time查找“pwdLastSet”和当前日期/时间之间的差异
【发布时间】:2019-08-29 14:43:35
【问题描述】:

使用 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 天”:?

【问题讨论】:

  • 我有点不确定你想要什么。您目前遇到哪些具体问题/错误?你的意思是你想要一个单独的函数来执行操作?
  • 如果可能,我想避免使用单独的函数。我的问题是我是 PowerShell 新手,不知道如何为此寻找解决方案。有没有办法创建一个新列,其中包含从密码上次设置到今天日期的天数。我可以使用公式“=DATEDIF(start_date,end_date,"d")”在 excel 中执行此操作,但我正在尝试自动化此过程。
  • @zatch - 你的问题的一部分是“哦,所以利特!”编码。 [sigh ...] 不要仅仅因为“它是如此leet!!!!!”而将所有内容都强加为单行。将您的管道分解为标准循环中的步骤。然后根据需要添加所需的额外列,最后将它们输出到 CSV 文件或使用 ImportExcel 模块将它们直接发送到 excel。 ///// 如果您需要在管道中添加一些东西[通常是为了节省 RAM]。然后,您可以轻松地将易于调试的代码转换为管道。 [咧嘴]
  • 使用 (get-date) 和 .AddDays() 方法为您的搜索添加过滤器

标签: powershell active-directory


【解决方案1】:

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

要获取计算机的密码年龄,您需要计算当前日期与PasswordLastSet 之间的差值,然后获取返回的Timespan 对象的Days 属性值。将其放入计算属性中,您可以过滤密码使用期限 > 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

【讨论】:

  • 也许我读错了问题,但我认为 OP 想要总机器数 90 天以上的数字 - 他只会让后者这样做。
  • 这是我目前的输出示例。只需要一个额外的列来输出天数。在这种情况下,它是 (7),因为最后一次设置密码是 7 天前。操作系统 pwdLastSet --------------- ---------- Windows 10 Pro 8/22/2019 11:07:16 AM
  • @zatch 相应调整答案。
【解决方案2】:

如果我们建立在您现有的基础上,那么您可以执行以下操作:

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() 方法。您可以选择将 90 天添加到 PwdLastSet (.AddDays(90)) 值或从当前日期和时间减去 90 天 (.AddDays(-90))。


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

  • 您应该将可重用的值存储在变量中。这促进了更整洁的代码并减少了冗余代码执行。
  • PwdLastSet 可能不是要检查的最佳属性,因为它以文件时间格式输出。 PasswordLastSet 以人类可读的格式显示日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多