Come posso trovare oggetti di computer orfani in Active Directory usando PowerShell?


10

Come posso trovare tutti gli account computer nel mio dominio Active Directory che sono stati inattivi per x giorni usando PowerShell?

Nota che in realtà so come farlo. Questa è una domanda autosufficiente solo per ottenere la conoscenza là fuori. Se qualcun altro ha un modo migliore, sentiti libero di pubblicarlo!

Risposte:


10

Questo ti darebbe tutti gli account di computer che non hanno attività negli ultimi 365 giorni.

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

Questo lo ordinerebbe per te da lastlogondate.

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

Questo ti darebbe account di computer disabilitati.

Search-ADAccount -AccountDisabled -ComputersOnly 

Interessante! (Ovviamente) non sapevo di quel cmdlet. Quale attributo viene misurato per "AccountInactive"? lastlogondate? passwordlastset?
MDMarra,

Dovrò essere sicuro al 100%, ma so che lastlogondate è uno degli attributi che viene restituito se guardi l'oggetto, passwordlastset no. L'articolo di technet non specifica in dettaglio quale attributo utilizza.
Mike,

1
Abbiamo esaminato un po 'di più e lastlogondate sembra essere solo la conversione di lastlogontimestamp. Non esiste alcun attributo chiamato lastlogondate nello schema. Spero che aiuti.
Mike,

5

Per impostazione predefinita, i computer cambiano la password dell'account ogni 30 giorni. Se un computer non ha cambiato la sua password per un lungo periodo di tempo, significa che non sono più connessi alla rete.

Questo script di PowerShell genererà 2 file di testo. Uno è per computer disabilitati, uno per oggetti account di computer orfani. È necessario che sia installato il modulo PowerShell di Active Directory.

In questo esempio, escludo un'unità organizzativa "Computer portatili crittografati", poiché sono computer portatili che vengono disconnessi per lunghi periodi di tempo. Puoi rimuovere quella sezione se non hai una configurazione simile

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
}

0

Mille grazie! Volevo aggiungere il mio tweak a questo. Avevo bisogno di trovare solo server che sono stati disabilitati o non disabilitati e non in produzione. Questo è quello che mi è venuto in mente e sembrava funzionare.

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
} 

0

So che l'OP ha chiaramente richiesto PowerShell ma se non ti piace, non ce l'hai e non vuoi imparare ancora un'altra sintassi Microsoft, il seguente frammento di Python ti darà una data nel formato corretto da usare con una query 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)

Che potrebbe quindi essere usato come segue per trovare tutti i computer Windows che non hanno cambiato le loro password negli ultimi 90 giorni.

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

Probabilmente hai solo bisogno di 30 poiché il periodo predefinito per i computer Windows per cambiare la loro password è di 30 giorni, ma 90 sembra più sicuro nel caso in cui ti dimentichi di quel PC che si trova sotto la scrivania di Bob e non si accende mai.

EDIT: Oh, ho anche omesso il supporto del fuso orario in questo, che probabilmente non ha importanza in questo caso d'uso, ma può in altri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.