Jak znaleźć osierocone obiekty komputerowe w usłudze Active Directory przy użyciu programu PowerShell?

10

Jak mogę znaleźć wszystkie konta komputerów w mojej domenie Active Directory, które były nieaktywne przez x dni za pomocą PowerShell?

Zauważ, że tak naprawdę wiem, jak to zrobić. To jest samo-odpowiedź na pytanie, aby zdobyć wiedzę. Jeśli ktoś ma lepszy sposób, opublikuj go!

MDMarra
źródło

Odpowiedzi:

10

To da ci wszystkie konta komputerów, które nie mają żadnej aktywności przez ostatnie 365 dni.

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

To posortuje to dla ciebie według lastlogondate.

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

Dałoby to wyłączone konta komputerowe.

Search-ADAccount -AccountDisabled -ComputersOnly 
Mikrofon
źródło
Ciekawy! Oczywiście nie wiedziałem o tym poleceniu cmdlet. Jaki atrybut jest mierzony dla „AccountInactive”? lastlogondate? hasło?
MDMarra,
Będę musiał się upewnić, aby mieć 100% pewności, ale wiem, że lastlogondate jest jednym z atrybutów zwracanych, jeśli spojrzysz na obiekt, zestaw haseł nie jest. W artykule technet tak naprawdę nie wyszczególniono, którego atrybutu używa.
Mike
1
Przyjrzałem się temu trochę bardziej i lastlogondate wygląda, jakby to była tylko konwersja lastlogontimestamp. W schemacie nie ma atrybutu o nazwie lastlogondate. Mam nadzieję, że to pomaga.
Mike,
5

Komputery domyślnie zmieniają hasło do konta co 30 dni. Jeśli komputer nie zmienił swojego hasła przez dłuższy czas, oznacza to, że nie jest już podłączony do sieci.

Ten skrypt PowerShell wyświetli 2 pliki tekstowe. Jeden dotyczy komputerów niepełnosprawnych, drugi dotyczy osieroconych obiektów kont komputerów. Musisz mieć zainstalowany moduł PowerShell Active Directory.

W tym przykładzie wykluczam jednostkę organizacyjną „Szyfrowane laptopy”, ponieważ są to mobilne laptopy, które są odłączone na dłuższy czas. Możesz usunąć tę sekcję, jeśli nie masz podobnej konfiguracji

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
źródło
0

Milion dziękuję! Chciałem dodać do tego moje ulepszenie. Musiałem znaleźć tylko serwery, które zostały wyłączone lub nie zostały wyłączone i nie są produkowane. Właśnie to wymyśliłem i wydawało się, że działa.

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
źródło
0

Wiem, że OP wyraźnie poprosił o PowerShell, ale jeśli ci się nie podoba, nie masz go i nie chcesz nauczyć się kolejnej składni Microsoft, to następujący fragment kodu w Pythonie poda datę w odpowiednim formacie do użycia za pomocą zapytania 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)

Którego następnie można użyć w następujący sposób, aby znaleźć wszystkie komputery z systemem Windows, które nie zmieniły swoich haseł w ciągu ostatnich 90 dni.

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

Prawdopodobnie potrzebujesz tylko 30, ponieważ domyślny okres, w którym maszyny z systemem Windows mogą zmienić hasło, to 30 dni, ale 90 wydaje się bezpieczniejsze na wypadek, gdybyś zapomniał o komputerze, który znajduje się pod biurkiem Boba i nigdy się nie włącza.

EDYCJA: Och, pominąłem także obsługę stref czasowych, co prawdopodobnie nie ma znaczenia w tym przypadku użycia, ale może w innych.

Samuel Harmer
źródło