Posted in: Windows server

Instalace msu pomocí GPO

Každý správce někdy potřeboval nainstalovat nějaký konkrétní balíček z Windows update katalogu, nebo uspíšit distribuci nějaké konkrétní aktualizace. Jasně, máme zde Windows server update services nebo také řešení antivirových programů, která nám hlídají aktualizace Windows a umí je nainstalovat. I tak někdy nastane potřeba práce s konkrétním msu balíčkem a o tom si dnes něco povíme. Jako první si potřebujeme připravit skript, který danou instalaci provede. S velkou výhodou je možné využít PowerShell, který dokáže zjisti zda se na daném zařízení nachází daný balíček a také, která verze desítek na daném stroji běží. Ideálně máme v síti pouze jeden build Windows 10, ale reálně víme, že z libovolných důvodů se nám to časem rozejde na dvojici podporovaných verzí. msu balíček tedy musíme vždy stáhnout pro každou verzi desítek samostatně na daný stroj instalovat správnou verzi balíčku. Příklad níže instaluje aktualizaci KB5001649 na stroje s Windows 10 verze 20H1 a 20H2.

$Win2004 = "\\192.168.1.194\Win10Stup\Packages\Update\kb5001649-x64_2004.msu"
$Win20H2 = "\\192.168.1.194\Win10Stup\Packages\Update\kb5001649-x64_20H2.msu"
$OS = (Get-ComputerInfo -Property "OsBuildNumber").OsBuildNumber
if (-not(Get-Hotfix -Id KB5001649)) {
    if($OS -eq 19041)
    {
        Start-Process -FilePath "wusa.exe" -ArgumentList "$Win2004 /quiet /norestart" -Wait
    }else
    {
        Start-Process -FilePath "wusa.exe" -ArgumentList "$Win20H2 /quiet /norestart" -Wait
    }
}
exit

Nyní máme napsaný PowerShell, který uložíme. Následně si můžeme vytvořit vlastní GPO. V editaci politiky si otevřeme Computer Configuration/Policies/Windows Settings/Scripts
The Startup Script of a Computer GPO.
Dvojklikem otevřeme možnost startup a přejdeme na záložku PowerShell Scripts
Setting the Startup PowerShell Scripts
Klikene n a Show Files a do otevřeného okna přesuneme náš skript.
GPO Folder containing script
Zavřeme složku a v dialogu Startup Properties na kartě PowerShell scripts zvolíme položku Add
V dialogovém okně vyplníme název skriptu, pokdu bychom chtěli spouštět jiný PowerShell skript, můžeme uvést také jeho parametry. Nyní již stačí pouze vše uzavřít pomocí tlačítek OK.
S další aktualizací politik si stroj při startu natáhne náš kript a provede jej.

Posted in: Windows 10, Windows 11, Windows server

PowerShell script pro monitoring záloh a obnovu ze zálohy

Write-Host „Práce se zálohou serveru“;
Write-Host „“;
Write-Host „Menu:“ -ForegroundColor Green;
$volba;
Write-Host „1: Aktuální stav běžící zálohy“;
Write-Host „2: Výpis dostupných záloh“;
Write-Host „3: Výpis položek obsažených v záloze“;
Write-Host „4: Obnova souborů a složek do původního umístění“;
Write-Host „5: Obnova souborů a složek do vlastního umístění“;
Write-Host „6: Obnova celé jednotky“;
Write-Host „7: Obnova registru“;
Write-Host „8: Obnova systémového stavu“;
$volba = Read-Host -Prompt „Zadejte číslo své volby“;
function status()
{
Write-Host „Vypisuji stav běžící zálohy“ -ForegroundColor Green;
wbadmin get status
Write-Host „Stav záloh za poseldní týden“ -ForegroundColor Green;
Get-WBJob -Previous 7
}
function dostupne()
{
$cil = Read-Host -Prompt „Zadej cíl zálohy (např.: H:): „;
Write-Host „Vypisuji dostupné zálohy“ -ForegroundColor Green;
wbadmin get versions -backupTarget:$cil
}
function polozky()
{
$ID = Read-Host -Prompt „Zadej ID zálohy (např.: 01/27/2021-15:01): „;
Write-Host „Vypisuji položky zálohy“ -ForegroundColor Green;
wbadmin get items -version:$ID;
}
function souboryP()
{
Write-Host „Obnova soborů a složek“ -ForegroundColor Green;
$slozka = Read-Host -Prompt „Obnovuješ složku? (A/N): „;
$ID = Read-Host -Prompt „Zadej ID zálohy (např.: 01/27/2021-15:01): „;
$polozka = Read-Host -Prompt „Zadej položku k obnově (např.: E\Fotoalbum\MTZ)“;
if($slozka -eq „A“ -or $slozka -eq „a“)
{
wbadmin start recovery -version:$ID -itemType:File -items:$polozka -recursive;
}
else
{
wbadmin start recovery -version:$ID -itemType:File -items:$polozka;
}
}
function souboryS()
{
Write-Host „Obnova soborů a složek“ -ForegroundColor Green;
$slozka = Read-Host -Prompt „Obnovuješ složku? (A/N): „;
$ID = Read-Host -Prompt „Zadej ID zálohy (např.: 01/27/2021-15:01): „;
$polozka = Read-Host -Prompt „Zadej položku k obnově (např.: E\Fotoalbum\MTZ)“;
$cil = Read-Host -Prompt „Zadej cíl obnovy (např.: H\Foto\mtz)“
if($slozka -eq „A“ -or $slozka -eq „a“)
{
wbadmin start recovery -version:$ID -itemType:File -items:$polozka -recursive -recoverytarget:$cil;
}
else
{
wbadmin start recovery -version:$ID -itemType:File -items:$polozka -recoverytarget:$cil;
}
}
function jednotka()
{
Write-Host „Obnova jednotky“ -ForegroundColor Green;
$ID = Read-Host -Prompt „Zadej ID zálohy (např.: 01/27/2021-15:01): „;
$jednotka = Read-Host -Prompt „Zadej identifikátor jednotky (např.: \\?\Volume{cc566d14-44a0-11d9-9d93-806e6f6e6963}\“
wbadmin start recovery -version:$ID -itemType:Volume -items:$jednotka;
}
function registr()
{
Write-Host „Obnova registru přibyde v novější verzi“ -ForegroundColor red;
}
function system()
{
Write-Host „Obnova stavu systému“ -ForegroundColor Green;
$ID = Read-Host -Prompt „Zadej ID zálohy (např.: 01/27/2021-15:01): „;
wbadmin start systemstaterecovery -version:$ID;
}
switch($volba)
{
1{status}
2{dostupne}
3{polozky}
4{souboryP}
5{souboryS}
6{jednotka}
7{registr}
8{system}
default{Write-Host „Chybně zadaná volba, spusť skript znovu!“-ForegroundColor Red}
}

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server, Základy PowerShellu

Kontrola spuštění PoweShellu v řežimu správce

Při správě serverů není nic vzácného, že PowerShell je potřeba spustit v privilegovaném módu. Určitě všichni správci znají fintu pravého tlačítka na skript a volby Run with PowerShell, ale jak ve sktirptu zkontrolovat, zda byl spuštěn s oprávněním správce? Zkuste následující větvení, které místo pouhých výpisů rolí obohaťte o svůj kód.

if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
{"admin"}
else
{"user"}

Tento skript využívá toho, že účet správce má dva módy, jeden privilegovaný (obsahuje SID skupiuny Administrators) a jeden běžný (neobsahuje SID skupiny Administrators). Když i správce spustí aplikaci pouhým poklikáním, neběží v privilegovaném módu (až na vyjímky jako je Plánovač, Prohlížeč událostí apod.). Také PowerShell jde pustit v obou režimech a pokud výslovně správce nespustí PowerShell v řežimu správce, má stejná oprávnění jako běžný uživatel. Zobrazit jednotlivá oprávnění daného režimu PowerShellu jde příkazem:

whoami /priv

Více se pak dočtete v dokumentaci Microsoftru v sekci věnované uživatelským účtům.

Posted in: Windows server

Výpis PC, která si rok neměnila heslo

Jak všichni správci AD ví, i počítače dodržují ze zdvořilosti politiku na změnu hesla. Reálně by to ovšem dělat nemusely, protože heslo počítače má 128 míst, takže jeho prolomení se tím značně komplikuje. Vyjímaje doménových řadičů si ovšem počítače mění heslo v souladu s default domain policy.  Pokud si PC např. rok nezměnil heslo, patrně je vyřazený, nebo opravdu nebyl v dosahu AD. Následující skript vyhledá taková PC a dokáže je smazat, ale musíte si dát pozor na doménové řadiče.

$Date = ((Get-Date).AddDays(-365))
$DC2 = Read-host -promt "Zadejte druhý řád názvu domény: "
$DC1 = Read-host -promt "Zadejte první řád názvu domény: "
#Počítače s více jak ro neměněným heslem​
Get-ADComputer -Filter 'PasswordLastSet -le $Date' -SearchBase "CN=Computers,DC= $DC2,DC=$DC1" -Properties PasswordLastSet | where Enabled -eq $true | FT Name,PasswordLastSet ​
#zakáže PC s rok neměněnýn heslem​
$zakazat = 0​
$zakazat = Read-Host -Prompt "Pro zakázání všech vypsaných účtů zvolte zadejte 1 jinak 0: "​
if($zakazat -eq 1)​
{​
    Disable-ADAccount -Identity (Get-ADComputer -Filter 'PasswordLastSet -le $Date' -Properties PasswordLastSet | where Enabled -eq $true)​
    Write-Host "Počítače byly zakázány"​
}​
else​
{​
    Write-Host "Žádný úet nebyl zakázán"​
}
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Vyhledávání zařízení v Azure AD dle uživatele bez Intune

Všichni správici firemních sítí známe situaci, kdy potřebujeme vyhledat zařízení, které jsme vyloučili ze sítě, abychom jeho účat zakázali. Pokud máme souběžně, ať synchronizované, či ne, lokální AD a Azure AD, je vhodné vyřadit soukromá zařízení uživatele, který opustil firmu, nebo takové zařízení, které bylo uživatli zcizeno, či jej uživatel ztratil nebo nahradil. Následující skript řeší problém, který není řešitelní v Azure AD online konzoli, protože zatím (začátek června 2020) nelze podle vlastníka zařízení filtrovat. V článku poskytnutý skrit do dokáže a dokáže rovněž rovnou soukromá zařízení uživatele zakázat všechna jedním příkazem.
Pokud by jste chtěli takto zakázat např. firemní notebook, budete muset vynechat filtrování, které ze všech zařízení eliminuje právě ta, která jsou součástí našeho lokálního AD.

<#

	Skript vypíše jména všech nedoménových zařízení, která má zadaný uživatel registrovaná v Azure AD.

	Volitelně dokáže zakázat všechna zařízení, která má daný uživatel registrované a nejsou doménová.

	Autor nenese žádnou odpovědnost za případné škody, uživatel je povinen před spuštěním se seznámit se 
	skriptem!
 
    
	Požadavky:
    
	- PowerShell verze 5 a novější
    
	- Admin oprávnění pro přístup k Azure AD
    
	- ExcutionPolicy set to RemoteSigned
 
    

	Petrásek Jan
    
	©2020

#>
 

#kontrola přítomnosti modulu, jeho případná aktulizace či doinstalace

if((get-module -Name AzureAD) -eq $null) 
{

	Install-Module -Name AzureAD -force
   
	import-module AzureAD

}else
{

	if((get-module -Name AzureAD | select Version) -le 2.0.2.76)
    
	{

		Update-Module AzureAD

	}
    
	import-module AzureAD

}
 
#přihlášení k Azure AD a MSonline service

$Credential = Get-Credential
Connect-AzureAD -Credential 
$Credential
Connect-MsolService -Credential 
$Credential
#načtení vstupních inforamce

$domena = (Get-ADComputer -Filter * | select Name)

$PC = Read-Host -Prompt "Zadejte email uživatele: "

#nalezení zařízení registrovaných uživatelem

$zarizeni = Get-MsolDevice -RegisteredOwnerUpn $PC | select DisplayName

#vybrání pouze nedoménových zařízení

$zobraz

foreach($DisplayName in $zarizeni)

{

	foreach($Name in $domena)
    
	{

		if($DisplayName -ne $Name)
        
		{

			if($DisplayName -ne $zobraz)
            
			{

				$zobraz = $DisplayName
            
			}
        
		}
    
	}

}
#$zobraz | Format-Table - kontrolní zobrazení
 

#finální zobrazení informace o zařízeních

Get-MsolDevice -All | where DisplayName -like $zobraz.DisplayName | select DisplayName, DeviceObjectVersion, DeviceOsType, DeviceOsVersion, LastDirSyncTime
 

#možnost zařízení zakázat

$volba = 0

Write-Host 'Pro zakázání zařízení zadejte 1'

Write-Host 'Pro ponechání povoleného zařízení zadejte 0'

$volba = Read-Host -Prompt 'Chcete zařízení zakázat? (1/0): '

$zakaz = Get-MsolDevice -All | where DisplayName -like $zobraz.DisplayName | select DeviceId

if($volba -eq 1)

{

	foreach($DeviceId in $zakaz)
    
	{

		Disable-MsolDevice -DeviceId $zakaz.DeviceId -Force
    
	}
    Write-Host 'Zařízení byla zakázána'

}
else

{

	Write-Host 'Žádná změna na zařízeních nebyla provedena'

}
Posted in: Windows server

Vzdálená plocha pro adminy

Dnes si řekneme něco málo o vzdálené správě a bezpečnosti pro koncové stanice. Jak jsem již zmiňoval ve školení Instalace a konfigurace Windows serveru, je potřeba mít správně vydefinované Password zóny a používat pro správu uživatelských stanic různé administrátorské účty s různými hesly, které jsou ovšem z pohledu sítě obyčejnými uživateli. Těmto servisním účtům je asi žádoucí povolit RDP přístup, protože ne vše jde pohodlně řešit nástroji jako je Admin center. Pokud máme k dispozici Windows server 2012 a novější, je vhodné tyto servisní účty přidat do skupiny „Protected users“, čímž dojde k vynucení použití Kerberos autentizace uživatele. Nástroje typu Admin center nebo systém center, případně Eset Remote Administrator by měly tvořit hlavní pracovní nástroj každého admina, resp. pracovníka technické podpory.

Nyní se malinko vraťme ke vzdálené ploše, neboli RDP. Jak jsem již zmínil na školení Instalace a konfigurace Windows serveru, RDP budí dojem většího zabezpečení, nežli které reálně poskytuje. Když se podíváte na lištu RDP po připojení k cílovému počítači, je vidět zámeček a v bublinové nápovědě se dozvíte, že spojení bylo ověřeno Kerberos protokolem. Nicméně to není tak zcela pravda. Kerberos protokol byl použit v rámci preautentizace při navázání spojení, zde to pravdou je, ale vaše uživatelské údaje byly odeslány na cílový počítač v plné formě (i heslo bylo v plné formě). S ohledem na to, že vlastní síťové spojení je zabezpečeno s užitím Kerberosu, tak zde problém není, ale problém nastává ve chvíli, kdy je napaden cílový počítač, nebo kdy se k němu dostane jeho lokální admin s potřebnými nástroji. Na cílovém počítači jsou po dobu trvání připojení uloženy login a NTHash (případně Kerberos klíče) v paměti procesu LSASS.exe, odkud je možné je získat. Paměť tohoto procesu může být na Windows 10 odstíněna pomocí virtualizace při nakonfigurování Virtual Secure Mode, případně je možné zvýšit její ochranu vynucením digitálního podpisu Microsoftu na všechen kód, který se snaží do paměti procesu LSASS.exe přistoupit (od Windows 8.1). Dobrým typem je, aby si pracovníci technické podpory využívající servisní účty a přístup pomocí RDP na koncové stanice nepouštěli RDP skrze zástupce ve startu, ale aby si vytvořili cmd soubor s následujícím obsahem:

mstsc /admin

Tento příkaz vynutí speciální autentizaci při připojení, kdy se na cílový PC neuloží hash hesla ani Kerberos klíče. Tato možnost je opět dostupná od Windows 8.1 v doménovém prostředí. Nevýhodou takto navázaného spojení je, že není možné přistupovat na síťové prostředky bez zadání uživatelských údajů, jejichž zadáním dojde ke ztrátě bezpečnosti pro kterou jsme se připojili zrovna takto. Na druhou stranu pokud je vynuceno ověření pomocí Kerberosu, tak se jedná o nejvíce bezpečný mód, který dokáže vzdálená plocha nabídnout.

Back to Top