Posted in: Základy PowerShellu

Hodiny do PowerShellu

Dnes je to jen malý kousek kódu, který se ovšem může hodit. Na liště OS máme běžně hodiny, ale někdy se může stát, že potřebujeme promítnout někam aktuální čas, ne z nějakého jiného důvodu chceme v konzoli vidět běžící čas. Nyní přidám jednoduché jádro, digitální hodiny. Jednoduchý kód využívající nekonečného cyklu while:

while($true)
{
    cls #vyčištění konzole
    $cas = Get-Date | select Hour, Minute, Second #uložení času do proměnné
    Write-Host $cas.Hour ":" $cas.Minute ":" $cas.Second #výpis času v obvyklém formátu
    Start-Sleep -Seconds 1 #uspání procesu na 1 sekundu
}

Ručičkové hodiny do konzole

Vykreslení ručičkových hodin s pomocí grafických knihoven .NET už na internetu a jde vytvořit v libovolném jazyce s využitím trochy goniometrie. Osobně jsem chtěl simulovat ručičkové hodiny přímo v konzole pomocí vykreslování znaků. Hodiny vykreslují polohu konců ručiček, které se pohybují spíše po nějakém kosém čtverci, nežli po kruhu, protože k vykreslení dochází vypsáním pole 30 x 30 znaků. Stejně jako digitálky výše, čtou čas z operačního systému, ze kterého následně vypočítají x a y souřadnici konce ručičky každé ručičky. Problémem je relativně pomalé překreslování příkazové řádky, takže běh nevypadá úplně hezky, ale jdou a přečíst se nechají 😉

  • kolečko je hodinová ručička
  • + je minutová ručička
  • * je sekundová ručička
function get-sekunda{
    param (
        $s
    )
    #výpočet polohy sekund
    if($s -le 15)
    {
        $y = $s + 15
        $x = $s
        $plocha[$x, $y] = '*'
    }
    elseif(($s -gt 15) -and ($s -le 30))
    {
        $y = 30 - ($s - 15)
        $x = $s
        $plocha[$x, $y] = '*'
    }
    elseif(($s -gt 30) -and ($s -le 45))
    {
        $y = 15 - ($s - 30)
        $x = 30 - ($s - 30)
        $plocha[$x, $y] = '*'
    }
    elseif(($s -gt 45) -and ($s -le 60))
    {
        $y = $s - 45
        $x = 30 - ($s - 30)
        $plocha[$x, $y] = '*'
    }
}

function get-minuta{
    param (
        $m
    )
    #výpočet polohy minut
    if($m -le 15)
    {
        $y = $m + 15
        $x = $m
        $plocha[$x, $y] = '+'
    }
    elseif(($m -gt 15) -and ($m -le 30))
    {
        $y = 30 - ($m - 15)
        $x = $m
        $plocha[$x, $y] = '+'
    }
    elseif(($m -gt 30) -and ($m -le 45))
    {
        $y = 15 - ($m - 30)
        $x = 30 - ($m - 30)
        $plocha[$x, $y] = '+'
    }
    elseif(($m -gt 45) -and ($m -le 60))
    {
        $y = $m - 45
        $x = 30 - ($m - 30)
        $plocha[$x, $y] = '+'
    }
}

function get-hodina{
    param (
        $h
    )
    #převedení na 12 hodin režim
    $h = $h % 12
    #výpočet polohy hodin
    switch($h)
    {
        0 {$plocha[0, 15] = 'o'}
        1 {$plocha[5, 20] = 'o'}
        2 {$plocha[10, 25] = 'o'}
        3 {$plocha[15, 30] = 'o'}
        4 {$plocha[20, 25] = 'o'}
        5 {$plocha[25, 20] = 'o'}
        6 {$plocha[30, 15] = 'o'}
        7 {$plocha[25, 10] = 'o'}
        8 {$plocha[20, 5] = 'o'}
        9 {$plocha[15, 0] = 'o'}
        10 {$plocha[10, 5] = 'o'}
        11 {$plocha[5, 10] = 'o'}
        12 {$plocha[0, 15] = 'o'}
    }
}

$plocha = New-Object 'object[,]' 31,31

while($true)
{
    cls #vyčištění konzole
    $cas = Get-Date | select Hour, Minute, Second #uložení času do proměnné
    #Write-Host $cas.Hour ":" $cas.Minute ":" $cas.Second #výpis času v obvyklém formátu
    #inicialoizace plochy
    for($i = 0; $i -le 30; $i++)
    {
        for($j = 0; $j -le 30; $j++)
        {
            $plocha[$i,$j] = ' ' #uložení mezery do pole plochy
        }
    }
    #nastavení ciferníku
    $plocha[0,15] = '12'
    $plocha[15,30] = '3'
    $plocha[30,15] = '6'
    $plocha[15,0] = '9'
    $plocha[15,15] = '*'
    #výpočet polohy konců ručiček
    get-hodina -h ($cas.Hour) #ručička zobrazená kolečkem
    get-minuta -m $cas.Minute #ručička zobrazení plusem
    get-sekunda -s $cas.Second #ručička zobrazená hvězdičkou
    #vykreslení plochy
    for($i = 0; $i -le 30; $i++)
    {
        for($j = 0; $j -le 30; $j++)
        {
            Write-Host $plocha[$i,$j] -NoNewline
        }
        Write-Host ""
    }
    
    Start-Sleep -Seconds 1 #uspání procesu na 1 sekundu
}
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Zrušení automatického vypínání testovacích verzí Windows po 60 minutách

Poslední evaluation Windows mají stejně jako vývojářská VM od MS tu nevýhodu, že se po 60 minutách vypínají. V případě, že se rozhodnete využít vývojářský VM od MS, pak MS přímo uvádí, že licence OS exspiruje prvním spuštěním VM.

Automatickému vypínání Windows po 60 minutách při exspirované licenci lze v případě evaluation verze zabránit zakázáním služby Software Protection Platform Service. Zde je nutné zdůraznit, že systém se sice nebude restartovat, ale i tak je nutné jej využívat v souladu s licenční smlouvou a pouze po dobu k testování určenou! Deaktivaci této služby doporučuji provést pomocí registrů:

HKLM/SYSTEM/CurrentControlSet/Services/sppsvc

Položku Start typu DWORD nastavte na hodnotu 4.

Bez běhu této služby není možné systém jakkoliv aktivovat (multilicenčně ani běžný produktovým klíčem) a problémy s aktivací bude mít i další SW Microsoftu, jako je Office nebo Visual Studio, který nebude schopen načíst ani digitální předplatné ze zadaného účtu.

Posted in: Vývoj počítačů

Změna znakové sady MS SQL serveru

V tomto článku bych se rád podělil o zkušenost se změnou znakové sady MS SQL serveru. Je několik cest, některé jsou dokumentované a podporované, jiné nikoliv.

Seznam podporovaných a výchozích znakových sad je možné najít v dokumentaci.

Změna znakové sady uživatelské databáze

V rámci instance MS SQL serveru je možné měnit collation pouze jedné databáze, nebo její části. K tomu slouží dokumentovaná a podporovaná cesta s využitím jazyka T-SQL. Ukažme si to na příkladu databáze jménem Products. Jako první bod je dobré vědět, jaká je stávající callation databáze, což nám vypíš příkaz:

SELECT name, collation_name FROM sys.databases WHERE name = 'Products'
--pro celý server můžeme použít
SELECT CONVERT(nvarchar(128), SERVERPROPERTY('collation'));

Nyní můžeme přistoupit k samotné změně na kódování Czech_CI_AS, což provedeme následujícím skriptem:

-- přepneme databázi do jednouživatelského módu 
ALTER DATABASE Products SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
-- změníme kódování
ALTER DATABASE Products COLLATE Czech_CI_AS; 
-- Vrátíme databázi do plnohodnotného režimu 
ALTER DATABASE Products SET MULTI_USER

Nyní máme hotovo. Tato změna má dopad na celou jednu databázi, ostatní neovlivňuje a nastavení serveru také nemění. Bez problémů funguje na všech verzích od 2005 po 2022.

Změna collation pouze jednoho sloupce

Pokud budeme potřebovat překódovat jen jeden sloupec databáze i to je možné. Je to velmi jednoduchý jeden řádek T-SQL kódu, opět si ukážeme příklad:

ALTER TABLE ProductGuid ALTER COLUMN Description nvarchar(1000) COLLATE Czech_CI_AS

Změna znakové sady serveru

Nyní si popíšeme cestu, jak změnit znakovou sadu serveru, neovlivní nastavení uživatelských databází. Tento postup je dokumentovaný Microsoftem a podporovaný.

Přejděte do složky, kde máte nainstalovaný SQL server a v ní do složky Setup Bootstrap.V této cestě spusťte příkazovou řádku, nebo PowerShell. Např..: C:\Program Files\Microsoft SQL server\140\Setup Bootstrap

V této cestě pak spustíme následující příkaz:

Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=SQL2017 /SQLSYSADMINACCOUNTS=ServerDB\wnd_rebuid /SAPWD= wnd_auth_sql2017 /SQLCOLLATION=Czech_CI_AS

V PowerShellu by to vypadalo následovně:

.\Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=SQL2017 /SQLSYSADMINACCOUNTS=ServerDB\wnd_rebuid /SAPWD= wnd_auth_sql2017 /SQLCOLLATION=Czech_CI_AS

Výše uvedený příklad je pro Windows autentizaci, pokud budeme využívat SQL autentizaci, pak zadáváme login v jednoduchém tvaru.

Po dokončení příkazu máme hotovo, doporučuji restartovat instanci. Tato cesta funguje od verze 2008 R2.

Nedokumentovaná a nepodporovaná cesta

Tato cesta změní Callation celého serveru včetně všech uživatelských databází. Je velmi důležité mát kompletní zálohu a i tak mohu tento postup schválit jen pro testování, případně vývoj, nikoliv produkci.

Opět přejdeme k složky SQL serveru, přesněji k umístění souboru sqlserver.exe, například: C:\Program Files\Microsoft SQL server\MSSQL14.SQL2017\MSSQL\Binn

V této cestě opět spustíme příkazovou řádku jako správce. Nyní zastavíme všechny služby SQL serveru přes jeho řídící konzoli. Do příkazové řádky pak zadáme např.:

sqlservr -m -T4022 -T3659 -s"SQL2017" -q"Czech_CI_AS"

Význam parametrů je následující:

  • m: single user režim
  • T4022: Vynechání spouštěcích procedur
  • T3569: logování všech chyb při startu SQL serveru
  • s: název instance, pokud je pojmenovaná, pro default název není potřeba uvádět
  • q: požadovaná collation

Po dokončení procesu stiskneme CTRL + C a potvrdíme vypnutí serveru.

Nyní můžeme server pomocí management konzole spustit a máme nastavenou novou callation na všech databázích.

Postup je testován na verzi 2005 a novější.

Posted in: Základy PowerShellu

Funkce v PowerShellu

Dnes po dlouhé době opět píši něco pro ty, kteří chtějí s PowerShellem začínat a již nějak zvládli základní syntaxi. Pro dnešní práci budeme potřebovat nějaký nástroj k psaní skriptů, viz článek.

Jak jsem se již určitě zmínil v některém předešlém článku, skript je posloupnost příkazů, které se vykonají v daném pořadí. Skript může obsahovat, stejně jako program v některém programovacím jazyce, cykly, podmínky a další řídící příkazy, které vedou na opakování nějakého bloku, nebo naopak přeskočení nějakého bloku kódu. Stejně jako v programování, i při psaní skriptů, můžeme potřebovat opakovat nějaký blok, kus kódu, na různých místech skriptu. Prvním nápadem může být, prostě daný blok kódu zkopírovat a vložit jej na požadovaná místa. Toto je nevýhodné, protože se zkopírovaný blok špatně opravuje, rozšiřuje apod. Proto máme lepší řešení, to jsou funkce, které si umíme volat.

Jmenná konvence

Když si vzpomenete na základní syntaxi PowerShellu, příkazy mají základní podobu:
sloveso-PodstatnéJméno
Tento formát pojmenování je potřeba dodržet i u našich funkcí. Mnohé z vás by mohlo napadnou použít vlastní kombinaci jako například:
Vypis-PCinfo
sice syntakticky vyhovíme, ale není to zcela správné. PowerShell definuje rovněž sadu sloves, která máme využívat a uživatelé jazyka je očekávají a očekávají, že budou mít daný význam. Seznam podporovaných sloves vrátí příkaz:

Get-Verb | Sort-Object -Property Verb

Výstup této funkce rovněž uvádím v článku o syntaxi.

Obecná syntaxe

function Sloveso-PodstatneJmeno
{
    #vlastní kód (tělo) funkce
}

Příklad:

function Get-WinInfo
{
    cls
    Write-Host "Základní informace o počítači"
    Write-Host ""
    $info = Get-ComputerInfo | select WindowsProductName, WindowsCurrentVersion, CsModel, CsName
    Write-Host "Název OS      :" $info.WindowsProductName
    Write-Host "Verze jádra OS:" $info.WindowsCurrentVersion
    Write-Host "Model zařízení:" $info.CsModel
    Write-Host "Název zařízení:" $info.CsName
}

Funkci spustíme tak, že napíšeme její jméno, tedy pro náš příklad by volání vypadalo:

Get-WinInfo

Výše uvedená je nejsprostější verze, samozřejmě i základní funkce může mít parametry, případně vracet hodnoty.

Funkce s parametrem

Výše popsaný základ je dobrý, ale pořád se jedná o poměrně hloupé funkce. Výše popsaná syntaxe slouží k deduplikaci kódu a umí modifikovat globální proměnné, vypisovat na obrazovku, komunikovat s uživatelem atd. Bohužel nemůžeme takto definované funkci předat hodnoty ke zpracovaní. Pojďme se podívat na to, jak tento problém řešit.

Obecná syntaxe:

function Sloveso-PodstatneJmeno
{
     param(
       $NázevParametru,
       $NázevDruhéhoVolitelnéhoParametru
       )
     #vlastní kód (tělo) funkce
}

Čárkou se oddělují jednotlivé parametry, tudíž se uvádí pouze tam, kde za parametrem následuje další parametr. Pojďme si uvést příklad funkce s jedním parametrem.

function Get-OSInfo { 
    param (
        $ComputerName
    ) 
    Get-WmiObject -ComputerName $ComputerName -Class Win32_OperatingSystem | select Caption, Version, SystemDrive | Format-Table 
}

Nyní je na čase si ukázat, jak tuto funkci volat. Obecně voláme funkci v podobě:

Sloveso-PodstatneJmeno -NázevParametru hodnota -NázevDruhéhoVolitelnéhoParametru hodnota

Pojďme si to zkonkrétnit na našem příkladu s funkcí Get-OSInfo pro lokální počítač:

Get-OSInfo -ComputerName localhost

Toto vše je krásné, ale občas bychom potřebovali, aby vstup, který nám dává parametr, byl určitého datového typu, například číslo. Pojďme si na příkladu jednoduché kalkulační funkce ukázat, jak určit datový typ, který parametr bude akceptovat.

function Get-Vysledek { 
    param (
        [double]$cislo1,
        [double]$cislo2,
        [switch]$soucet,
        [switch]$soucin,
        [switch]$rozdil,
        [switch]$podil
    ) 
    if($soucet)
    {
        $vysledek = $cislo1 + $cislo2
        Write-Host "Soucet je:" $vysledek
    }
    if($rozdil)
    {
        $vysledek = $cislo1 - $cislo2
        Write-Host "Soucet je:" $vysledek
    }
    if($soucin)
    {
        $vysledek = $cislo1 * $cislo2
        Write-Host "Soucet je:" $vysledek
    }
    if($podil)
    {
        if($cislo2 -gt 0)
        {
            $vysledek = $cislo1 / $cislo2
            Write-Host "Soucet je:" $vysledek
        }
        else
        {
            Write-Host "Nulou nelze dělit"
        }
    }
}

Datový typ, kterého musí daný parametr nabývat, určíme tak, že název datového typu uvedeme do hranatých závorek před požadovaný parametr. Jedinou výjimkou, která funguje pouze u parametrů, nelze ji uplatnit na proměnné v jiných částí kódu je „datový typ“ switch. Pokud je nějaký parametr typu switch, pak daný parametr nabyde hodnoty True (logické jedničky) tím, že dojde k uvedení daného parametru při volání procedury. Úplné informace o datových typech jsou v dokumentaci. Někdy příště, se na vybrané datové typy podíváme. Příklad volání naší ukázkové funkce Get-Vysledek:

Get-Vysledek -cislo1 6.6 -cislo2 3 -podil

Návratová hodnota

Od PowerShell verze 5 nám funkce může vrátit návratovou hodnotu, stejně jako je tomu v běžných programovacích jazycích. Na rozdíl do programovacích jazyků ovšem PowerShell nevrací hodnotu, ale výraz. Na rozdíl od programovacích jazyků u funkce nedefinujeme datový typ návratové hodnoty. Stejně jako v případě běžných programovacích jazyků máme k dispozici příkaz return, jehož syntax je jednoduchá:

return vyraz

Pojďme si to ukázat na příkladu převzatém z dokumentace a lehce upraveném.

function Get-Kalkuace {
    param ($hodnota)

    $hodnota ="Prosím vyčkejte, počítám...`n" #znak `n je zalomení řádku
    $hodnota += 73
    return $hodnota
}

Takovouto funkci lze volat napřímo, nebo její výstup, který vrací příkaz return přiřadit do proměnné. Pojďme si ukázat verzi, kdy hodnotu navrácenou funkcí (v mé modifikaci strinng) přiřadíme do proměnné, kterou rovnou vypíšeme:

Write-Host ($a = Get-Kalkuace 14)

Závěr

Toto je vše z dnešního úvodu do funkcí. Funkce toho umí dalece více, ale o tom až někdy později u tzv. pokročilých funkcí. Funkce jsou klíčovou součástí jazyka PowerShell, protože moduly jazyka PowerShell vždy funkce obsahují a uživatel modulu volá právě funkce v něm obsažené.

Posted in: Vývoj počítačů, Windows 10, Windows 11, Windows 8 a 8.1

Základy zabezpečení domácí sítě

Předvánoční čas bohužel je nejnáročnější na kybernetickou bezpečnost domácností. Shánění dárků, charity, posílání přání a balíků vede k tomu, že jsme méně opatrní vůči emailům vydávajícím se za přepravce, nebo známé eshopy. Pojďme se podívat na to, jak si nastavit domácí síť tak, abychom minimalizovaly dopady.

Nastavení routeru

Router (lidově většinou nějaká Wifina) je základem každé domácí sítě. S tímto zařízením stojí a padá celá domácí síť. Pojďme se podívat na to, co bychom potřebovali na daném zařízení nastavit, nebo zkontrolovat.

  1. Aktualizace – musíme mít vždy nejnovější verze firmware a bezpečnostních aktualizací
  2. Vypnutí vzdálené správy – nepovolit vzdálené nastavení routeru
  3. Bezpečné přihlašování – silné heslo a definovaná 2 konkrétní MAC adresy (2 zařízení), které smí do nastavení přistoupit
  4. Silné zabezpečení Wi-Fi – používat nejnovější standardy zabezpečení Wi-Fi sítě (co jde, aby to všechna naše zařízení uměla)
  5. Silné heslo k Wi-Fi síti
  6. Samostatná síť pro hosty – naše přítele a členy rodiny, kteří v naší domácnosti nežijí, nepouštíme do vlastní sítě
  7. Omezení zařízení, která se mohou připojit k Wi-Fi – ideální je zadat MAC adresy zařízení, která se mohou správnými údaji přihlásit
  8. Blokování portů – doporučuji nechat dostupné jako cílové porty jen: 443, 587, 993, 995, všechny ostatní porty zakázat v celé síti
  9. Směrem do internetu doporučuji nevystavovat nic
  10. Veškeré DNS servery nastavit na hodnotu: 1.1.1.2 (cloudflare secure DNS) a 185.228.169.9 (Clean browsing secure dns)

Nastavení počítače

I když bude domácí Wi-Fi dobře nastavená, cesta nekončí. I počítač se musí dále zkontrolovat a případně nastavit.

  1. DNS v OS musíme nastavit stejně, jako jsme to udělali u routeru, tedy na 1.1.1.2 a 185.228.169.9. Pro IPv6 si najděte odpovídající konfiguraci, nebo IPv6 úplně zakažte.
  2. Mějte kvalitní bezpečnostní SW, Bitdefender (BitDefender pro domácnost (it-market.cz)), Eset (Eset Antivirus | Antivirové programy ESET NOD32 | Alza.cz) nebo jiný kvalitní placený bezpečnostní SW
  3. Nastavit DNS pomocí DOH ve Windows 11: Jak nastavit DNS-over-HTTPS ve Windows 11? (instaluj.cz) adresa DNS serveru: https://security.cloudflare-dns.com/dns-query
  4. Nastavit si DNS pomocí DOH ve webový prohlížeči: DNS přes HTTPS – Spajk.cz na adresu: https://security.cloudflare-dns.com/dns-query
  5. Instalovat každý měsíc všechny aktualizace Windows
  6. Instalovat každý měsíc všechny aktualizace všech programů

Nastavení telefonů

Stejně jako v případě počítače je potřeba nastavit i všechny telefony. Největší problém notebooků a telefonů je to, že danou domácí síť opouští.

  1. Instalovat všechny dostupné aktualizace telefonu i veškerých aplikací
  2. Nainstalovat si kvalitní placený bezpečnostním SW
  3. Nastavením bezpečných DNS pro Wi-Fi i mobilní data

Práce s emailem a sociálními sítěmi

Další část bezpečnosti jsou naše uživatelské návyky. Pojďme se podívat na to, co a jak bychom měli dělat k tomu, abychom minimalizovali riziko problému.

  1. E-shop ani dopravce nás nebude kontaktovat prostřednictvím sociální sítě
  2. U všech emailů validujeme skutečného odesílatele – v Outlooku stačí najet myší na odesílatele a neklikat, po chvíli se otevře skutečná adresa odesílatele
  3. Doporučuji instalovat analyzátor hlaviček: Find the right app | Microsoft AppSource
  4. Veškeré odkazy NEOTEVÍRAT a nejdříve analyzovat – stačí zkopírovat do VirusTotal – Home, nechat analyzovat a v záložce Detail ověřit, že adresa vede do firmy, kam opravdu chceme
  5. Neznámé emaily neotevírat!

Mobilní zařízení

Mobilní zařízení opouští naší domácí síť, jde o telefony, notebooky apod. Pojďme se podívat na to, co dělat, abychom minimalizovali riziko.

  1. NEPŘIPOJOVAT SE k veřejným sítím – Když už musíme, zajistit, že po síti budeme otevírat jen jízdní řády, mapy nebo jiný zdroj obecných informací a vše ostatní nebude provádět datové přenosy ani na pozadí
  2. I mobilní data využívat obezřetně – jde o bezpečnější variantu, nežli využívání veřejné Wi-Fi, ale i tak je vhodné minimalizovat potenciálně citlivý provoz
  3. Otevírat jen důvěryhodné weby, které dobře známe
  4. Minimalizovat datový provoz
  5. NEOTEVÍRAT odkazy ze SMS, chat a dalších informačních kanálů
  6. Zásilky sledovat výhradně pomocí čísla zásilky a oficiálního webu nebo oficiální aplikace
  7. NEOTEVÍRAT přílohy a odkazy v emailech
  8. Využívat pro přístup k internetu VPN od poskytovatele našeho bezpečnostního SW

E-shopy

Před objednáním, nebo zadáním přihlašovacích údajů, je potřeba si ověřit:

  1. Že jsme skutečně na eshopu, kde chceme být (kontrola URL adresy pomocí Whois nebo virustotal a https certifikátu).
  2. Že se eshop se nenachází na seznamu rizikových od ČOI: Rizikové e-shopy – COI
  3. Ověřit si obchodníka v rejstříku dle IČO: ARES – Ekonomické subjekty (mfcr.cz)
  4. Platit zásilky na dobírku, máte jistotu, že nepřijdete o peníze, když by se jednalo o podvod
  5. Neuvádět informace o platební kartě ani číslo účtu
Posted in: Vývoj počítačů

Validace emailů v karanténě a jejich uvolnění

Dnes malinko netradičně bych se rád podělil o nějaké body, kterými se řídím, když jako správce Exchange online uvolňuji emaily z karantény. Celkově libovolné pravidlo může obsahovat chybu, takže nám v karanténě může skončit něco neprávem, ale častěji má stroj pravdu. Myslím si, že následující postup bude platiti ne jen pro administrátory Exchange online, ale i pro administrátory Exchange on-premises i dalších emailových serverů.

Pravidla jsou souhrnem mých zkušeností, kdy se snažím eliminovat chyby dané vlastními pravidly a zároveň postupovat co nejvíce bezpečně, tedy nevěřit tomu, že by měl být email uvolněn. Raději zahodím validní fakturu, nebo příkaz generálního ředitele, nežli pustit jediný Phish nebo malware.

  1. Validujeme předmět a odesílatele, zda jde o validní správu, nebo je již zde zřejmý spam, či podvod
  2. Důvodem karantény není Phish – výjimky pro adresy v bodech 3a, 3b a 3c
  3. Ověříme, zda Composite authentication obsahuje hodnotu: pass
    1. Výjimkou je: SMTP mail from address: zasilka@uschovna.cz
    1. Výjimkou je: Sender address: noreply@zasilkovna.cz
  4. Otevřeme hlavičku emailu
  5. V hlavičce najdeme: smtp.mailfrom a ověříme, že souhlasí s doménou v adrese odesilatele
  6. Zobrazíme náhled zprávy
  7. Překlikneme na kartu: Prostý text
  8. Všechny odkazy prověříme službou virustotal.com, případně ručním podáním do sandboxu vlastního antivirového řešení
  9. Pokud má email přílohy, validujeme jejich formát (koncovku) – nesmí být spustitelná, nebo ve formátu pro makra
  10. Pokud email obsahuje přílohy a splnil bod 9, stáhneme zprávu a necháme ji proskenovat antivirovým řešením a nahrajeme ke skenu do virustotal.com
  11. Pokud je soubor bezpečný, otevřeme jej ve Windows Sendbox a následně proskenujeme všechny odkazy, které obsahuje službou virustotal
  12. Pokud email splnil všechny body 1 až 11 (v případě validace bezpečnostním SW je bez nálezu), může být uvolněn příjemci
  13. Pokud je důvodem karantény transportní pravidlo, můžeme pokud známe přesný důvod, zvážit jeho editaci
Posted in: Základy PowerShellu

Podepisování kódu v PowerShellu

Dnes to bude trochu bezpečnostní téma i když jen tak na půl. Podepisování skriptů rozhodně souvisí s jejich validací a bezpečností. Pokud se někdo pokusí modifikovat podepsaný skript, podpis se stane neplatným a modifikovaný skript se nevykoná, což samo o sobě může působit bezpečně.

Problém je, že jde obcházet ExecutionPolicy, takže jde spustit i nepodepsaný skript a teoreticky i skript s nevalidním podpisem. Na druhou stranu se musí uznat, že je rozhodně bezpečnější skripty podepisovat a pro běh daný podpis vyžadovat, nežli se na to vykašlat, protože tím útočníkovi zvedáme cenu útoku.

Problémem je, kde vzít správný certifikát. Patřičný certifikát lze vystavit pomocí interní certifikační autority v podnikové síti, ale musí být správně nastaven a správně ošetřeno, komu a s jakou platností se certifikát vydává. V domácím prostředí to nelze důvěryhodně udělat.

Nyní již ke skriptu, který umí podepsat zvoleným certifikátem libovolný soubor.

Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert
$cert = Read-host -promt „Zadej Thumbprint podposového certifikátu“
$cesta = Read-Host -promt „Zadej cestu k souboru“
Set-AuthenticodeSignature -FilePath $cesta -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | where Thumbprint -eq  $cert) -TimestampServer http://timestamp.comodoca.com

Časový server doporučuji zaměnit za interní, ale i takto s veřejnou certifikační autoritou půjde podepsat certifikátem od autority interní.

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

Přidání PC do domény pomocí PowerShellu

Někdy se může hodit naskriptovat si přidání PC do domény. Může se jednat o to, že tuto akci z nějakého důvodu, např. nasazení LAPS, budeme chtít provést jako poslední akci z MDT task sekvenci. Nejsnazší je pak tuto akci provést jako spuštění PowerShell skriptu, který bude využívat nějaký servisní účet k této akci určený.

Problematiku práce s heslem v PowerShellu nechám na jiné téma, přestavte si, že máme přihlašovací údaje uložené někde v registru instalačního serveru. V ukázce níže jsou údaje součástí kódu, což není z pohledu bezpečnosti správně, ale naplnění jednotlivých proměnných může být rozličným způsobem.

$u = "domena\mdt" 
$d = "domena.local"
$p = ConvertTo-SecureString "5EiCJnRrgNrdQC3ZyEZauWg4PGPtMoIM10GC6qF618esuNKVva" -Force
$c = New-Object System.Management.Automation.PSCredential $u, $p
Add-Computer -DomainName $d -Credential $c

Výše uvedený kód vyžaduje, aby PowerShell běžel ve Full Language mode. Proměnná $c opisuje, co se na pozadí stane, když zapíšeme:

$c = Get-Credential

Pokud využijeme konstrukci Get-Credential, tak se nám zobrazí okno pro zadání loginu a hesla.

Back to Top