
Sou novo nesta posição e acho que a estrutura do AD precisa de uma limpeza séria. Existem duas vezes mais contas de computador do que funcionários, sem levar em conta os servidores. Gostaria de saber quais deles ainda são válidos e quais podem ser excluídos sem repercussão.
Encontrei a ferramenta da Joeware, OldComp, parece muito útil, mas acho que só estou precisando de um pouco mais de compreensão do que ela está vendo... quando procura computadores com mais de 90 dias, isso significa que já faz 90 dias? dias desde que foi conectado à rede? A razão por trás disso é que não quero separar inadvertidamente um laptop de um escritório de campo que pode estar em uma prateleira como backup, pensando que é um computador "antigo" quando na verdade não está conectado e sendo usado atualmente. Talvez não valha a pena se preocupar com a rara chance de que isso possa acontecer...
De qualquer forma, se alguém souber de alguma outra maneira ou tiver um bom exemplo da melhor forma de conseguir isso, eu apreciaria algumas dicas. O resultado final é que eu gostaria de me livrar das contas de computador que não estão mais em uso. Obrigado.
Responder1
Oldcmp
é bem conhecido pelo que faz e funcionará bem na primeira vez e em limpezas ocasionais.
Se, com o tempo, você quiser um processo automatizado, poderá usar o Powershell (altamente recomendado) para escrever um processo automatizado para isso. Por exemplo, nosso script atual faz o seguinte:
- Localiza contas antigas com base no
lastLogonTimeStamp
usoget-ADcomputer
- desativa-os após 60 dias
- exclui-os após 90 dias
- Registra tudo o que faz
Além disso, usamos o sinalizador ProtectFromAccidentialDeletion na conta se não quisermos que ela seja excluída.
Responder2
Não existe nenhum método que seja capaz de distinguir entre uma máquina que desapareceu e não existe mais e uma que está parada em uma prateleira sem uso, então use o OldComp para fazer a limpeza e lidar com os únicos se e quando eles aparecem.
Responder3
Por que não o 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
}
}
Você deve acabar com uma lista de $StaleComputerAccounts
e $NeverUsedComputerAccounts
que poderá manipular com mais PowerShell. Eu gosto de fazer algo assim:
$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()
}
Não há uma maneira mágica de distinguir programaticamente entre um computador que foi desativado indevidamente (ninguém o removeu do Active Directory quando estava off-line) e um laptop na mesa de algum executivo. Se você quiser agir com cuidado, basta desativar a conta e enviá-la para uma UO específica, como eu faço.