我是这个职位的新手,发现它的 AD 结构需要认真清理。计算机帐户的数量是员工数量的两倍多,甚至还不包括服务器。我希望能够知道其中哪些仍然有效,哪些可以删除而不会产生任何影响。
我从 Joeware 找到了 OldComp 这个工具,它看起来非常方便,但我想我只是需要更多地了解它正在查看的内容...当它搜索超过 90 天的计算机时,这是否意味着它已插入网络 90 天了?这背后的原因是,我不想无意中将一台笔记本电脑从可能放在架子上作为备份的现场办公室断开,以为它是一台“旧”电脑,而实际上它只是没有插入并且当前正在使用。不过,也许不值得担心这种情况可能发生的罕见机会......
无论如何,如果有人知道其他方法或有关于如何最好地实现这一点的良好示例,我将不胜感激。最终结果是,我只想摆脱不再使用的计算机帐户。谢谢。
答案1
Oldcmp
因其功能而广为人知,首次使用和偶尔清理时效果很好。
如果随着时间的推移,您需要一个自动化流程,则可以使用 Powershell(强烈推荐)为此编写一个自动化流程。例如,我们当前的脚本执行以下操作:
lastLogonTimeStamp
通过使用以下方式查找旧帐户get-ADcomputer
- 60 天后禁用它们
- 90 天后删除
- 记录所做的一切
此外,如果我们不想删除帐户,我们会在帐户上使用 ProtectFromAccidentialDeletion 标志。
答案2
没有任何方法能够区分已经消失且不再存在的机器和闲置在架子上的机器,因此使用 OldComp 进行清理,并在出现一次性问题时进行处理。
答案3
为什么不用 PowerShell?
$Computers = ([ADSISearcher]"(&(objectCategory=computer)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))").FindAll()
$Computers = $Computers | ForEach { $_.Path }
$Age = $(Get-Date).AddDays(-90)
$StaleComputerAccounts = @()
$NeverUsedComputerAccounts = @()
ForEach ($Computer in $Computers) {
$ComputerObj = [ADSI]$Computer
if ($ComputerObj.lastLogon) {
$LastLogon = [DateTime]::FromFileTime($ComputerObj.ConvertLargeIntegerToInt64($ComputerObj.lastlogon[0]))
if ( $LastLogon -lt $Age ) {
$StaleComputerAccounts += $Computer
}
}
else {
$NeverUsedComputerAccounts += $Computer
}
}
您最终应该会得到一个列表$StaleComputerAccounts
,$NeverUsedComputerAccounts
然后可以使用更多 PowerShell 对其进行操作。我喜欢这样做:
$TargetOU = "OU=Computers,OU=Disabled,OU=,DC=CONTOSO,DC=com"
$OUObj = [ADSI]"LDAP://$TargetOU"
ForEach ($Computer in $StaleComputerAccounts) {
$ComputerObj = [ADSI]$Computer
$ComputerObj.PSBase.MoveTo($OUObj)
$ComputerObj.InvokeSet("accountDisabled", $True)
$ComputerObj.SetInfo()
}
没有什么神奇的方法可以通过编程区分被不当停用的计算机(当它处于离线状态时,没有人将其从 Active Directory 中删除)和放在某位高管办公桌上的笔记本电脑。如果您想谨慎行事,您可以像我一样禁用该帐户并将其发送到特定的 OU。