Posted in: Windows server

Přihlašovací hodiny

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 😉

Back to Top