我继承了一个包含数百个长期未激活的计算机帐户的 AD 环境。我想开始清除它们。如果我使用该dsquery computer -inactive
命令,它似乎会忽略这些计算机,并且只返回最近几个月/几周处于活动状态但在给定时间段内不活动的计算机。
例如,如果我运行,dsquery computer -inactive 4
我会得到一台计算机。如果我运行,dsquery computer -inactive 3
我会得到大约五台计算机。如果我运行,dsquery computer -inactive 1
我会得到一个大列表。这些列表中没有一个显示非常旧的计算机帐户。
我是否误解了该命令的作用?
答案1
dsquery computer -inactive x
使用 LastLogonTimeStamp 属性来决定计算机是否处于非活动状态。LastLogonTimeStamp 的两个特性如下:
1)这是非常松散,即远非实时。此属性不会在每次计算机登录域时更新,即使更新,也不会立即复制到其他域控制器。
2) 它可以为空,在这种情况下,dsquery 很可能会忽略它。
此-stalepwd
开关还可以帮助您识别不活动的计算机帐户。计算机帐户应该每 30 天自动更新密码。但请注意,它使用 pwdLastSet LDAP 属性,该属性也可以为空。pwdLastSet 是一个烦人的文件时间,但 .Net/Powershell 可轻松将其转换为人性化的日期:
PS C:\Users\ryan> Get-ADComputer -Filter * -Properties PasswordLastSet,LastLogonTimeStamp | ? { $_.PasswordLastSet -LT $(Get-Date).AddDays(-180) } | Select Name,PasswordLastSet,LastLogonTimeStamp | Sort-Object PasswordLastSet -Descending
上面的 Powershell 行将为您提供所有 pwdLastSet 属性(Powershell 将其转换为人类可读的 PasswordLastSet)超过 180 天的计算机帐户,最新的帐户将位于顶部。最旧的帐户和 pwdLastSets 为空的帐户将位于底部。
(当然,您可以在计算机上禁用密码更改,但这种做法相对较少见。)
这些帐户具有空值,通常意味着他们从未登录过域和/或从未更改过密码。我确信可能还有其他一些奇怪的用例也会出现这种情况,例如管理员预置计算机帐户但随后决定永远不将计算机加入域、来自同一林的其他子域的计算机帐户等。您只需调查这些情况即可。
如果您想阅读,这里有一些来自 AskDS 的有关 LastLogonTimeStamp 的更多信息:
答案2
首先,计算机默认每 30 天更改一次密码,尽管这是可以更改的。寻找任何少于 30 天不活动的计算机都是自找麻烦,不要忘记 VPN 用户或其他人,他们可能每 6-12 个月才在办公室连接到域一次。
也就是说,您可能需要指定计算机所在的 ou,或者 forestroot 或 domainroot:
dsquery computer forestroot -inactive 4
dsquery computer domainroot -inactive 4
dsquery computer ou=Foo,dc=bar,dc=baz,dc=com -inactive 4
我个人偏爱免费的 joeware 实用程序“oldcmp”:
oldcmp -age [days] -report
oldcmp 还提供了删除任何您想要删除的内容的选项,因此如果您这样做,请谨慎操作。