4

Logon Hours / Anmeldezeiten setzen und auslesen

In Active Directory Umgebungen gibt es für jeden Benutzer so genannte Logon Hours. Diese legen die Anmeldezeiten fest, in denen sich der Benutzer anmelden kann. Will sich der AD-User außerhalb des Zeitraums anmelden, wird dies blockiert. Da solche Active Directory Umgebungen oft mehrere hundert oder tausend Benutzer-Objekte haben kann, kann man diese Logon Hours per PowerShell Script setzen.

Logon Hours im ActiveDirectory (AD) definieren

Die Logon Hours werden als Zahlenfolge angegeben

Die Anmeldezeiten im AD können nicht als Wochentag und Uhrzeit eingetragen werden, sondern werden als Zahlenfolge abgespeichert. Genauer gesagt ist dies eine Zahlenfolge ein Object[] vom Typ String.Array in PowerShell.

  • Sind keine Zeiten konfiguriert, so lautet der Inhalt $NULL
  • Darf sich der Benutzer IMMER anmelden, so lautet die Zahlenfolge
    "255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255"
  • Darf sich der Benutzer NIE anmelden, so lautet der Code
    "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"

Aufgebaut ist die Zahlenfolge in 21 Blöcke.

255,255,255, #Sun, 6pm Vortag bis 6pm heute
255,255,255, #Mon
255,255,255, #Tue
255,255,255, #Wed
255,255,255, #Thu
255,255,255, #Fri
255,255,255 #Sat

3 Blöcke bilden einen Tag ab

  • Block1: 18:00 Uhr – 02:00 Uhr
  • Block2: 02:00 Uhr – 10:00 Uhr
  • Block3: 10:00 Uhr – 18:00 Uhr
Anmeldezeiten String im AD (Active Directory)

Logon Hours per PowerShell setzen

Wie oben schon genannt, ist die einfachste Methode die Anmeldezeiten eines Benutzers zu setzen PowerShell. Denn mit PowerShell kann man sehr schnell die Zeiten für die erlaubte Anmeldung setzen.

Möchte man beispielsweise die Anmeldung komplett verhindern, so kann man die Werte auf „0“ setzen. Somit ist die Anmeldung zu jedem Wochentag und zu jeder Uhrzeit untersagt.

$name = "yourusername"
[byte[]]$hours = @(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
Get-ADUser -Identity $name | Set-ADUser -Replace @{logonhours = $hours}

Andersrum ist es natürlich möglich ALLE Zeiten und Wochentage zu erlauben. Hierzu setzt man die Zahlenfolge jeweils auf ihren Maximal-Wert 255. Somit ist eine Anmeldung durchgehend erlaubt.

$name = "yourusername"
[byte[]]$hours = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2 55,255)
Get-ADUser -Identity $name | Set-ADUser -Replace @{logonhours = $hours}

Diese zwei Beispiele waren jeweils für einen einzelnen Benutzer. Doch in großen AD-Umgebungen möchte man diese Einstellungen für viele, beziehungsweise mehrere Benutzer einstellen. Auch hier hilft PowerShell, in dem wir mit Get-ADUser die Benutzer auslesen lassen. Hier haben wir auch wieder viele Möglichkeiten.

Zum einen können wir die AD User anhand ihrer OU (Organisationseinheit) auslesen lassen. Der Befehl hierzu ist ganz einfach:

[byte[]]$hours = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2 55,255)
Get-ADUser –Filter * -SearchBase "OU=Users,OU=yourou,OU=yourou,DC=domain,DC=com"| Set-ADUser -Replace @{logonhours = $hours}

Außerdem hat man die Möglichkeit nur Benutzer einer bestimmten AD-Gruppe die Logon Hours zuweisen zu lassen. Auch hier lässt man alle AD-Benutzer auslesen, jedoch mit dem Befehl Get-ADGroupMember.

[byte[]]$hours = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2 55,255)
Get-ADGroupMember -Identity "YOURGROUP" | Set-ADUser -Replace @{logonhours = $hours}

Wie bekommt man die Zahlenfolge der individuellen Anmeldezeiten?

Natürlich ist es sicht unmöglich, aber trotzdem sehr kompliziert die passenden Anmeldezeiten in der Zahlenfolge manuell zu hinterlegen. Deswegen die Frage, wie man die Logon-Hours an schnellsten generieren lassen kann.

Die einfachste Variante ist ein Benuterobjekt im AD zu öffnen, und sich die passenden Zeiten zu konfigurieren. Danach müssen die Einstellungen natürlich gespeichert werden. Es gibt zwei Wege um die Stunden und Wochentage nun zu ermitteln. Ein kleines PowerShell Script ist die einfachste Variante. Mit folgendem Befehl wird einem die Zahlenfolge für die Anmeldezeiten ausgegeben:

$GetLogonhoursString = Get-aduser -Identity "YOURUSERNAME" -property logonhours | select -ExpandProperty logonhours
write-host $GetLogonhoursString

Wer mit PowerShell nicht so fit ist, kann auch das Benutzer-Objekt öffnen und in den Attribut-Editor gehen. Hier findet sich das Attribut „logonHours“, welches den gewünschten Wert beinhaltet.

Konfigurierte Logon Hours auslesen

Die konfigurierten Anmeldezeiten kann man auch auslesen. Hierzu findet man unzählige Beiträge im Internet, die nicht wirklich zufriedenstellend sind. Das große Problem ist hier, dass PowerShell oder andere Tools nie die Logon-Hours in Wochentagen und Uhrzeiten ausgeben werden. Warum? Man konfiguriert eine Zahlenfolge, und trägt nirgends eine Uhrzeit ein. Deswegen ist es extrem schwer, die Anmeldezeiten lesbar oder dekodiert ausgeben zu lassen. Mit einem PowerShell Script kann man trotzdem eine lesbare Variante ausgeben lassen.

Mit meinem PowerShell Script gibt man so genannte Templates im Header an. Wenn nun eine konfigurierte Anmeldezeit als Zahlenfolge mit einem Template übereinstimmt, wird ein String ausgegeben.

########## 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 17 wird nur der Benutzername „hugo“ aus dem AD ausgelesen. (Die anderen Möglichkeiten für mehr Benutzer sind auskommentiert, funktionieren aber – Zeile 13 und 15).

Da die Zeichenfolge von Benutzer „hugo“ auf die Variable  $logonTest1 zutrifft, wird in Zeile 38 die passende Zeit ausgegeben.

Anmeldezeiten (Logon Hours) auslesen mit PowerShell

Ich hoffe ich konnte euch zu dem „komplizierten“ Problem mit den Anmeldezeiten im AD und PowerShell weiterhelfen.

Johannes Huber
 

In seiner Freizeit macht Johannes nichts lieber, als für ITnator Beiträge zu schreiben. Input bekommt er hierfür von Problemen in der IT Administration von Servern, Clients und vielen weiteren IT Komponenten.

Click Here to Leave a Comment Below 4 comments