Wie finde ich mit PowerShell verwaiste Computerobjekte in Active Directory?


10

Wie kann ich alle Computerkonten in meiner Active Directory-Domäne finden, die mit PowerShell x Tage lang inaktiv waren?

Beachten Sie, dass ich tatsächlich weiß, wie das geht. Dies ist eine selbst beantwortete Frage, nur um das Wissen herauszubekommen. Wenn jemand einen besseren Weg hat, kannst du ihn gerne posten!

Antworten:


10

Dies würde Ihnen alle Computerkonten geben, die in den letzten 365 Tagen keine Aktivität hatten.

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

Dies würde es für Sie nach lastlogondate sortieren.

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

Dies würde Ihnen deaktivierte Computerkonten geben.

Search-ADAccount -AccountDisabled -ComputersOnly 

Interessant! Ich wusste (offensichtlich) nichts über dieses Cmdlet. Welches Attribut wird für "AccountInactive" gemessen? lastlogondate? Passwortlastset?
MDMarra

Ich muss mich umsehen, um 100% sicher zu sein, aber ich weiß, dass lastlogondate eines der Attribute ist, die zurückgegeben werden, wenn Sie sich das Objekt ansehen, Passwortlastset nicht. Der Technet-Artikel beschreibt nicht wirklich, welches Attribut er verwendet.
Mike

1
Ich habe es mir etwas genauer angesehen und lastlogondate sieht so aus, als wäre es nur die Konvertierung von lastlogontimestamp. Das Schema enthält kein Attribut namens lastlogondate. Ich hoffe, das hilft.
Mike

5

Computer ändern ihr Kontokennwort standardmäßig alle 30 Tage. Wenn ein Computer sein Kennwort über einen längeren Zeitraum nicht geändert hat, bedeutet dies, dass er nicht mehr mit dem Netzwerk verbunden ist.

Dieses PowerShell-Skript gibt 2 Textdateien aus. Eine ist für deaktivierte Computer, eine für verwaiste Computerkontobjekte. Sie müssen das Active Directory PowerShell-Modul installiert haben.

In diesem Beispiel schließe ich eine Organisationseinheit "Verschlüsselte Laptops" aus, da es sich um mobile Laptops handelt, die über einen längeren Zeitraum nicht verbunden sind. Sie können diesen Abschnitt entfernen, wenn Sie kein ähnliches Setup haben

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

Eine Million danke! Ich wollte dem meinen Tweak hinzufügen. Ich musste nur Server finden, die entweder deaktiviert oder nicht deaktiviert wurden und nicht in Produktion sind. Das habe ich mir ausgedacht und es schien zu funktionieren.

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

Ich weiß, dass das OP eindeutig nach PowerShell gefragt hat, aber wenn es Ihnen nicht gefällt, Sie es nicht haben und keine weitere Microsoft-Syntax lernen möchten, gibt Ihnen das folgende Python-Snippet ein Datum im richtigen Format mit einer LDAP-Abfrage.

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)

Dies könnte dann wie folgt verwendet werden, um alle Windows-Computer zu finden, deren Kennwörter in den letzten 90 Tagen nicht geändert wurden.

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

Sie benötigen wahrscheinlich nur 30, da die Standarddauer für Windows-Computer zum Ändern des Kennworts 30 Tage beträgt. 90 scheint jedoch sicherer zu sein, wenn Sie den PC vergessen haben, der sich unter Bobs Schreibtisch befindet und nie eingeschaltet wird.

EDIT: Oh, auch ich habe die Zeitzonenunterstützung hier weggelassen, was in diesem Anwendungsfall wahrscheinlich keine Rolle spielt, aber in anderen möglicherweise.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.