Como faço para localizar objetos de computador órfãos no Active Directory usando o PowerShell?

10

Como posso encontrar todas as contas de computador no meu domínio do Active Directory que ficaram inativas por x dias usando o PowerShell?

Note that I do actually know how to do this. This is a self-answered question just to get the knowledge out there. If anyone else has a better way, feel free to post it!

    
por MDMarra 09.08.2012 / 14:45

4 respostas

10

Isso forneceria a você todas as contas de computador sem atividade nos últimos 365 dias.

Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 365.00:00:00

Isso classificaria para você por lastlogondate.

Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 365.00:00:00 | Sort-Object lastlogondate | Ft name,lastlogondate -auto

Isso forneceria contas de computador desativadas.

Search-ADAccount -AccountDisabled -ComputersOnly 
    
por 09.08.2012 / 15:49
5

Os computadores alteram a senha da conta a cada 30 dias por padrão. Se um computador não mudou sua senha em um período prolongado, isso significa que eles não estão mais conectados à rede.

Este script do PowerShell produzirá dois arquivos de texto. Uma é para computadores com deficiência, uma é para objetos de conta de computador órfãos. Você deve ter o módulo do PowerShell do Active Directory instalado.

Neste exemplo, excluo uma UO "Laptops criptografados", pois são laptops móveis desconectados por longos períodos de tempo. Você pode remover essa seção se não tiver uma configuração semelhante

Import-Module ActiveDirectory

$Date = [DateTime]::Today

#Sets the deadline for when computers should have last changed their password by.
$Deadline = $Date.AddDays(-365)   

#Makes the date string for file naming
$FileName = [string]$Date.month + [string]$Date.day + [string]$Date.year 


#Generates a list of computer accounts that are enabled and aren't in the Encrypted Computers OU, but haven't set their password since $Deadline
$OldList = Get-ADComputer -Filter {(PasswordLastSet -le $Deadline) -and (Enabled -eq $TRUE)} -Properties PasswordLastSet -ResultSetSize $NULL |
Where {$_.DistinguishedName -notlike "*Encrypted Laptops*"} | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto 

#Generates a list of computer accounts that are disabled and sorts by name.
$DisabledList = Get-ADComputer -Filter {(Enabled -eq $FALSE)} -Properties PasswordLastSet -ResultSetSize $null | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto

#Creates the two files, assuming they are not $NULL. If they are $NULL, the file will not be created.
if ($OldList -ne $NULL) {
    Out-File "C:\users\marra\desktop\Old$Filename.txt" -InputObject $OldList
}

if ($DisabledList -ne $NULL) {
    Out-File "C:\users\marra\desktop\Disabled$Filename.txt" -InputObject $DisabledList
}
    
por 09.08.2012 / 14:45
0

Um milhão de agradecimentos! Eu queria adicionar meu ajuste a isso. Eu precisava encontrar apenas servidores que foram desativados ou não desativados e não em produção. Foi isso que eu criei e pareceu funcionar.

Import-Module ActiveDirectory

$Date = [DateTime]::Today

#Sets the deadline for when computers should have last changed their password by.
$Deadline = $Date.AddDays(-365)   

#Makes the date string for file naming
$FileName = [string]$Date.month + [string]$Date.day + [string]$Date.year 

#Generates a list of computer server accounts that are enabled, but haven't set their password since $Deadline
$OldList = Get-ADComputer -Filter {(PasswordLastSet -le $Deadline) -and (Enabled -eq $TRUE) -and (OperatingSystem -Like "Windows *Server*")} -Properties PasswordLastSet -ResultSetSize $NULL |
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto 

#Generates a list of computer server accounts that are disabled and sorts by name.
$DisabledList = Get-ADComputer -Filter {(Enabled -eq $FALSE) -and (OperatingSystem -Like "Windows *Server*")} -Properties PasswordLastSet -ResultSetSize $null | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto

#Creates the two files, assuming they are not $NULL. If they are $NULL, the file will not be created.
if ($OldList -ne $NULL) {
    Out-File "C:\temp\Old$Filename.txt" -InputObject $OldList
}

if ($DisabledList -ne $NULL) {
    Out-File "C:\temp\Disabled$Filename.txt" -InputObject $DisabledList
} 
    
por 11.09.2014 / 00:49
0

Eu sei que o OP pediu claramente pelo PowerShell, mas se você não gostar dele, não o tenha, e não queira aprender mais uma sintaxe da Microsoft, o seguinte fragmento do Python lhe dará uma data correta formato para usar com uma consulta LDAP.

import datetime, time
def w32todatetime(w32):
    return datetime.fromtimestamp((w32/10000000) - 11644473600)
def datetimetow32(dt):
    return int((time.mktime(dt.timetuple()) + 11644473600) * 10000000)

90daysago = datetime.datetime.now() - datetime.timedelta(days=90)
print datetimetow32(90daysago)

O qual poderia então ser usado da seguinte maneira para encontrar todos os computadores Windows que não alteraram suas senhas nos últimos 90 dias.

(&(objectCategory=computer)(objectClass=computer)(operatingSystem=Windows*)(pwdLastSet<=130604356890000000))

Provavelmente você só precisa de 30, pois o período padrão para as máquinas Windows mudarem de senha é 30 dias, mas 90 parece mais seguro caso você tenha esquecido o PC que está embaixo da mesa de Bob e nunca é ligado.

EDIT: Ah, também omiti o suporte a fuso horário, o que provavelmente não importa neste caso de uso, mas em outros.

    
por 12.02.2015 / 13:28