Anmeldezeiten (Logon Hours) im AD mit PowerShell
Damit sich Benutzer einer Active Directory Domäne nicht zu jeder Zeit anmelden können, gibt es so genannte Anmeldezeiten. Auf englischen Betriebssystemen nennen sich diese Logon Hours. Diese lassen sich per PowerShell auslesen und sogar setzen.
Mit diesen Anmeldezeiten kann die Anmeldung für Benutzer erlaubt oder verweigert werden. Definiert werden kann der Wochentag und Uhrzeit in Stunden.
Anmeldezeiten im AD
Die erlaubten, beziehungsweise verbotenen Anmeldezeiten im Active Directory (AD) werden nicht mit der Angabe von Uhrzeiten gesetzt. Im AD hat man im Benutzer-Profil blaue und weiße Balken.
- blaue Balken erlauben die Anmeldung
- weiße Balken verweigern die Anmeldung
Die Logon Hours, wie sie auf englischen Systemen heißen, können per PowerShell ausgelesen und gesetzt werden. Das Problem ist nur, dass diese Informationen zu den erlaubten Zeiten dezimal gespeichert werden.
Aufbau
Vom Aufbau her ist es relativ einfach zu verstehen. Die Logon-Hours werden dezimal angegeben, wie im Bild oben. Doch wie ist der Aufbau? Wie kann man daraus Zeiten ableiten?
- für jeden Wochentag stehen 3 Blöcke
- jeder Block stellt 8 Stunden dar
- Segment 1: 6pm – 2am
- Segment 2: 2am – 10am
- Segment 3: 10am – 6pm
Um diese Darstellung besser zu verstehen, hilft vielleicht diese Darstellung:
255,255,255, #Sun, 6pm previous day to 6pm present day 255,255,255, #Mon 255,255,255, #Tue 255,255,255, #Wed 255,255,255, #Thu 255,255,255, #Fri 255,255,255 #Sat
- Sind die Blöcke ALLE 255, so ist die Anmeldung an jedem Tag zu jeder Zeit erlaubt
- Sind die Blöcke auf 0, so ist eine Anmeldung nicht möglich (untersagt)
Eine solche Darstellung der Logon Hours kann leider niemand lesen. Das macht den Umgang mit den Anmeldezeiten im AD so schwer. Abhilfe schafft PowerShell. Denn mit einem PowerShell Script lassen sich die Zeiten auslesen und auf andere User übertragen.
Logon Hours mit PowerShell verwalten
Der einfachste Umgang mit den Anmeldezeiten für User im AD ist PowerShell. Damit kann man die einmalig gesetzten Zeiten eines Benutzers auslesen und auf andere Benutzer, Gruppen oder OUs übertragen.
Auslesen
Um die eingestellten Anmeldezeiten eines AD Benutzers auslesen zu können, verwendet man am Besten PowerShell. Denn oft möchte man die Informationen weiter verarbeiten.
$GetLogonhoursString = Get-aduser -Identity "hugo" -property logonhours | select -ExpandProperty logonhours write-host $GetLogonhoursString
In diesem Beispiel werden die Logonhours des Benutzers hugo ausgelesen. Hier hilft das Benutzer-Attribut logonhours
.
Als Ausgabe des PowerShell Scripts bekommt man eine Zahlenfolge. Beispiel:
255 255 255 255 223 255 255 255 255 63 248 255 255 255 255 255 255 251 255 255 127
Leserlich mit Wochentag und Uhrzeit ausgeben
Diese Darstellung ist leider schlecht leserlich. Viele User wünschen sich eine einfach Möglichkeit um die Wochentage und die erlaubte Uhrzeit anzeigen zu lassen. Durchaus ist das mit PowerShell möglich. Ein kleiner Umweg muss allerdings in Kauf genommen werden.
Zuerst müssen die Zeiten (bei einem Test-User) händisch gesetzt werden. Danach kann man die Zahlenfolge mit dem PowerShell Befehl (oben) auslesen. Hierzu sollte man sich aufschreiben, welche Beschreibung diese Zahlenfolge hat. Beispielweise Werktags von 06:00 – 19:00 Uhr.
Somit kann man ein PowerShell Script erstellen, welches die definierten Zeichenketten mit Beschreibung mit denen der User vergleicht. Gleicht die Zeichenkette von hugo der definierten des Scripts, so weiß man, dass eine Anmeldung beispielsweise IMMER erlaubt ist.
########## Anmeldezeiten "Templates" anlegen $logonNULL = "" $logonTest1 = "0 0 0 224 255 3 224 255 3 224 255 3 224 255 3 224 255 3 0 0 0" $logonTest2 = "255 255 255 255 223 255 255 255 255 63 248 255 255 255 255 255 255 251 255 255 127" $logonImmer = "255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255" ########## Alle Benutzer im AD auslesen und in $users speichern #Alle Benutzer in einer bestimmten OU #$users = Get-ADUser -SearchBase "ou=Test,ou=OurUsers,ou=Logins,dc=domain,dc=com" -Filter * #Alle Benutzer im AD #$users = Get-ADUser -Filter * #Bestimmten User $users = Get-aduser -Identity "hugo" #logonhpurs-Zahlenfolge ausgeben lassen #$GetLogonhoursString = Get-aduser -Identity "hugo" -property logonhours | select -ExpandProperty logonhours #write-host $GetLogonhoursString ########## Jeden Benutzer in der Liste durchlaufen... ForEach($user in $users) { #Von jedem Benutzer die "logonhours" in die Variable $hours speichern [string]$hours = get-aduser $user -property logonhours | select -ExpandProperty logonhours #Ausgabe "nichts konfiguriert" if ($hours -eq $logonNULL){ write-host $user "- Keine Anmeldezeiten konfiguriert"} #Ausgabe "Test1" if ($hours -eq $logonTest1){ write-host $user "- Werktags von 06:00 - 19:00 Uhr"} #Ausgabe "Test2" if ($hours -eq $logonTest2){ write-host $user "- Anmeldung nach Template 2"} #Ausgabe "Immer" if ($hours -eq $logonImmer){ write-host $user "- Anmeldung IMMER"} }
In Zeile 11-16 kann gewählt werden, ob alle Benutzer einer bestimmten OU, alle AD-User oder nur ein einzelner Benutzer ausgelesen werden soll.
Als Ausgabe des Scripts bekommt man dann nicht die dezimalen Zahlen, sondern eine Beschreibung des Wochentags und der Uhrzeit in Klartext.
Anmeldezeiten setzen und auf andere Benutzer übertragen
Das Setzen des Attributs logonhours
im Benutzerprofil kann mit folgendem PowerShell Code erfolgen:
# logon allowed: always [byte[]]$hoursALWAYS = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255) # set hours to user(s) Get-ADUser -Identity YOURUSERNAME | Set-ADUser -Replace @{logonhours = $hoursALWAYS}
In diesem Beispiel werden die Anmeldezeiten des Users so gesetzt, dass eine Anmeldung immer möglich ist. Das heißt an jedem Wochentag und zu jeder Uhrzeit.
Je nach Bedarf kann man die AD-User auslesen und dann den PowerShell Befehl auf folgendes anwenden:
- Gruppen
- OUs (Organisationseinheiten)
- einzelne Benutzer
- alle AD User
Ein Beispiel für das Setzen von Logon Hours auf alle Benutzer einer OU:
# User einer OU auslesen $users = Get-ADUser -SearchBase "ou=Test,ou=OurUsers,ou=Logins,dc=domain,dc=com" -Filter * # logon allowed: always [byte[]]$hoursALWAYS = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255) # jedem User die "neuen" Anmeldezeiten zuweisen ForEach ($user in $users) { Get-ADUser -Identity $user | Set-ADUser -Replace @{logonhours = $hoursALWAYS} }