Como encontro 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 que eu realmente sei como fazer isso. Esta é uma pergunta auto-respondida apenas para divulgar o conhecimento. Se alguém tiver uma maneira melhor, fique à vontade para publicá-la!

MDMarra
fonte

Respostas:

10

Isso daria a você todas as contas de computador que não têm 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 daria a você contas de computador desativadas.

Search-ADAccount -AccountDisabled -ComputersOnly 
Mike
fonte
Interessante! Eu (obviamente) não sabia sobre esse cmdlet. Qual atributo é medido para "AccountInactive"? lastlogondate? passwordlastset?
MDMarra
Vou ter que procurar 100% de certeza, mas sei que lastlogondate é um dos atributos retornados se você olhar para o objeto, passwordlastset não. O artigo da technet não detalha realmente qual atributo ele usa.
Mike
1
Observou um pouco mais e lastlogondate parece ser apenas a conversão de lastlogontimestamp. Não há nenhum atributo chamado lastlogondate no esquema. Espero que ajude.
Mike
5

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

Esse script do PowerShell produzirá 2 arquivos de texto. Um é para computadores desativados, um é para objetos de conta de computador órfãos. Você deve ter o módulo Active Directory PowerShell 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
}
MDMarra
fonte
0

Um milhão de agradecimentos! Eu queria adicionar meu tweak para isso. Eu precisava encontrar apenas servidores que foram desabilitados ou desabilitados e não estã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
} 
Geekgal
fonte
0

Sei que o OP pediu claramente o PowerShell, mas se você não gosta, não o possui e não deseja aprender outra sintaxe da Microsoft, o snippet do Python a seguir fornecerá uma data no formato correto para uso 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)

Que poderia 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))

Você provavelmente só precisa de 30, pois o período padrão para as máquinas Windows mudarem sua senha é de 30 dias, mas 90 parece mais seguro caso você se esqueça do PC que está sentado embaixo da mesa de Bob e nunca é ligado.

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

Samuel Harmer
fonte