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 😉

Posted in: Windows server

Výpis obnovovacího klíče Bitlocker z AD

Dnešní krátký kód vypíše z AD obnovovací klíč Bitlockeru, pokud je uložen v AD bez toho, aby na daném řadiči byly instalovány nástroje pro práci s Bitlockerem.

Import-module ActiveDirectory
$ADComputer = Read-Host -Prompt "Zadej jméno počítače"
$DN = Get-ADComputer $ADComputer | Select-Object -ExpandProperty DistinguishedName
$ADobj = get-adobject -Filter {objectclass -eq 'msFVE-RecoveryInformation'} -SearchBase $DN -Properties 'msFVE-RecoveryPassword' | Select-Object Name,msFVE-RecoveryPassword
[Ordered]@{
    Computer = $ADComputer
    RecoveryPassword = $ADobj.'msFVE-RecoveryPassword'
    Date = Get-Date -Date ($ADobj.Name ).Split('{')[0]
    BitlocerKeyID = (($ADobj.Name ).Split('{')[1]).TrimEnd('}')
} 
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Oprava opakovaného vyžádání obnovovacího klíče Bitlocker

Dnes jen malá poznámka o problému, se kterým se setkávám a to je, když nástroj Bitlocker si vyžádá kód pro obnovení i po správně zadaném hesle. Nejčastěji je na vině aktualizace, BIOS bez pozastavené ochrany, ale někdy i ovladačů nebo pouze systému. Níže představím rychlé řešení, které lze aplikovat z běžícího systému, nebo z WinPE po odemčení jednotky, viz starší článek.

Začne řešením pro případ, že jednotka se odemyká automaticky pomocí TPM.

manage-bde -protectors -delete C: -Type TPM
manage-bde -protectors -add c: -tpm

Případ, kdy kombinujeme TPM a PIN je obdobný, příkazy níže:

manage-bde -protectors -delete C: -Type TPMAndPIN
manage-bde -protectors -add c: -TPMAndPIN

Byť to nemusí být nezbytné, doporučuji po této operaci znovu zálohovat klíč pro obnovu. Jak tomuto stavu předcházet? Na 100% to nelze, ale nejčastěji je na vině aktualizace BIOS, proto před jejím započetím doporučuji Bitlocker pozastavit a po jejím dokončení opět obnovit ochranu.

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Řešení problému bootrec /fixboot access deny

Tento problém nastává v případě, že je potřeba opravit boot záznamy systému pro UEFI. Tento problém se týká oddílu EFI na disku využívající strukturu GPT. Podotýkám, že zde uvedený postup je až posledním řešením, často stačí příkaz chkdsk, ale pokud je potřeba provést bootre /fixboot a chybu nejde ignorovat, jde o opakovanou opravu bootu, jak jej můžete zkusit. V příkazové řádce WinRE prostředí postupujeme následovně:

  1. diskpart
  2. list vol
  3. sel vol <číslo jednotky UEFI>
  4. assign letter U
  5. exit
  6. cd /d U:\
  7. format U: /FS: FAT32
  8. bcdboot c:\windows /s U: /f UEFI
  9. cd /d u:\EFI\Microsoft\Boot\
  10. bootrec /fixboot

Často stačí skončit krokem 8, protože z adresáře systému Windows jsou do UEFI oddílu nahrány zcela nové Bootovací soubory. Když to nezabere, dokončíme všech 10 kroků.

Posted in: Windows 10, Windows 11, Windows server

Odebrání serverů ze Server management konzole

Tento článek se týká Windows Serverů (verze 2012 a novější) instalované s GUI a klientských systémů Windows s instalovaným RSAT.

Konzole sama obsahuje možnost přidat servery a vytvořit skupiny serverů, do nichž je možné servery přidávat. Bohužel zde chybí možnost z této praktické konzole servery odebrat, což se ve spoustě případů může hodit. Postup odebrání je tedy následovný:

  1. příkaz: cd %userprofile%\AppData\Roaming\Microsoft\Windows\ServerManager
  2. Otevřít (k editaci, třeba Notapadem): ServerList.xml
  3. Smazat XML záznam pro server, který chceme odstranit
  4. Uložit
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Obnova Windows z Windows.old

Vrátit se k předešlé verzi systému po jeho upgrade je možné poměrně jednoduše v případě klientských Windows pomocí nastavení.

Alternativou k tomu grafickému postupu je pak příkaz:

DISM /Online /Initiate-OSUninstall /Quiet

Oba výše zmíněné postupy platí pro Windows 10 verze 2004 a novější i pro Windows 11, ale jak postupovat u Windows 8 a starších, nebo u serverových systémů?

Ruční obnova systému z Windows.old

Pro tento úkon je potřeba zařízení spustit z instalačního média systému Windows, nebo restartovat do WinRE prostředí. V případě instalačního média spustíme příkazovou řádku pomocí [Shift] + [F10], nebo pomocí volby opravit počítač, kde se nabídne prostředí WinRE. Text níže předpokládá, že i v tomto prostředí má systémový oddíl písmeno C, ověřit to můžeme nástrojem diskpart.

Začneme odstraněním adresářů nového systému (složku C:\users mažeme jen tehdy, když bylo upgradováno BEZ zachování uživatelských souborů). K mazání používáme následující sadu příkazů:

rmdir /s /q "c:\PerfLogs"
rmdir /s /q "c:\Program Files"
rmdir /s /q "c:\Program Files (x86)"
rmdir /s /q "c:\Windows"
rmdir /s /q "c:\ProgramData"
rmdir /s /q "c:\Users"

Nyní nastal čas na to, abychom přesunuli původní (v příkladu x64) systém na disk C.

move /y c:\Windows.old\Windows c:\
move /y "c:\Windows.old\Program Files" c:\
move /y "c:\Windows.old\Program Files (x86)" c:\
move /y c:\Windows.old\ProgramData c:\
move /y c:\Windows.old\Users c:\
move /y "c:\Windows.old\Documents and Settings" c:\
xcopy c:\Windows.old c: /s /e /h

V tuto chvíli máme sice na disku C vybalený zpět původní systém, ale nešlo by z něj nastartovat. Musíme ještě opravit Boot.

Oprava Boot pro UEFI

Pomocí následujících příkazů nalezneme oddíl UEFI a přidělíme mu písmeno:

diskpart
list vol

Nyní najdeme UEFI oddíl, jeho velikost je cca 100 MB a využívá formát FAT32. Jeho číslo budeme potřebovat dále.

sel vol <number of volume>
assign letter=U:
exit

Nyní již můžeme k vlastní konfiguraci Bootu pro UEFI.

cd /d U:\EFI\Microsoft\Boot\
bootrec /FixBoot
ren BCD BCD.old
bcdboot c:\Windows /s U: UEFI

Pokud nemáte systémový oddíl jako C, doplňte místo C do posledního příkazu písmeno vašeho systémového oddílu. Pokud příkaz „bootrec /FixBoot“ skončí chybou, chybu ignorujte a pokračujte v příkazech dále. Nyní můžeme restartovat systém.

Oprava Boot pro BIOS (MBR spouštění systému)

Oprava boot pro systémy, které využívají MBR (tedy BIOS) je jednoduší, stačí následující příkazy:

bootrec /fixmbr
bootrec /fixboot
bootrec /rebuildbcd

Máme hotovo, můžeme resetovat systém.

Oprava Boot pro Windows to Go

Pomocí následujících příkazů nalezneme oddíl UEFI a přidělíme mu písmeno:

diskpart
list vol

Nyní najdeme UEFI oddíl, jeho velikost je cca 100 MB a využívá formát FAT32. Jeho číslo budeme potřebovat dále.

sel vol <number of volume>
assign letter=U:
exit

Nyní již můžeme k vlastní konfiguraci Bootu pro UEFI.

cd /d U:\EFI\Microsoft\Boot\
bootrec /FixBoot
ren BCD BCD.old
bcdboot c:\Windows /s C: All

Pokud nemáte systémový oddíl jako C, doplňte místo C do posledního příkazu písmeno vašeho systémového oddílu. Pokud příkaz „bootrec /FixBoot“ skončí chybou, chybu ignorujte a pokračujte v příkazech dále. Nyní můžeme restartovat systém.

Dokončení

Může se stát, že systém se nespustí na přihlašovací obrazovku, ale do prostředí WinRE, v tom případě se i na serverových systémech objeví možnost Oprava spouštění systému (níže ilustrační obrázek z Windows 10).

Toto již většinou bez problémů projde a systém se automatizovaně doopraví a spustí. Po přihlášení se nejspíš zobrazí chyba, že koš systémové jednotky je poškozen a je potřeba jej vysypat, zde zadejte NE. Nyní doporučuji zkontrolovat NTFS a systémové soubory pomocí sady následujících příkazů:

sfc /scannow
dism /online /cleanup-image /scanhealth
dism /online /cleanup-image /restorehealth
echo y | chkdsk c: /f
shutdown /g /t 0 /f

Při restartu dojde ke kontrole systémové jednotky C, doporučuji nechat proběhnout! Po dokončení a přihlášení je možné hlášku poškození koše potvrdit ANO pokud se ještě zobrazí. Dle mé zkušenosti se při tomto postupu u serverových systémů ztratí veškerý obsah ze start menu, což je opravdu nepříjemné, ale dobrou zprávou je, že aplikace jsou v systému a fungují.

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Odebrání zbytkového ovladače

Na odebrání ovladačů, které systém již nepotřebuje je spousta cest. Nejlepší je samozřejmě odebrat ovladač při odinstalaci zařízení ve Správci zařízení.

Někdy se může stát, že zařízení obsahuje mnoho ovladačů, které nikdy nevyužilo (např.: jednotný image pro mnoho typů počítačů s integrovanými ovladači). V takovém případě je možné nepotřebné ovladače odebrat pomocí cleanmager.exe (vyčištění disku), který spustíme jako správce, pak máme na výběr odebrání ovladačů.

Vše výše popsáno je zcela bezpečné a stabilní, takto provedená operace je bez rizika. Problém je v tom, že i některý SW implementuje ovladače (typicky bezpečnostní produkty) a může se stát, že i po odinstalaci takového produktu zůstanou v systému fragmenty, třeba i ovladače. V takovém případě doporučuji na webu vydavatele najít odinstalační nástroj a pokyny k jeho užití, pomocí jehož je možné tyto fragmenty odebrat. Systém sám obsahuje nástroje k nalezení a odebrání ovladačů. Doporučení je, tyto akce provádět v Safe modu systému.

Nalezení a odebrání ovladače z běžícího systému

Zde nám v první řadě pomůže nástroj DISM, který nám vypíše ovladače jež nejsou z dílen Microsoftu. Stačí následující příkaz.

dism /online /get-drivers /format:table

Výstup je vidět na obrázku níže.

Na výpisu výše je vidět, že v systému je takovým fragmentem ovladač Esetu edevmon, který je provozován stejnojmennou službou. Další postup si ukážeme právě na příkladu tohoto ovladače. V tomto bodě si potřebujeme bokem uložit original file name, bude potřeba později. K odebrání ovladače použijeme vestavěný nástroj pnputil pomocí následujícího příkazu (v PowerShellu):

#pnputil /delete-driver < Published Name>  /force
#příklad Esetu:
pnputil /delete-driver oem10.inf  /force

Pokud se příkaz zdaří, je ovladač odebrán ze systému. Zde bych doporučil restartovat systém, aby se projevila změna. Pokud vše proběhne v pořádku, ověříme si výpisem DISM (první bod), že systém neprováděl opravu spuštěním s poslední funkční konfigurací. Nyní můžeme odebrat vlastní binární soubor ovladače pomocí PowerShellu.

#Remove-Item -Path C:\Windows\System32\drivers \<original file name>.sys -Force
#Příklad s Esetem
Remove-Item -Path C:\Windows\System32\drivers edevmon.sys -Force

Pokud příkaz skončí chybou, znamená to, že systém soubor odstranil sám, pokud ne, odstranění provedl příkaz.

Offline odebrání ovladače

Zde jsou 2 důvody, potřebujeme upravit soubor install.wim, nebo po instalaci ovladače systém nenastartoval. V obou případech použijeme nástroj DISM, v prvním pomocí něj vybalíme instalační obraz do složky, v druhém budeme tento nástroj spouštět z příkazové řádky ve WinRE, či instalačním médiu.

Načtení seznamu ovladačů je obdobné jako u běžícího systému:

#Instalační obraz máme ve vybalený ve složce C:\test\offline
Dism /Image:C:\test\offline /Get-Drivers

Nyní můžeme odebírat ovladače

Dism /Image:C:\test\offline /Remove-Driver /Driver:OEM10.inf

Po úspěšném dokončení operace v případě úpravy instalačního obrazu vše uložíme příkazem:

Dism /Unmount-Image /MountDir:C:\test\offline /Commit

V případě opravy systému, kterou provádíme z prostředí WinRE nebo instalačního média počítač restartujeme do plnohodnotného systému.

Posted in: Windows 10, Windows 11, Windows server

Stažení databáze hesel Have i been pwned

Správci systémů někdy potřebují databáze uniklých přihlašovacích údajů k tomu, aby zjistili, zda někdo z jejich uživatelů nepoužívá kompromitované přístupové údaje. Krom různých fór útočníků a pentesterů je jedním z dobrých zdrojů služba Have i been pwned. Dříve se přímo ze stránek této služby nechala stáhnout databáze s uniklými hesly ve formátu NTLM pro kontrolu těchto údajů v AD. Jedním z nástrojů, které umí tyto údaje kontrolovat je DSInternals. Nově web Have i been pwned má aplikaci pro stahování databáze hesel a o tom je tento příspěvek.

Stažená

Pro stažení a samotnou práci s aplikací je potřeba mít .NET6, jak jej instalovat jsem již psal. Pro instalaci downloaderu pak může sloužit např. příkaz:

dotnet tool install haveibeenpwned-downloader --tool-path "C:\Program Files\NET6\Tools"

Stažení databáze hesel ve formátu NTLM

Vlastní stažení databáze do složky aplikace je pak v PowerShellu velice jednoduché, jak ukazuje příklad níže.

#Přepneme se do adresáře aplikace
cd C:\Program Files\NET6\Tools
#Stáhneme hesla
.\haveibeenpwned-downloader.exe -n pwnedpasswords_ntlm
Posted in: Windows server

Nastavení DHCP pro PXE Boot Windows Deployment Services na BIOS i UEFI

Dnes to bude o tom, jak nastavit DHCP na Windows serveru tak, aby poskytlo v DHCP možnosti 67 validně pro BIOS i UEFI. Ve výchozím stavu se v návodech na konfiguraci WDS dočtete, že DHCP možnosti 67 má být uvedeno „boot\x64\wdsnbp.com“, což je možnost pro BIOS a legacy boot. Jak ale nastavit podmíněně možnost 67? Odpovědí je použít DHCP politiky, ale nejdříve musíme detekovat, zda má zařízení UEFI, nebo BIOS.

Detekce UEFI a BIOS

Řešením je rozšířit Vendor Classes z výchozích Windows 98 option, Windows 2000 option a Microsoft option o detekci architektury. Nejsnazší to bude pomocí PowerShellu:

Add-DhcpServerv4Class -Name "PXEClient (UEFI x64)" -Type Vendor -Data "PXEClient:Arch:00007"
Add-DhcpServerv4Class -Name "PXEClient (UEFI x86)" -Type Vendor -Data "PXEClient:Arch:00006"
Add-DhcpServerv4Class -Name "PXEClient (BIOS x86 & x64)" -Type Vendor -Data "PXEClient:Arch:00000"

Alternativně můžeme využít postup zachycený na snímcích níže.

Do dat v ASCII zapíšete postupně hodnoty z PowerShellových příkazů výše (co příkaz, to jedna hodnota Vendo Classes). Tím jsme dosáhli toho, že DHCP ví, zda o IP žádá BIOS nebo UEFI.

Konfigurace DHCP možnosti 67

Nyní již k tvorbě politiky, která nastaví spouštěcí soubor PXE boot. Nejprve všechno v PowerShellu (V příkazech je nutné nastavit ScopeId dle IP rozsahu, který obsluhuje naše DHCP):

Add-DhcpServerv4Policy -Name "PXEClient (UEFI x64)" -ScopeId 10.10.10.0 -Condition OR -VendorClass EQ,"PXEClient (UEFI x64)*"
Add-DhcpServerv4Policy -Name "PXEClient (UEFI x86)" -ScopeId 10.10.10.0 -Condition OR -VendorClass EQ,"PXEClient (UEFI x86)*"
Add-DhcpServerv4Policy -Name "PXEClient (BIOS x86 & x64)" -ScopeId 10.10.10.0 -Condition OR -VendorClass EQ,"PXEClient (BIOS x86 & x64)*"

Set-DhcpServerv4OptionValue -ScopeId 10.10.10.0 -PolicyName "PXEClient (UEFI x64)" -OptionId 067 -Value "boot\x64\wdsmgfw.efi"
Set-DhcpServerv4OptionValue -ScopeId 10.10.10.0 -PolicyName "PXEClient (UEFI x86)" -OptionId 067 -Value "boot\x86\wdsmgfw.efi"
Set-DhcpServerv4OptionValue -ScopeId 10.10.10.0 -PolicyName "PXEClient (BIOS x86 & x64)" -OptionId 067 -Value "boot\x64\wdsnbp.com"

Tentokát nebudu přidávat textový popis a snímky obrazovky, místo toho jsem našel pěkné video i s vysvětlením a angličtině, takže vkládám níže.

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Výpis oprávnění ke všem SMB share na serveru

Dnes si ukážeme malý kus PowerShellu, který velice usnadní auditování oprávnění na sdílených složkách. Jako první si uvedeme příklad kódu, který vypíše všechny složky, kde je nějak nastaveno oprávnění pro úroveň Everyone:

$SMB = (Get-SMBShare).Name
foreach($n in $SMB)
{
    Get-SmbShareAccess -Name "$n" | where AccountName -EQ Everyone
    
} 

Kompletní výpis pak poskytne odlehčená verze kódu:

$SMB = (Get-SMBShare).Name
foreach($n in $SMB)
{
   Get-SmbShare -Name "$n"   
   Get-SmbShareAccess -Name "$n"   
} 

Bližší informace, jako je cesta a server vkládá do výpisu s oprávněními právě příkaz Get-SmbShare, který lze volat i samostatně k vypsání informací o všech sdílených složkách (bez parametrů) krom oprávnění.

Back to Top