Dnes se chci podělit o to, jak pomocí PwerShellu hromadně přenastavit, nebo vypnout přihlašovací hodny, tedy omezení, kdy se daný uživatel může v síti hlásit. Tato nastavení není v AD žádnou novinkou a důvody nastavení mohou být buď politické (požadavek vedení), nebo bezpečnostní, protože v době, kdy se uživatel nemůže hlásit, nemůže ani spouštět plánované akce a nelze jeho účet zablokovat pomocí chybného zadávání hesla. Toto nastavení by se nemělo za žádných okolností zadávat administrátorským účtům a BFÚ (obyčejným) účtům administrátorů, aby bylo možné kdykoliv reagovat na jakoukoliv situaci.
Pokud je firma s jednosměnným provozem, tak dává smysl, aby všechny zaměstnanecké (nikoliv adminské a servisní) účty byly uzamčené přes noc a pokud firma běžně pracuje od pondělí do pátku, tak také přes víkend. Toto nastavení pomůže snížit riziko kybernetického útoku, protože útočníci se snaží firmy napadat v době, kdy na ně interní IT nebude reagovat. Ve školním prostředí pak dává smysl omezit všem žákům možnost přihlášení na dobu od 7 do 16 hodin (možná 17 hodin), čímž nemusím jako admin řešit, kdo má nultou hodinu a kdo odpoledku.
Jak na to hromadně?
Začneme tím nejjednodušším a to je návrat k výchozímu stavu, tedy přihlášení povolení 24/7 všem uživatelům. Na to nám stačí jednoduchý příkaz:
#Nastavíme proměnou hours na 25/7
[byte[]]$hours = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255)
Get-ADUser -Filter * | Set-ADUser -Replace @{logonhours = $hours}
Jak vyresetovat jen konkrétní OU ukáže následující příklad na OU žáci:
#Nastavíme proměnou hours na 25/7
[byte[]]$hours = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255)
Get-ADUser -SearchBase "OU=Zaci,OU=Uzivatele,OU=Skola,DC=skola,DC=local" -Filter * | Set-ADUser -Replace @{logonhours = $hours}
Jak nastavit pro všechny žáky povolení přihlášení jen v pracovní dny od 7 do 16?
[byte[]]$hours = @(000,000,000,192,127,000,192,127,000,192,127,000,192,127,000,192,127,000,000,000,000)
Get-ADUser -SearchBase "OU=Zaci,OU=Uzivatele,OU=Skola,DC=skola,DC=local" -Filter * | Set-ADUser -Replace @{logonhours = $hours}
Kde vzít ono bytové pole? To je dobrá otázka, která má ve skutečnosti jednoduchou odpověď. Otevřeme si libovolného uživatele a v GUI mu nastavíme přihlašovací hodiny dle libosti, např. takto:

Když vše potvrdíme a uložíme, otevřeme znovu uživatele a podíváme do editoru atributů na atribut logonhours, který dvojklikem otevřeme a necháme si jej zobrazit dekadicky, binární příklad přidávám níže:

Tento výpis, v dekadické podobě, zkopírujeme do proměnné $hours v příkazech výše, čímž dojedeme k tomu, že dle tohoto uživatele můžeme nastavit celé OU nebo celou doménu. A proč jsem vložil binární příklad? Protože si vysvětlíme, jak to funguje.
- 1 bit = 1 hodina
- 3 byty (3x 8 bit) = 1 den
- 168 bit = jeden týden
První 3 byty jsou neděle, druhé 3 byty pondělí atd. Nyní je rovněž jasné, jak vše spočítat a do příakzů výše zadávat rovnou vypočtené hodnoty 😉