Inaktive Benutzerkonten in Ihrer Domäne finden

Active Directory ist ein Verzeichnisdienst, der Informationen über Benutzer, Computer und verwandte Objekte verwaltet. So finden Sie inaktive Benutzerkonten.

Es handelt sich um eine Datenbank mit relationalen Informationen, die im Laufe der Zeit gewartet werden muss, um nützlich und relevant zu sein. In einem Verzeichnis werden keine Konten mehr verwendet. Das Auffinden dieser Konten in Active Directory ist nicht so einfach, wie es auf den ersten Blick klingt. Lassen Sie uns durch das Auffinden inaktiver Benutzerkonten und deren automatische Entfernung gehen.

Suchkriterien definieren

Definieren wir, was für diesen Prozess benötigt wird. Unser Ziel ist es, Mitarbeiterkonten zu finden, die sich über einen längeren Zeitraum nicht im Netzwerk angemeldet haben. Ich habe immer 90 oder 120 Tage als gutes Maß verwendet, um Inaktivität nach abzufragen, aber diese Zahl kann bis zu 14 Tage betragen. Sie müssen entscheiden, was für Ihre Organisation richtig ist. 90 tage gibt eine groß genug kissen zu erlauben für menschen aus dem büro für urlaub, familie notfälle, oder erweiterte medizinische blätter. Sobald die Konten 90 Tage Inaktivität erreicht haben, möchten wir diese Konten deaktivieren und in eine separate Organisationseinheit verschieben.

Wenn wir zuerst definieren, wonach wir suchen, können wir einen einfachen Regelsatz erstellen, dem wir folgen müssen. Unser Regelsatz sieht so aus:

  • Suchen und deaktivieren Sie aktive Konten, die 90 Tage lang keine Anmeldeaktivität aufweisen.
  • Verschieben Sie jedes deaktivierte Konto in die OU Disabled-Users
  • Markieren Sie jeden deaktivierten Benutzer mit einem Kommentar, dass ein automatisierter Prozess ihn deaktiviert hat.

Kontoinaktivitätseigenschaften suchen

Jedes Benutzerkonto verfügt über mehrere Attribute, die Anmeldeinformationen enthalten. Wir möchten Attribute finden, die die letzte Anmeldezeit anzeigen. Wenn wir diese Attribute finden, können wir sie verwenden, um nach Konten zu suchen, die seit einem bestimmten Datum nicht mehr angemeldet sind. Wir können PowerShell verwenden, um den gesamten Regelsatz anzuzeigen und ein Attribut auszuwählen, mit dem gearbeitet werden soll.

Get-ADUser ist das am häufigsten verwendete Cmdlet zum Anzeigen von Benutzerinformationen. Sie könnten Get-ADObject und Search-ADAccount , aber Get-ADUser ist das beste Cmdlet für unsere Aufgabe. Um alle Benutzereigenschaften anzuzeigen, müssen wir der Cmdlet-Syntax -properties * hinzufügen. Wenn wir diese Syntax weglassen, werden nur die Standardeigenschaften angezeigt, bei denen es sich nur um 10 Eigenschaften handelt.

Get-ADUser Michael_Kanakos -Properties *

Wir geben eine lange Liste von Feldern aus unserer Abfrage zurück (über 150!). Wir können mit Platzhaltern nach Attributen suchen, die bestimmte Wörter enthalten. Dies hilft uns, Attribute zu finden, die für unsere Aufgabe nützlich sein können. Wir möchten Anmeldeinformationen finden, also suchen wir nach Attributen, die das Wort Anmeldung enthalten.

Sobald wir PowerShell anweisen, alle Eigenschaften abzurufen, wäre es hilfreich, wenn wir die Liste der Eigenschaften so einschränken könnten, dass nur Eigenschaften angezeigt werden, die mit der Anmeldung übereinstimmen. Select-Object bietet die Möglichkeit, ein Wildcard-Match durchzuführen und unsere Ergebnisse zu begrenzen. Das Zeichen | („pipe“ genannt) nimmt die Ergebnisse links und übergibt sie an Select-Object . Select-Object führt dann den Wildcard-Abgleich durch und begrenzt dann die Ergebnisse basierend auf unseren Wildcard-Kriterien.

Get-ADUser username -Properties * | Select-Object *logon*
BadLogonCount : 0
lastLogon : 132181280348543735
LastLogonDate : 11/11/2019 9:08:45 PM
lastLogonTimestamp : 132179981259860013
logonCount : 328
LogonWorkstations :
MNSLogonAccount : False
SmartcardLogonRequired : False

Die Ergebnisse variieren je nach Domänenfunktionsebene des Active Directory geringfügig. Meine Suche gibt acht Attribute zurück. Drei sehen vielversprechend aus: LastLogon , LastLogonDate und LastLogonTimeStamp . Einige der Werte sehen möglicherweise etwas seltsam aus, wenn Sie nicht wissen, wie Active Directory Datums- / Zeitinformationen in bestimmten Attributen speichert. Einige Datumsinformationen sind traditionelle Datums- / Uhrzeitinformationen, und einige werden als „Ticks“ gespeichert.“

PowerShell- und .NET Framework-Datums- / Uhrzeitwerte stellen Datumsangaben als Anzahl der Ticks seit 12:00 Uhr AM 1. Januar 0001 dar. Ticks sind gleich einer Zehnmillionstel Sekunde, was bedeutet, dass es 10.000 Ticks pro Millisekunde gibt. Es gibt mathematische Cmdlets, die Ticks in ein Standarddatumsformat konvertieren können.

PowerShell zeigt das tatsächliche Häkchen an, das das Datum / die Uhrzeit darstellt. Wenn Sie mit der Konvertierung von Feldern in das Datumsformat vertraut sind, können Sie diese Felder in Active Directory-Benutzer und -Computer oder Active Directory-Verwaltungscenter anzeigen. In beiden Apps werden die Ticks als Zeit-Datum-Format dargestellt.

ADUser-Logon-Propertes

ADUser-Logon-Properties

Logon Attributes Explained

Unsere Suche hat mehrere Eigenschaften gefunden, die Datum / Uhrzeit der Anmeldung anzeigen. Zwei Eigenschaften haben dasselbe Datum und dieselbe Uhrzeit und eine nicht. Was ist hier los?

Die Abweichung der Datums- / Uhrzeitinformationen ist beabsichtigt und dient dazu, DCS davor zu schützen, durch Replikationsverkehr zerstört zu werden, der versucht, alle Anmeldeinformationen synchron zu halten. Die LastLogon-Eigenschaft wird bei jeder Authentifizierung aktualisiert, die Daten werden jedoch auf dem DC gespeichert, bei dem Sie sich authentifiziert haben, und nicht auf die anderen DCS repliziert. Die Eigenschaften LastLogonTimeStamp und LastLogonDate werden auf alle DCS repliziert, die Replikation erfolgt jedoch nur selten.

Wenn wir uns die Daten ansehen, können wir sehen, wie sich die verzögerte Replikation auf unsere Abfrage auswirken kann. Beachten Sie, dass LastLogonTimeStamp in diesem Beispiel tatsächlich zwei Tage zurückliegt. Jedes Mal, wenn sich ein Benutzer interaktiv anmeldet, eine Netzwerkdateifreigabe berührt oder andere Aktivitäten ausführt, bei denen das Netzwerk das Konto authentifizieren muss, werden Anmeldeinformationen in Active Directory gespeichert. Wenn die dcs diese Daten JEDES MAL replizieren, wenn jemand etwas im Netzwerk berührt, könnten die Dcs in einer großen Umgebung überfordert sein. Das Ergebnis ist, dass einige Anmeldeinformationen korrekt sind, aber nicht repliziert werden, und einige Anmeldeinformationen repliziert werden, aber nur gelegentlich.

Für unsere Anforderungen benötigen wir keinen GENAUEN Anmeldezeitstempel. Wir müssen nur Konten finden, die sich schon lange nicht mehr angemeldet haben (länger als 90 Tage). Jeder Wert kann nützlich sein, auch wenn das Datum um einige Tage verschoben ist. Wenn wir als Beispiel meine Anmeldedaten verwenden, kann die abgefragte Zeit je nach verwendetem Wert 11/11 oder 11/13 sein. Schneller Vorlauf drei Monate und nehme an, ich habe mich nie wieder angemeldet. Ein Datum würde als inaktiv gekennzeichnet, wenn es länger als 90 Tage ist, und ein Feld würde dies nicht tun. Aber wenn ich diesen Prozess so einrichten würde, dass er monatlich ausgeführt wird, würde ich das Konto bei der nächsten Überprüfung abfangen. Das ist der kritische Teil. Wenn wir dies regelmäßig tun, können wir beide Felder verwenden, solange wir dies konsequent überprüfen.

Ich habe die Eigenschaft LastLogonDate aus zwei Gründen verwendet. Erstens ist es bereits ein Datumswert, sodass ich mich nicht mit der Konvertierung des Werts befassen muss. Zweitens ist es ein replizierter Wert, und das macht mein Leben einfacher. Wenn ich LastLogon , hätte ich Daten, die für Personen, die sich bei anderen Domänencontrollern in meinem Netzwerk authentifizieren, nicht aktuell sind. Ich müsste den lokalen DC für jeden Benutzer abfragen, um den neuesten Zeitstempel zu erhalten, und das ist viel Arbeit und nicht sehr effizient.

Um die Informationen zu einem einzelnen Konto zu erhalten, ist der Code einfach.

get-aduser Michael_Kanakos -properties LastLogonDate | Select-Object Name, LastLogonDate
Name LastLogonDate
---- -------------
mkanakos 11/11/2019 9:08:45 PM

Um dies für alle meine Benutzer zu tun, ist nur etwas mehr Code erforderlich. Wir müssen einen Filter verwenden, um alle Benutzerkonten abzufragen.

Get-ADUser -filter * -properties LastLogonDate | Select-Object Name, LastLogonDate

Lassen Sie uns nun nur die Konten mit einem Anmeldedatum finden, das älter als 90 Tage ist. Wir benötigen das aktuelle gespeicherte Datum, um es als Vergleichsoperator zu verwenden.

$date = (get-date).AddDays(-90)
Get-ADUser -Filter {LastLogonDate -lt $date} -properties LastLogonDate | Select-Object Name, LastLogonDate

Dieser Code ruft alle Benutzer ab, die sich über 90 Tage nicht angemeldet haben. Wir speichern das Datum vor 90 Tagen in einer Variablen. Wir können einen Anzeigenfilter erstellen, um Anmeldungen unter diesem Datum zu finden. Als nächstes müssen wir die Anforderung hinzufügen, nur aktive Konten abzufragen. In diesem Beispiel verwende ich Splatting, um den Code lesbarer zu machen, da die Syntax sehr lang ist. Das Splatting von AD-Cmdlets kann schwierig sein, daher habe ich auch die Langformversion der Syntax unter dem Splatting-Beispiel gezeigt.

$date = (get-date).AddDays(-90)
$paramhash = @{
Filter = "LastLogonDate -lt $date -and Enabled -eq $true"
Properties = 'LastLogonDate'
}
$SelectProps = 'Name','LastLogonDate','Enabled','DistinguishedName'
$InactiveUsers = Get-Aduser @paramhash | Select-Object $SelectProps
$InactiveUsers = Get-ADUser -Filter {LastLogonDate -lt $date -and Enabled -eq $true} -properties LastLogonDate, DistinguishedName | Select-Object Name, LastLogonDate, Enabled, DistinguishedName

Dies gibt uns unsere inaktiven Benutzer, die aktiviert sind. Wir speichern die Ergebnisse zur Wiederverwendung in einer Variablen. Die distinguishedName Eigenschaft wird später benötigt. Sobald wir die Benutzer gefunden haben, können wir an unserem nächsten Schritt arbeiten: Deaktivieren der Konten. Wir verwenden das Cmdlet Set-ADUser, um Änderungen am AD-Benutzerkonto vorzunehmen.

$Today = Get-Date
$DisabledUsers = (
$InactiveUsers | Foreach-object {
Set-User $_.DistinguishedName -Enabled $false -Description "Acct disabled on $Today via Inactive Users script"}
)

Wir haben unsere Benutzerkonten deaktiviert. Es ist Zeit, sie in eine neue Organisationseinheit zu verschieben. In unserem Beispiel verwenden wir die Organisationseinheit Disabled-Users. Der Distinguished Name für diese OU ist „OU=Disabled-Users,DC=Contoso,DC=Com“ Wir verwenden das Cmdlet Move-ADObject, um Benutzer in die Ziel-OU zu verschieben.

$DisabledUsers | ForEach-Object {
Move-ADObject $_.DistinguishedName -TargetPath "OU=Disabled-Users,DC=Contoso,DC=Com"}

In unserem letzten Schritt haben wir das Move-ADObject verwendet, um Benutzer in eine neue Organisationseinheit zu verschieben. Wir haben jetzt den Kerncode, der benötigt wird, um eine zuverlässige, wiederholbare automatisierte Aufgabe zu erstellen. Also, was kommt als nächstes? Das hängt von Ihren individuellen Anforderungen ab. Dieser Code kann und sollte so eingerichtet werden, dass er jeden Monat automatisch zur gleichen Zeit ausgeführt wird. Eine einfache Möglichkeit, dies zu tun, besteht darin, einen geplanten Job zu erstellen, um den Code monatlich auszuführen.

Wir könnten diesem Code noch mehr hinzufügen, um ihn zu verbessern. Code für die Fehlerprüfung und zusätzliche Benutzerinformationsfelder wären zwei nützliche Ergänzungen. Die meisten Teams, die diese Art von Aufgaben ausführen, generieren einen Bericht darüber, was deaktiviert wurde, damit jemand es überprüfen kann. Sie können weitere Felder aus Active Directory einschließen, um einen Bericht nützlicher zu machen. Wir könnten diese Aufgabe noch einen Schritt weiter gehen, indem wir eine weitere Aufgabe erstellen, um diese deaktivierten Benutzer nach 6 Monaten zu löschen.

Das Lösen anspruchsvoller Automatisierungsanforderungen ist viel einfacher, wenn die Aufgaben in überschaubare Teile unterteilt sind. Wir begannen mit den Anforderungen und bauten unsere Syntax in kleinen Schritten auf; Bestätigen Sie, dass jeder Schritt funktioniert, bevor Sie versuchen, eine andere Variable hinzuzufügen. Auf diese Weise haben wir diese Aufgabe leicht verständlich und hoffentlich eine großartige Lernerfahrung gemacht.

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht.