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

LAPS (Local Administrator Password Solution)

Jde o nástroj Microsoftu na správu hesel lokálního administrátorského účtu v doménovém prostředí. Jde o samostatné řešení, která „má na svědomí“ skupina Čechů pracujících v Microsoftu. Nově aktulializací 04-2023 se potřebné binární soubory staly součástí systému Windows 10 a Windows 11, rovněž pak systémů Windows server 2016, 2019 a 2022. Aktualizací instalovaná komponenta ovšem neobsahuje GUI pro servisní techniky, proto i tak doporučuji stáhnout msi z webu Microsoftu. Na koncových stanicích (pokud se rozhodnete instalovat ručně) stačí provést msiexec /i <cesta k msi instalárotu laps>, nebo využít distribuce pomocí GPO.

Na pracovní stanici administrátora, který se má starat o koncové stanice prak provedeme instalaci pomocí GUI a zvolíme „Fat clietn UI“

Instalace na doménový řadič

Na doménovém řadiči instalaci provedeme pomocí GUI (případně si dohledáme parametry na webu MS) a zvolíme všechny management tools.

Po dokončení instalace je potřeba upravit schéma AD (tato operace se provádí na Schema master kontroleru) pomocí několika PowerShell příkazů. Heslo bude po změně schématu uloženo v objektu počítače a k tomuto atributu budeme nastavovat právo přístupu.

Import-module AdmPwd.PS
Update-AdmPwdADSchema

Nyní musíme přidat patřičná oprávnění skupině správců klientských stanic.

Set-AdmPwdReadPasswordPermission -Identity "PC" -AllowedPrincipals "SpraciPC"

Nyní nastal čas povolit účtům počítačů změnit sám sobě heslo:

Set-AdmPwdComputerSelfPermission -Identity "PC"

Z vlastní zkušenosti mohu říct, že po dokončení instalace a restartu doménového řadiče je ještě potřeba registrovat službu.

regsvr32.exe AdmPwd.dll

Tvorba politiky

Pokud máte central store, bude ještě potřeba překopírovat ADMX šablonu z %windir%\PolicyDefinitions\ do \\domain\SYSVOL\domain\Policies\PolicyDefinitions\ a rozhodně nezapomenout na jazykový balíček šablony.

Celé nastavení technologie je pak v: Computer Configuration > Policies > Administrative Templates > LAPS.

Zde si nastavíme vše potřebné, jako je komplexita hesla a jeho platnost:

Účet lokálního administrátora (pokud nenastavíme, jde o vestavěný účet Administrator [SID končí na 500])

Zakážeme platnost hesla, která je delší, nežli jsme nastavili v zásadách

A nesmíme zapomenou celou konfiguraci (tedy i vlastní správu hesla lokálního admina) zapnout.

Přístup k heslům

Přístup k heslům získají doménový správci a uživatelé ve skupině, které tato práva byla přidělena. Uživatelé s oprávněními pak mohou využít LAPS UI

Nebo pomíc PoiwerShellu:

Get-AdmPwdPassword -ComputerName "AZ-0183-3116-95"
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server, Základy PowerShellu

Nástroje pro skriptování v PowerShellu

PowerShell, stejně jako další textové Shelly má 2 tváře, příkazové rozhraní a skriptování. Pro příkazové rozhraní slouží konzola PowerShell (na Windows PowerShell.exe), nebo Windows Terminal. Příkazové prostředí slouží k manuálnímu provádění příkazů, nebo spouštění skriptů. Skriptovací rozhraní je malinko složitější, takže si jej rozebereme dále trochu podrobněji.

Nativní nástroj na Windows – PowerShell ISE

Všechny verze Windows s grafickým rozhraním (tedy všechny krom Windows server Core a Windows server Nano) obsahují nástroje PowerShell ISE, který slouží k editaci a tvorbě skriptů a dalších PowerShell souborů. PowerShell ISE je primárně určeno pro Windows PowerShell (tedy PowerShell verze 1.0 až 5.1), pro PowerShell verze 6 a novější je sice možné ISE využít, ale doporučeno je využití VS Code, kde je nápověda a doplňování příkazů nastavená primárně na nejnovější podporovanou verzi PowerShellu. Z nástrojů ostatních vývojářů je snad nejpokročilejším PowerShell studio, ale osobně i tak dávám přednost jednoduchému ISE.

Krom interaktivní možnosti vyhledávání příkazů, jejichž parametry je možné vyplnit pomocí formuláře, umožňuje využívat a vytvářet tzv. snipety.

zadání příkazů z vyhledání a vyplnění formuláře po pravé straně

Snipety

Snipety jsou šablony většího kusu syntaxe, jako jsou třídy, DSC, funkce, cykly či podmínky. Seznam dostupných snipetů se vyvolá stiskem CTRL + J v místě, kam chceme daný snipet vložit.

Ukázka seznamu snipetů obsaženém v CTRL + J

Pojďme si nyní ukázat, jak využít snipet pro tvorbu tzv. andvanced function. Nejprve pomocí CTRL + J vyvoláme nabídku snipetů a v ní najdeme Advanced Function. Po kliknutí na tuto nabídku se nám vloží kód.

Jak je vidět na obrázku výše, vloží se nám šablona kódu, kterou začneme doplňovat, a výsledek může být např.:

<#
.Synopsis
   kontrola systémovýh souborů.
.DESCRIPTION
   kontrola systémových souborů nativními nástroji scf a dism
.EXAMPLE
   Check-SystemFiels -scannow
   provede příkaz sfc /scannow
.EXAMPLE
   Check-SystemFiels -scanfile -Path c:\windows\system32\kernel32.dll
   Provede kontrolu integrity a pokusí se o opravu souboru kernel32.dll
#>
function Check-SystemFiles
{
    Param
    (
        # nápověda
        [Parameter(ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [string] $path,

        # scannow
        [switch] $scannow,

        #verifikace
        [switch] $verifyonly,

        #kontrola souboru
        [switch] $scanfile,

        #offline kontrola
        [switch] $offline,

        #kontrola souboru
        [switch] $verifyfile,

        #offline boot adresář
        [string] $offbootdir,

        #offline winadresář
        [string] $offwindir,

        #oprava MS Store komponent
        [switch] $store
    )

    Begin
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        if($scanfile -and ($path -eq ''))
        {
            Write-Error 'Není uvedená cesta k ověřovanému souboru'
            Pause
        }elseif($verifyfile -and ($path -eq ''))
        {
            Write-Error 'Není uvedená cesta k ověřovanému souboru'
            Pause
        }elseif($offline -and (($path -eq '') -or ($offbootdir -eq '') -or ($offwindir -eq '')))
        {
            Write-Error 'Není uvedená cesta k některému z offline adresářů'
            Pause  
        }
    }
    Process
    {
        if($scannow)
        {
            $prikaz = 'sfc /scannow'
            Invoke-Expression -Command $prikaz
        }
        elseif ($verifyonly)
        {
           $prikaz = 'sfc /verifyonly' 
           Invoke-Expression -Command $prikaz
        }
        elseif ($scanfile)
        {
            $prikaz = 'sfc /scanfile=' + $path
            Invoke-Expression -Command $prikaz
        }
        elseif($verifyfile)
        {
            $prikaz = 'sfc /VERIFYFILE=' + $path
            Invoke-Expression -Command $prikaz
        }
        elseif($offline)
        {
            $prikaz = 'sfc /scanfile=' + $path + '/OFFBOOTDIR=' + $offbootdir + '/OFFWINDIR=' + $offwindir
            Invoke-Expression -Command $prikaz
        }elseif($store)
        {
            $prikaz = 'DISM /Online /cleanup-image /ScanHealth'
            Invoke-Expression -Command $prikaz
            $prikaz = 'dism /online /cleanup-image /restorehealth'
            Invoke-Expression -Command $prikaz
        }
    }
    End
    {
    }
}

Na kódu výše je vidět, že některé části šablony jsem nevyužil a tudíž jsem je smazal. Výhodou využití snipetu je, že člověk při psaní nezapomene na žádnou část včetně nápovědy, která je opravdu důležitá.

Tvorba vlastního snipetu

PowerShell ISE není omezeno pouze na výchozí sadu snipetů, ale každý člověk si může vytvořit vlastní snipety. Jde o dokumenty ve formátu ps1xml. K vytvoření slouží příkaz New-IseSnippet a vlastní šablona (tělo snpetu) se vkládá jako text. Dále uvádím 2 příklady, kterými jsem si rozšířil své ISE, první generuje blok nápovědy k funkci (protože si často píši tělo funkce ručně bez snipetu)

New-IseSnippet -Title Comment-BasedHelp -Description "A template for comment-based help." -Text "<#
.SYNOPSIS
.DESCRIPTION
.PARAMETER  <Parameter-Name>
.INPUTS
.OUTPUTS
.EXAMPLE
.LINK
.NOTE
#>" -Force

Možnost Force říká, že má dojít k přepisu již existujícího snipetu se stejným jménem, tímto parametrem se dosahuje aktualizací (oprav) vlastních snipetů. Druhý příklad prak tvoří šablonu pro vložená povinného parametru funkce či skriptu.

$M = @'
Param
(
  [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,Position=<pozice>)]
  [<type>]
  $<ParameterName>
)
'@
New-ISESnippet -Text $M -Title MandatoryParameter -Description "Adds a mandatory function parameter." -Force

Import Snipetů

Snipety je možné sdílet s kolegy, nebo mezi více zařízeními pomocí sdílené složky, nebe vyměnitelného média. Bohužl takto dostupné snipety není možné hned využívat, ale musí dojít k jejich importu, který se děje pomocí příkazu Import-IseSnippet viz příkaz níže:

Import-IseSnippet -Path \\Server01\Public\Snippets -Recurse

Alternativou je snipety importovat pomocí správy souborů. (takto nelze snipety importovat ze snipetových modulů). Ze zdíleného média zkopírujeme požadované snipety (soubory formátu ps1xml) do: %userprofile%\Documents\WindowsPowerShell\Snippets
Takto přidané snipety jsou k dispozici až po novém spuštění ISE.

Podrobnější informace o snipetech najdete v dokumentaci Na závěr prozradím, že snipety není možné využívat ve VS Code a PowerShell studio má vlastní sadu obdobných možností.

Posted in: Windows server

Ruční řízení synchronizace Azure AD Connect

Dnes Vám ukáži primitivní skript, kterým je možné zjisti stav synchronizace a případně ručně spustit synchronizaci AD s Azure AD.

<#
    Skript vypíše stav synchronizace Azure ADconnect,
    provede pravidelnou nebo celou synchronizaci.
    Skript musí běžet na PC, kde je instalován Azure ADconnect.
#>
$volba = 0
Write-Host "volba 1: Zjištěnís tavu synchronizace"
Write-Host "volba 2: Spustí synchrnizaci"
Write-Host "volba 3: Spustí úplnou (iniciální) synchronizaci"
switch($volba)

$volba = Read-Host -Promt "Zadej volbu"
{
    1{Get-ADSyncScheduler}
    2{Start-ADSyncSyncCycle -PolicyType Delta}
    3{Start-ADSyncSyncCycle -PolicyType Initial}
}
Posted in: Windows server

Jak přenést či zálohovat role a funkce Windows Serveru?

Dnes si představíme malý PowerShell skript, který Vám pomůže přenést všechny role a funkce z jednoho serveru na druhý. Na takto připraveném serveru je možné následně využít nástrojů pro migraci serveru, které dokáže exportovat a importovat jednotlivé konfigrace různých rolí a funcí serveru. Základem ovšem zůstává mít instalované stejné role a funkce na starém i novém stroji a to jak vše provést na 2 spuštění sktriptu a přeneseníé jednoho TXT souboru si ukážeme.

Nejprve je potřeba si uložit následující skript:

Function MigraceRoliFunkci
{
    Param(
        [Parameter(Mandatory=$true)]
        [String]$soubor = "C:\Users\Public\features.txt",
        [Parameter(Mandatory=$false)]
        [Switch]$Import
    )
    if($Import)
    {
        $file = Get-Content $soubor;
        $radek = ($file.Count) - 3;
        $role = Get-Content $soubor -Tail $radek
        foreach ($f in $role)
        {
            Install-WindowsFeature -Name $f -IncludeManagementTools
        }
        Write-Host "Restartujte server co nejdříve!"
    }
    else
    {
        Get-WindowsFeature | Where-Object {$_. installstate -eq "installed"} | select name | Out-File -FilePath $soubor
        Write-Host "Vyzvednete si vygenerovany soubor pro import."
    }
}

Nyní jej můžeme spustit na starém serveru a následně zavolat funkci například takto:
MigraceRoliFunkci -soubor E:\funkce.txt
Nyní skriprt spustí export seznamu rolí a funkcí za našeho starého serveru na náš disk E do souboru funkce.txt.
Disk E přeneseme na nový server, kde pro zjednodušení bude mít také písmeno E, spustíme náš skript a opět budeme volat funkci:
MigraceRoliFunkci -soubor E:\funkce.txt -Import
Nyní naše funkce provede instalaci všech rolí a funkcí, které nalezne v souboru funkce.csv. Po dokončení instalace máme server připraven k importu nastavení, ale o tom až někdy jindy.

Posted in: Vývoj počítačů, Windows server

Auditování členství v Domain Admin

Skupina doménových administrátorů je skupinou velmi privilegovaných a citlivých účtů, tito uživatelé jsou prakticky pány celé sítě. Z toho důvodu se případní útočníci po tom, co se dostanou do sítě snaží přidat do této skupiny, což jim otevře prakticky neomezenou moc legitimní cestou. V tomto článku ukáži jednu možnost, která dokáže legitimním správcům dát informaci o tom, že se někdo přidal do této skupiny. PowerShellový skript pošle email a jediné co je potřeba, aby tento skript byl spuštěn spolu s operačním systémem doménového řadiče.

$ref=(Get-ADGroupMember -Identity "Domain Admins").Name
Start-Sleep -Seconds 86398
$diff=(Get-ADGroupMember -Identity "Domain Admins").Name
$date=Get-Date -Format F
$result=(Compare-Object -ReferenceObject $ref -DifferenceObject $diff | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject) -join ", "
#nastaveni prihlaseni k smtp serveru
$login = #dopln
$password = #dopln
$server = “smtp.office365.com” #smtp pro exchange online
$Port = 587
If ($result)
{
    $Predmet = "Admin Membership Changes | $result was added to the Group"
    $telo = "This alert was generated at $date"
    $From = #dopln
    $To = #dopln
    $SMTPMessage = New-Object System.Net.Mail.MailMessage($From,$To,$Predmet,$telo)
    $SMTPmessage.IsBodyHTML = $false
    $SMTPClient = New-Object Net.Mail.SmtpClient($server, $Port)
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($login, $password)
    $SMTPClient.EnableSsl = $true
    $SMTPClient.Send($SMTPMessage)
} 
Posted in: Windows 10, Windows 11, Windows 8 a 8.1

Nástroj pro dampování hesel z Mozila Firefox

Krom legitimního exportu je několik cest, jak získat z Firefoxu uložená hesla. Každého napadne přenesení profilu prohlížeče, ale tato metoda není cestou k úspěchu, i když vede k získání spousty zajímavých dat. Ale existují nástroje, které dokáží najít a obnovit zapomenutá hesla, případě hesla vykrádat. Jedním z takových nástrojů je také Firefox Password Decrypt.

Upozorňuji, že užití takovéhoto nástroje je legitimní pouze v případě, že máte poškozený Firefox a potřebujete získat svá vlastní data, nebo může posloužit v rámci pentestu.

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

Administrátorský modul Windows PowerShell

Dnes bych se zde rád podělil o svůj tahák, který mi od začátku roku usnadňuje administrátorskou rutinu. Jde o PowerShell modul, který jsem si před nedávnem napsal a zjednodušuje mnohé rutinní úkony v práci administrátora a ty, které nezjednodušuje alespoň obaluje do pěkné PowerShell syntaxe. Můj modul je všem bezplatně k dispozici, ale v souladu s níže uvedenými podmínkami.

Podmínky použití modulu

Modul je určen k volnému užití pro osobní potřebu a vzdělávání, volné užití se dále vztahuje
na školy vyjímaje vysokých a další vzdělávací instituce (výuka i administrace). Neziskové organizace mají zakázáno modul využívat. Firemní sektor je povinen emailem požádat o souhlas s využíváním modulu, ale i zde bude užívání po schválení autorem bezplatné (autor si vyhrazuje právo nepovolit užití dané firmě). Akademická půda (vysoké školy a vědecká pracoviště) stejně jako bankovní sektor mají přísný zákaz jakékoliv formy užití modulu (včetně výuky, školních a kvalifikačních prací, citování atd.).
Automaticky schválené využívání mají všichni členové komunity WUG bez ohledu na to, ve kterém odvětví působí, ale výjimka se vztahuje jmenovitě jen na ně.

Podmínky sdílení modulu

Modul je možné dále sdílet, ale pouze v původní podobě a s odkazem na jeho domovskou stránku.
Jakkoliv modifikovanou verzi modulu je zakázáno dále šířit. Modul musí být vždy šířen v podobě
zdrojového kódu v textu správy, nikdy jako příloha! Pokud chcete modul šíři kopírováním na USB disk,
je podmínkou formát TXT, který si příjemce převede na psm1 po seznámení se kódem modulu.

Odpovědnost autora

Autor nenese žádnou odpovědnost za případné škody související s užitím modulu! Každý uživatel je povinen seznámit se zdrojovým kódem a porozumět mu. Každé užití modulu probíhá na vlastní nebezpečí.

Přehled funkcí

  • Check-SystemFiles – zkontroluje systémové soubory (sfc a dism)
  • Start-Ping – příkaz ping
  • Check-FileSystem – zkontroluje souborový systém
  • Start-Trace – příkaz traceroute
  • Get-DC – ukáže informace o doménovém řadiči, vůči kterému proběhlo přihlášení a byly staženy politiky
  • Get-GPOreport – uloží na plochu report zpracování GPO pro danou relaci uživatele
  • Get-IPconfig – získá IP konfiguraci včetně veřejné IP adresy
  • Set-IPconfig – umožní nastavení IP adresy
  • Get-Log – vypíše události z Eventlogu
  • Check-AADjoin – zkontroluje zařazení počítače do Azure AD a vypíše informace o daném zařazení
  • CleanUp-Drive – vyčistí dočasné soubory a užije nástroj nativní cleanmgr k úklidu systému
  • Check-Computer – provede kontrolu stavu počítače (viz nápověda funkce a zdrojový kód)
  • Delete-PrintJob – smaže zaseknutou tiskovou frontu
  • Get-InstalledApps – vypíše všechny nainstalované aplikace (včetně MS Store aplikací)
  • Get-Cert – zobrazí nainstalované certifikáty uživatele nebo počítače
  • Get-DNS – zobrazí informace o DNS a DNS cache
  • Get-energi – zobrazí konfiguraci napájení a využívání energie, včetně stavu baterie notebooků
  • Get-Asociate – zobrazí asosciace programů a typů souborů
  • Get-RunningScripts – vypíše procesy běžících skriptů
  • Get-WiFiReport – vytvoří report o stavu signálu a využití Wi-Fi
  • Get-NetworkUseProcess – vypíše procesy, které využívají připojení do sítě
  • Open-Bios – restartuje počítač do BIOSu, nebo konfigurace UEFI
  • Seach-IPfromMAC – najde IP adresu zařízení v síti na základě jeho MAC adresy
  • Get-DupliciteFile – najde duplicitní soubory
  • Convert-Folder2ESD – umožní služku zkomprimovat do formátu ESD, nebo formát ESD vybalit do složky
  • Generate-Password – vygeneruje heslo požadovaných parametrů
  • Get-WindowsUpdateHistory – vypíše informace o nainstalovaných aktualizacích
  • Install-WinUpdates – nainstaluje aktualizace z Windows Update
  • Get-CertExport – nalezne exporty certifikátů ve formátu pfx, cer a pem
  • Get-BitlockerRecovery – zobrazí klíč pro obnovení nástroje Bitlocker
  • Get-ModuleInfo – zobrazí informace o modulu
  • Get-WhoIs – Vrátí informace o doméně nebo IP adrese z Whois systému
  • Clone-Folder – umí naklonovat složku, případně na souborové bázi volume
  • Delte-Disk – provede digitální skartaci dat na fyzickém disku, nebo jeho oddílu (disk označený písmenem v průzkumníku Windows)
  • Get-UserPasswordInfo – zobrazení informací o hesle uživatele (kdy bylo změněno, kdy bylo chybně zadáno apod.)
  • Get-KrbEncriptionTypes – Zobrazí, jaká šifrování jsou nakonfigurována na daném účtu v rámci protokolu kerberos
  • Get-KrbAccount – zobrazí informace o účtu krbtgt
  • Get-KrbTickets – vypíše aktuálně v paměti uložené tikety kerberosu pro přihlášeného uživatele a účet počítače
  • Get-AzureAdDevices – vypíše, která nedoménová zařízení má uživatel registrovaná v Azure AD
  • Test-AdUserPasswordQuality – najde v AD uživatele se stejným heslem a vypíše uýživatele, jejichž hesla nalezl v předloženém slovníku či databázi uniklých hesel, která byla funkci předána
  • Get-TimeServiceInfo – vypíše konfiguraci času, řasový server, poslední synchronizaci a opravy. někdy je nutné na nedoménových počítačích spustit w32tm, pokud je vrácena chyba
  • Set-Time – umožní nastavit systémový čas a datum, ručně, z časového serveru, nebo jen provést opravu zpoždění nebo předbíhání času o konkrétní hodnotu (např. o 2 minuty)
  • Remove-MsUniversalApp – odebere (i předinstalované) aplikace WUP z Windows 10
  • Convert-PasswodToNTLMhash – konvertuje heslo, nebo slovník plnotextových hesel, do slovníku NTLM hash
  • Set-AdUserMustChangePassword – vynutí změnu hesla doménovému uživateli pro jednoho uživatele, nebo všechny uživatele uvedené na seznamu
  • Get-TokenInfo – zobrazí informace obsažené v TGT nebo PRT týkající se uživatelského účtu
  • Set-ConsoleTitle – nastaví titulek spuštěné konzole
  • Find-ItemADS – nalezne a volitelně zobrazí obsah Alternate data streams
  • New-ItemADS – Vytvoří objekt Alternate data streams
  • Set-PSTranscription – Nastaví chování transkripce PowerShellu
  • Set-PSScriptBlockLogging – Zapne či vypne script block logging v PowerShellu
  • Get-CPUinfo – vypíše vybrané informace o procesoru
  • Get-InstallDate – vypíše datum a čas instalace

Stažení

Alternativní možnost stažení

Instalace

Stažením Archivu – pouze na Windows

  1. Stáhněte soubor AdminTools.zip
  2. Spusťte PowerShell jako správce
  3. Pomocí příkazu cd přejdete do adresáře, kde máte stažený zip s modulem
  4. Příkaz: Expand-Archive -Path .\AdminTools.zip -DestinationPath C:\Program Files\WindowsPowerShell\Modules\AdminTools

Zkopírováním zdrojového kódu

  1. Pomoví příkazu $env:PSModulePath #zjistěte adresáře pro uložení modulu
  2. Z výsledku si zvolte adresář, kam modul uložíte
  3. ve zvoleném adresáři vytvořte složku s názvem: AdminTools
  4. Uložte zdrojový kód ve formátu psm1 do složky AdminTools

Zdrojový kód

<#
.Synopsis
   kontrola systémovýh souborů.
.DESCRIPTION
   kontrola systémových souborů nativními nástroji scf a dism
.PARAMETER scannow
    Spustí kontrolu systémových souborů běžícího systému, vede na sfc /scannow
.PARAMETER verifyonly
    Provede kontrolu bez pokusů o opravu poškozeného souboru, vede na sfc /verifyonly
.PARAMETER Path
    Určuje cestu k souboru, který má být verifikován nebo opraven
.PARAMETER scanfile
    Nastavuje nástroj sfc do móduz kontroly konkrétního soubooru, vždy kombinován s parametrem Path
.PARAMETER offline
    Říká, že se bude verifikovat jiná, nežli běžící instance systému Windows, kombinuje se s parametry offbootdir a offwindir
.PARAMETER offbootdir
    U offline kopie systému Windows říká, který disk je její systémový
.PARAMETER offwindir
    U offline kopie systému Windows udává její systémový adresář
.PARAMETER store
    pomocí nástroje DISM provede sken a následně opravu systémových balíčů běžící kopie systému Windows
.EXAMPLE
   Check-SystemFiels -scannow
   provede příkaz sfc /scannow
.EXAMPLE
   Check-SystemFiels -verifyonly
   provede příkaz sfc /verifyonly - tedy pouze kontrolu bez oprav
.EXAMPLE
   Check-SystemFiels -scanfile -Path c:\windows\system32\kernel32.dll
   Provede kontrolu integrity a pokusí se o opravu souboru kernel32.dll
.EXAMPLE
   Check-SystemFiels -offline -scanfile -Path d:\windows\system32\kernel32.dll -offbootdir d: -offwindir d:\windows
   Provede kontrolu integrity a pokusí se o opravu souboru kernel32.dll z offline image na disku d:
.EXAMPLE
   Check-SystemFiels -store
   Provede kontrolu systému příkazem dism /online /cleanup-image /restorehealth
#>
function Check-SystemFiles
{
    Param
    (
        # nápověda
        [Parameter(ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [string] $path,

        # scannow
        [switch] $scannow,

        #verifikace
        [switch] $verifyonly,

        #kontrola souboru
        [switch] $scanfile,

        #offline kontrola
        [switch] $offline,

        #kontrola souboru
        [switch] $verifyfile,

        #offline boot adresář
        [string] $offbootdir,

        #offline winadresář
        [string] $offwindir,

        #oprava MS Store komponent
        [switch] $store
    )

    Begin
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        if($scanfile -and ($path -eq ''))
        {
            Write-Error 'Není uvedená cesta k ověřovanému souboru'
            Pause
        }elseif($verifyfile -and ($path -eq ''))
        {
            Write-Error 'Není uvedená cesta k ověřovanému souboru'
            Pause
        }elseif($offline -and (($path -eq '') -or ($offbootdir -eq '') -or ($offwindir -eq '')))
        {
            Write-Error 'Není uvedená cesta k některému z offline adresářů'
            Pause  
        }
    }
    Process
    {
        if($scannow)
        {
            $prikaz = 'sfc /scannow'
            Invoke-Expression -Command $prikaz
        }
        elseif ($verifyonly)
        {
           $prikaz = 'sfc /verifyonly' 
           Invoke-Expression -Command $prikaz
        }
        elseif ($scanfile)
        {
            $prikaz = 'sfc /scanfile=' + $path
            Invoke-Expression -Command $prikaz
        }
        elseif($verifyfile)
        {
            $prikaz = 'sfc /VERIFYFILE=' + $path
            Invoke-Expression -Command $prikaz
        }
        elseif($offline)
        {
            $prikaz = 'sfc /scanfile=' + $path + '/OFFBOOTDIR=' + $offbootdir + '/OFFWINDIR=' + $offwindir
            Invoke-Expression -Command $prikaz
        }elseif($store)
        {
            $prikaz = 'DISM /Online /cleanup-image /ScanHealth'
            Invoke-Expression -Command $prikaz
            $prikaz = 'dism /online /cleanup-image /restorehealth'
            Invoke-Expression -Command $prikaz
        }
    }
    End
    {
    }
}
<#
.Synopsis
   příkaz ping
.DESCRIPTION
   Long description
.PARAMETER cil
    určuje adresu, nebo doménové méno, cíle dotazu ping
.PARAMETER interval
    určuje po jako dobu se bude opakovat dotaz ping na cíl
.PARAMETER pocet
    určuje počet dotazů ping, které budou zadány
.PARAMETER TTL
    nastavuje hodnotu TTL u každého paketu dotazu ping, který bude odeslán
.PARAMETER dc
    pošle 10 ping dotazů vůči použitému přihlašovacímu serveru
.PARAMETER DoUkonceni
    bude opakovat dotazy ping na cíl tak dlouho, dokud uživatel dotazování nezruší
.PARAMETER nefragmentovat
    určuje, že pakety dotazu nemají být po cestě fragmentovány na úrovni sítě
.PARAMETER IPv4
    říká, že má být použit protokol IP verze 4
.PARAMETER IPv6
    říká, že má být použit protokol IP verze 6
.EXAMPLE
   Start-Ping -interval 2 -cil google.cz
   Po dobu 2 minut bude posílat sady 10 ping dotazů na google.cz
.EXAMPLE
   Start-Ping -cil google.cz
   Poižije nativní systémový nástroj ve tvaru: ping google.cz
.EXAMPLE
   Start-Ping -pocet 10 -TTL 120 -cil google.cz
   Vyšle 10 ping požadavků na google.cz, kdy každý paket bude mít TTL 120
.EXAMPLE
   Start-Ping -DC -cil localhost
   Vyšle 10 ping požadavků na přihlašovací server (u doménových PC na použitý řadič).

#>
function Start-Ping
{
    Param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        $cil,

        # do ukončení příkazem
        [switch] $DoUkonceni,

        #počet dotazů
        [switch] $pocet,

        #doba provádění
        [int] $interval = 0,

        #Nefragmentovat
        [switch] $nefragmentovat,

        #TTL
        [int] $ttl = 500,

        #IPv4
        [switch] $IPv4,

        #IPv6
        [switch] $IPv6,

        #přihlašovací server
        [switch] $DC

    )

    Begin
    {
    }
    Process
    {
        if($DoUkonceni)
        {
            Invoke-Expression "ping -t -i $TTL $cil"
        }elseif($IPv4)
        {
            Invoke-Expression "ping -4 $cil"
        }elseif($IPv6)
        {
            Invoke-Expression "ping -6 $cil"
        }elseif($interval -gt 0)
        {
            $konec = (Get-Date).AddMinutes($interval)
            do
            {
                Invoke-Expression "ping -n 10 $cil"    
            }while((Get-Date) -lt $konec)
        }elseif($pocet)
        {
            Invoke-Expression "ping -n $pocet -i $TTL $cil"
        }elseif($nefragmentovat)
        {
            Invoke-Expression "ping -4 -f -i $TTL $cil"
        }elseif($DC)
        {
            ping $Env:LOGONSERVER.Substring(2)
        }else
        {
            Invoke-Expression "ping $cil"
        }
    }
    End
    {
    }
}
<#
.Synopsis
   Kontrola systému souborů nástrojem chkdsk
.DESCRIPTION
   Long description
.PARAMETER Disk
    udává, které jednoky se bude kontrola týkat, papř. C:
.PARAMETER Cisto
    provede označení FAT32 za čistý po dokončení kontroly
.PARAMETER System
    Provede kontrolu systémového disku, obvykle C:
.PARAMETER Profil
    Provede kontrolu disku, na kterém je profil uživatele, obvykle C:, ale může být např.: D:
.PARAMETER OnlineScan
    Online sken pro NTFS
.EXAMPLE
   Check-FileSystem -System
   Při dalším restartu provede kontrolu systémového disku.
   Example of how to use this cmdlet
.EXAMPLE
   Check-FileSystem -Disk D: -Cisto
   Zkontroluje disk D, který je FAT32, FAT, či exFAT a pokud je bez chyb, označí jej za čistý.
.EXAMPLE
   Check-FileSystem -Disk D:
   Zkontroluje disk D: a opraví chyby.
.EXAMPLE
   Check-FileSystem -Disk E: -OnlineScan
   Provede online sken disku E: s nevyšším možným přidělením výkonu.
.EXAMPLE
   Check-FileSystem -Profil
   Zkontroluje disk obsahující profil uživatele, který kontrolu spustil.
   Pokud jde o systémový disk, bude kontrola provedena při dalším restartu.
   Součástí kontroly je také oprava chyb.
#>
function Check-FileSystem
{
    Param
    (
        # cílová jednotka
        [Parameter(ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [string] $Disk,

        # Online scan pro NTFS
        [switch] $OnlineScan,

        #Označení FAT po online skenu za čisté
        [switch] $Cisto,

        #Sken systémové jednotky
        [switch] $System,

        #jednotka s profilem uživatele
        [string] $Profil
    )

    Begin
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        if(-not ($System -or $Profil) -and $Disk -eq "")
        {
            Throw "Parametr disk je v této konfiguraci povinný!"
        }
    }
    Process
    {
        if($OnlineScan)
        {
            Invoke-Expression "chkdsk $Disk /scan /perf"
        }
        elseif($Cisto)
        {
            $Drive = $Disk.Substring(0,1)
            $DriveType = (Get-Volume -DriveLetter $Drive | select FileSystemType).FileSystemType
            if(($DriveType -ieq "FAT32") -or ($DriveType -ieq "exFAT") -or ($DriveType -ieq "FAT"))
            {
                Invoke-Expression "chkdsk $Disk /markclean"
            }else
            {
                Write-Error "Tento příkaz podporuje pouze FAT, FAT32 a exFAT"
            }  
        }elseif($System)
        {
            Write-Warning "Kontrola proběhne při restartu"
            Invoke-Expression "echo y | chksdk $env:SystemDrive /F"
        }elseif($Profil)
        {
            if($env:HOMEDRIVE -eq $env:SystemDrive)
            {
                Write-Warning "Kontrola proběhne při restartu"
            }
            Invoke-Expression "echo y | chksdk $env:HOMEDRIVE /F"
        }
        else
        {
            if($Disk -ieq $env:SystemDrive)
            {
                Write-Warning "Kontrola proběhne při restartu"
            }
            Invoke-Expression "echo y | chksdk $Disk /F"
        }
    }
    End
    {
    }
}
<#
    .Synopsis
       Práce s nástrojem Tracing Route
    .DESCRIPTION
       Práce s nástrojem Tracing Route
    .PARAMETER Cil
        udává cíl trasování
    .PARAMETER TimeOut
        udává timeout pořadavku
    .PARAMETER Hop
        udává, kolik přeskoků je povoleno k dokončení požadavku (kolika směrovači se smí projít)
    .EXAMPLE
       Start-Trace -Cil google.cz
       Provede tracert na google.cz s maximálně 50 hopy a timeoutem 1 minuta.
    .EXAMPLE
       Start-Trace -Cil google.cz -TimeOut 2000 -Hop 30
       Provede tracert na google.cz s maximálně 30 hopy a TimeOutem 2000 ms.
    .EXAMPLE
       Start-Trace -Cil google.cz -IPv6
       Provede tracert na google.cz s maximálně 50 hopy a timeoutem 1 minuta po IPv6.
    #>
    function Start-Trace
    {
        Param
        (
            # cíl
            [Parameter(Mandatory=$true,
                       ValueFromPipelineByPropertyName=$true,
                       Position=0)]
            $Cil,
    
            # Počet Hopů
            [int]
            $Hop = 50,

            #Time out
            $TimeOut = 60000,

            #IPv6
            [switch] $IPv6
        )
    
        Begin
        {
        }
        Process
        {
            if($IPv6)
            {
                Invoke-Expression "tracert -h $Hop -w $TimeOut -6 $Cil" 
            }else
            {
                Invoke-Expression "tracert -h $Hop -w $TimeOut -4 $Cil"
            }
        }
        End
        {
        }
    }
<#
.Synopsis
   Výpis informací o dostupných doménových řadičích
.DESCRIPTION
   Výpis informací o dostupných doménových řadičích
.EXAMPLE
   Get-DC
   Vypíše dostupné doménové řadiče pro doménu, ve které je PC
#>
function Get-DC
{
    Begin
    {
        $domena = (Get-WmiObject win32_computersystem).Domain
        if($domena -ieq "WORKGROUP")
        {
            Throw "Počítač není v doméně!"
        }
    }
    Process
    {
        $vyraz = "nslookup 'set type=all' '_ldap._tcp.dc._msdcs." + $domena + "'"
        Invoke-Expression $vyraz
    }
    End
    {
    }
}
<#
.Synopsis
   Generování reportu GPO na plochu
.DESCRIPTION
   Generování reportu GPO na plochu
.EXAMPLE
   Get-GPOreport
   Vygenruje report GPO na plochu
#>
function Get-GPOreport
{
    Begin
    {
        $domena = (Get-WmiObject win32_computersystem).Domain
        if($domena -ieq "WORKGROUP")
        {
            Throw "Počítač není v doméně!"
        }
    }
    Process
    {
        gpresult /h "$env:USERSPROFILE\Desktop\GPO_report.html"
        Write-Warning "Report je uložen na ploše"
    }
    End
    {
    }
}
<#
.Synopsis
   Vypisuje IP konfiguraci a informace
.DESCRIPTION
   Vypisuje IP konfiguraci a informace
.PARAMETER PublicIP
    Vrátí veřejnou IP adresu zařízení
.PARAMETER Displaydns
    Vrátí informace o nastavených DNS serverech
.EXAMPLE
   Get-IPconfig -PublicIP
   Vrátí veřejnou IP adrsu a informace o ISP
.EXAMPLE
   Get-IPconfig -Displaydns
   Vypíše informace o všech dostupných NDS servech
.EXAMPLE
   Get-IPconfig
   Vypíše IP konfiguraci jako ipconfig /all
#>
function Get-IPconfig
{
    Param
    (
        # Zjištění veřejné IP adresy
        [Parameter(ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [switch] $PublicIP,

        # Param2 help description
        [switch] $Displaydns
    )

    Begin
    {
    }
    Process
    {
        if($PublicIP)
        {
            Invoke-RestMethod -Uri ('http://ipinfo.io/'+(Invoke-WebRequest -uri http://ifconfig.me/ip).Content)
        }elseif($Displaydns)
        {
            Invoke-Expression "ipconfig /displaydns"
        }else
        {
            Invoke-Expression "ipconfig /all"
        }
    }
    End
    {
    }
}
<#
.Synopsis
   Nastavení IP konfigurace
.DESCRIPTION
   Nastavení IP konfigurace
.EXAMPLE
   Set-IPconfig -Renew
   Obnový IP konfiguraci z DHCP serveru (včetně zápůjčky Adresy)
.EXAMPLE
   Set-IPconfig -DNSFlush
   Vyprázdní DNS cache
.EXAMPLE
   Set-IPconfig -DHCP
   NAstaví připojení na dynamickou konfiguraci z DHCP a možností zachovat statická DNS
.EXAMPLE
   Set-IPconfig -DNS -DNS1 1.1.1.2 -DNS2 1.0.0.2
   NAstaví primární DNS na 1.1.1.2 a sekundární DNS na 1.0.0.2
.EXAMPLE
   Set-IPconfig -Static -IP 192.168.1.12 -Maska 255.255.255.0 -Brana 192.168.1.1 -DNS1 1.1.1.2 -DNS2 1.0.0.2
   NAstaví připojení na statickou konfiguraci s uvedenými parametry
#>
function Set-IPconfig
{
    Param
    (
        # vrácení IP adresy
        [Parameter(
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [switch] $release,

        #konkrétní síťové rozhraní
        [string] $Adapter,

        #nové vyžádání IP adresy z DHCP
        [switch] $Renew,

        #Vyprázdnění DNS cache
        [switch] $DNSFlush,

        #nastavení adaptéru na používání dhcp
        [switch] $DHCP,

        #Nastavení adaptéru na statickou hodnotu
        [switch] $Static,

        #Statická adresa
        [string] $IP,

        #Maska
        [string] $Maska,

        #Brána
        [string] $Brana,

        #Primární DNS
        [string] $DNS1,

        #Sekundární DNS
        [string] $DNS2,

        #Nastavení DNS
        [switch] $DNS
    )

    Begin
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        if($Static -and (($IP -eq '')-or ($Maska -eq '')-or ($Brana -eq '')-or ($DNS1 -eq '')-or ($DNS2 -eq '')))
        {
            Throw "IP konfigurace musí být kompletní"
        }
        if($DNS -and (($DNS1 -eq '') -or ($DNS2 -eq '')))
        {
            Throw "Pro nastavení DNS musí být servery uvedeny"
        }
    }
    Process
    {
        if($release)
        {
            Invoke-Expression "ipconfig /release $Adapter"
        }elseif($Renew)
        {
            Invoke-Expression "ipconfig /renew"
        }elseif($DNSFlush)
        {
            Invoke-Expression "ipconfig /flushdns"
        }elseif($DHCP)
        {
            $index = -1
            Get-NetIPInterface | where AddressFamily -eq "IPv4" | select InterfaceAlias, ifIndex | Format-Table
            $index = Read-Host -Prompt "Zadej ifIndex požadovaného adaptéru"
            Remove-NetIPAddress -InterfaceIndex $index -Confirm:$false
            Remove-NetRoute -InterfaceIndex $index -Confirm:$false
            Set-NetIPInterface -InterfaceIndex $index -Dhcp Enabled
            $preklad = Read-Host -Prompt "Přeješ si změnit také DNS servery?(A/N)"
            if(($preklad -ieq 'a') -or ($preklad -ieq 'y'))
            {
                Get-NetIPInterface -InterfaceIndex $index | Set-DnsClientServerAddress -ResetServerAddresses
            }
            Get-NetIPConfiguration -InterfaceIndex $index -Detailed
        }elseif($DNS)
        {
            $index = -1
            Get-NetIPInterface | where AddressFamily -eq "IPv4" | select InterfaceAlias, ifIndex | Format-Table
            $index = Read-Host -Prompt "Zadej ifIndex požadovaného adaptéru"
            Set-DnsClientServerAddress -InterfaceIndex $index -ServerAddresses ($DNS1,$DNS2)
        }
        elseif($Static)
        {
            $index = -1
            Get-NetIPInterface | where AddressFamily -eq "IPv4" | select InterfaceAlias, ifIndex | Format-Table
            $index = Read-Host -Prompt "Zadej ifIndex požadovaného adaptéru"
            Remove-NetIPAddress -InterfaceIndex $index -Confirm:$false
            Remove-NetRoute -InterfaceIndex $index -Confirm:$false
            $mask = $Maska.split(".")
            $cidr = [int] 0
            $octet = [int] 0
            foreach ($octet in $mask) 
            {
                if ($Octet -eq 255){$CIDR += 8}
                if ($Octet -eq 254){$CIDR += 7}
                if ($Octet -eq 252){$CIDR += 6}
                if ($Octet -eq 248){$CIDR += 5}
                if ($Octet -eq 240){$CIDR += 4}
                if ($Octet -eq 224){$CIDR += 3}
                if ($Octet -eq 192){$CIDR += 2}
                if ($Octet -eq 128){$CIDR += 1}
            }
            New-NetIPAddress -InterfaceIndex $index -IPAddress $IP -AddressFamily IPv4 -PrefixLength $cidr -DefaultGateway $Brana
            Set-DnsClientServerAddress -InterfaceIndex $index -ServerAddresses ($DNS1,$DNS2)
            Get-NetIPConfiguration -InterfaceIndex $index -Detailed
        }else
        {
            Write-Error "Neplatné volání"
        }
    }
    End
    {
    }
}
<#
.Synopsis
   Výpis událostí z eventlogů
.DESCRIPTION
   Výpis událostí z eventlogů
.PARAMETER Dni
    udává, za kolk dní zpátky je výpis požadován
.PARAMETER DC
    do výpisu přidává záznamy týkající se služby Active Directory
.PARAMETER Zaloha
    Do výpisu pidává informace o stavu nativního zálohování na Windows serveru
.EXAMPLE
   Get-Log -Dni 2
   Vypíše události z Evenlogů za posledních 48 hodin od zadání
.EXAMPLE
   Get-Log -Dni 2 -DC
   Vypíše události z Eventlogů za posledních 48 hodin a zahrnuje logy týkající se role AD DS
#>
function Get-Log
{
    Param
    (
        # Počet dní zpět, za kolik se události vypíší
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [int] $Dni = 1,

        # Doménové řadiče
        [switch] $DC,

        # Zálohy
        [switch] $Zaloha
    )

    Begin
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        $filterXml = ‘<QueryList>
            <Query Id="0" Path="System">
                <Select Path="System">*[System[(Level=1  or Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) &lt;= 86400000]]]</Select>
                <Suppress Path="System">*[System[(EventID=1341 or EventID=10020 or EventID=1343 or EventID=1020 or EventID=1376)]]</Suppress>
            </Query>
        </QueryList>’
        $filterXml2 = '<QueryList>
            <Query Id="0" Path="Windows PowerShell">
                <Select Path="Windows PowerShell">*[System[(EventID=400) and TimeCreated[timediff(@SystemTime) &lt;= 86400000]]]</Select>
            </Query>
        </QueryList>'
    }
    Process
    {
        Get-WinEvent -logName "security" -FilterXPath "*[System[band(Keywords,4503599627370496)]]" | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(($Dni)*(-1))} | Format-List 
        Get-WinEvent -logName "Application" -FilterXPath "*[System[Level=1  or Level=2 or Level=3]]" | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(($Dni)*(-1))} | Format-List
        Get-WinEvent –FilterXml $filterXml  | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(($Dni)*(-1))} | Format-List
        Get-WinEvent -logName "Windows PowerShell" -FilterXPath "*[System[Level=1  or Level=2 or Level=3]]" | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(($Dni)*(-1))} | Format-List
        Get-WinEvent -logName "Windows PowerShell" -FilterXPath "*[System[(EventID=400)]]" | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(($Dni)*(-1))} | Format-List
        if($DC)
        {
            Get-WinEvent -logName "Directory Service" -FilterXPath "*[System[Level=1  or Level=2 or Level=3]]" | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(($Dni)*(-1))} | Format-List
            Get-WinEvent -logName "DNS Server" -FilterXPath "*[System[Level=1  or Level=2 or Level=3]]" | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(-1)} | ConvertTo-Html
            Get-WinEvent -logName "Microsoft-ServerManagementExperience" -FilterXPath "*[System[Level=1  or Level=2 or Level=3]]" | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(($Dni)*(-1))} | Format-List
            Get-WinEvent -logName "DFS Replication" -FilterXPath "*[System[Level=1  or Level=2 or Level=3]]" | select ProviderName, TimeCreated,  Id, LevelDisplayName, Message | where {($_.TimeCreated ).date -GE (get-date).AddDays(($Dni)*(-1))} | Format-List
        
        }
        if($Zaloha)
        {
            Get-WBJob -Previous $Dni #Windows server zaloha
        }
    }
    End
    {
    }
}
<#
.Synopsis
   Vypíše informace o zařazení zařízení z Azure AD
.DESCRIPTION
   Vypíše informace o zařazení zařízení z Azure AD
.EXAMPLE
   Check-AADjoin
   PRovede kompletní výpis informací o vazbě zařízení na Azure AD
#>
function Check-AADjoin
{        
    Begin
    {
    }
    Process
    {
        Invoke-Expression "dsregcmd /status"
    }
    End
    {
    }
}
<#
.Synopsis
   Vyčistí z disku dočasné soubory a nepotřebné soubory, které systém uvolní
.DESCRIPTION
   Vyčistí z disku dočasné soubory a nepotřebné soubory, které systém uvolní
.EXAMPLE
   CleanUp-Drive
   Spustí šištění disku
#>
function CleanUp-Drive
{
    Param
    (
    )
    Begin
    {
    }
    Process
    {
        gci $env:TEMP -Recurse | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
        gci C:\Windows\Temp -Recurse | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
        gci C:\Windows\SoftwareDistribution\Download -Recurse | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
        Start-Process -FilePath cleanmgr.exe -ArgumentList verylowdisk -NoNewWindow
        Start-Process -FilePath cleanmgr.exe -ArgumentList AUTOCLEAN -NoNewWindow
    }
    End
    {
    }
}
<#
.Synopsis
   Nástroj pro rychlou kontrolu počítače
.DESCRIPTION
   Provede rychlou kontrolu počítače
.PARAMETER komplet
    Přepne kontrolu a opravy do hloubkového módu
.PARAMETER domena
    Při kontrole začlení validaci konfigurace související s doménou, jako je GPO report, informace o seřízení času, nebo doménových řadičích
.PARAMETER DC
    Upravuje kontrolu s ohledem na to, že běží na doménovém řadiči.
.EXAMPLE
   Check-Computer
   Základní kontrola počítače a získání informací o zařízení
.EXAMPLE
   Check-Computer -komplet
   Hlubší kontrola počítače a získání informací o zařízení
.EXAMPLE
   Check-Computer -Domena
   Základ kontrola doménového počítače a získání informací o zařízení
.EXAMPLE
   Check-Computer -Domena -komplet
   Hlubší kontrola doménového počítače a získání informací o zařízení
.EXAMPLE
   Check-Computer -DC
   Základní kontrola doménového řadiče a získání informací o zařízení
#>
function Check-Computer
{
    Param
    (
        # Doménový PC
        [Parameter(ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [switch] $Domena,

        # DC
        [switch] $DC,

        # Komplexní
        [switch] $komplet
    )

    Begin
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        New-Item -Path $env:USERPROFILE\Desktop\Log_Check-Computer.txt -ItemType File -Force
        $cesta = "$env:USERPROFILE\Desktop\Log_Check-Computer.txt"
    }
    Process
    {
        Write-Host "informace budou uloženy do: $cesta"
        Write-Host "Získávám systémové informace..."
        Write-Host "Systémové informace:" | Out-File $cesta -Append
        Write-Host "" | Out-File $cesta -Append
        Get-ComputerInfo | select WindowsCurrentVersion, WindowsProductName, WindowsRegisteredOwner, WindowsVersion, BiosBIOSVersion, BiosStatus, CsBootupState, CsCaption, CsDNSHostName, CsDomain, CsDomainRole, CsHypervisorPresent, CsManufacturer, CsModel, CsProcessors, CsUserName, OsBuildNumber, OsHotFixes, OsLanguage | Out-File $cesta -Append
        Write-Host "Kontroluji systémové soubory..."
        Write-Host "Kontrola systémových souborů:" | Out-File $cesta -Append
        Write-Host "" | Out-File $cesta -Append
        Check-SystemFiles -scannow | Out-File $cesta -Append
        Write-Host "Zkouším připojení k lokální síti a internetu..."
        Write-Host "Zkouška internetové konektivity:" | Out-File $cesta -Append
        Write-Host "" | Out-File $cesta -Append
        $brana = Get-NetIPConfiguration | Foreach IPv4DefaultGateway | select NextHop
        ping $brana.NextHop | Out-File $cesta -Append
        Start-Ping -cil google.com | Out-File $cesta -Append
        Start-Ping -cil office.com | Out-File $cesta -Append
        Write-Host "Zkouška dostupnosti kořenových DNS domény CZ:" | Out-File $cesta -Append
        Start-Ping -cil 193.17.47.1 | Out-File $cesta -Append
        Start-Ping -cil 185.43.135.1 | Out-File $cesta -Append
        Write-Host "Sumarizuji informace o nastavení sítě..."
        Write-Host "Výpis síťové konfigurace:" | Out-File $cesta -Append
        Write-Host "" | Out-File $cesta -Append
        Get-IPconfig | Out-File $cesta -Append
        Write-Host "Analyzuji eventlogy..."
        Write-Host "Výpis z logů za poslední týden:" | Out-File $cesta -Append
        Write-Host "" | Out-File $cesta -Append
        Get-Log -Dni 7 | Out-File $cesta -Append
        Write-Host "Čistím disk..."
        CleanUp-Drive
        if($komplet)
        {
            Write-Host "Připravuji a provádím kontrolu souborového systému..."
            Write-Host "Kontrola souborového systému:" 
            Check-FileSystem -System
            Check-FileSystem -Profil
            Write-Host "Provádím detailní kontrolu balíčků systému Windows..."
            Write-Host "Hlubší kontrola systémových souborů:" 
            Check-SystemFiles -store
            Write-Host "Provádím detailní analýzu konektivity do internetu..."
            Write-Host "Podrobnější info o konektivitě:" | Out-File $cesta -Append
            Start-Trace -Cil google.cz | Out-File $cesta -Append
            Get-IPconfig -PublicIP | Out-File $cesta -Append
            Write-Host "Získávám informace o stavu baterie a využití napájení..."
            Get-energi -baterie | Out-File $cesta -Append
            Write-Host "Získávám informace o konfiguraci zařazení do Azure AD..."
            Check-AADjoin | Out-File $cesta -Append
            Write-Host "Získám informace o certifikátech účtu počítače..."
            Get-Cert -pocitac | Out-File $cesta -Append
            Write-Host "Získávám informace o využití a stavu Wi-Fi připojení..."
            Get-WiFiReport | Out-File $cesta -Append
            Write-Host "Vyhledávám nainstalované aktualizace z Windows update..."
            Write-Host "Informace o nainstalovaných aktualizacích" | Out-File $cesta -Append
            Get-WindowsUpdateHistory | Out-File $cesta -Append
            Write-Host "Získám informace o přihlaování uživatele..."
            Write-Host "Informace o hesle uživatele" | Out-File $cesta -Append
            Get-UserPasswordInfo -login $env:USERNAME -domena $env:USERDOMAIN | Out-File $cesta -Append
            Get-UserPasswordInfo -login $env:USERNAME | Out-File $cesta -Append
            Write-Host "Získávám informace o nastavení času systému Windows..."
            Write-Host "Informace o čase a jeho seřízení"
            Get-TimeServiceInfo | Out-File $cesta -Append
        }
        if($Domena)
        {
            Write-Host "Získávám informace o doménovém řadiči a aplikovaných politikách..."
            Get-DC | Out-File $cesta -Append
            Start-Ping -DC -cil localhost | Out-File $cesta -Append
            $brana = Get-NetIPConfiguration | Foreach IPv4DefaultGateway | select NextHop
            ping $brana.NextHop | Out-File $cesta -Append
            Get-GPOreport | Out-File $cesta -Append
            Write-Host "Získávám informace o Zařazení do AAD..."
            Check-AADjoin | Out-File $cesta -Append
            Write-Host "Instaluji dostupné aktualizace Windows..."
            Install-WinUpdates
        }
        if($DC)
        {
            Write-Host "Analyzuji eventlog..."
            Get-Log -Dni 7 -DC | Out-File $cesta -Append
            Write-Host "Získávám informace o AAD..."
            Check-AADjoin | Out-File $cesta -Append
            Write-Host "Získávám informace o konektivitě..."
            $brana = Get-NetIPConfiguration | Foreach IPv4DefaultGateway | select NextHop
            ping $brana.NextHop | Out-File $cesta -Append
            Write-Host "Získávám informace o napájení..."
            Get-energi | Out-File $cesta -Append
        }
        pause
        if($komplet)
        {
            Write-Warning "Počítač bude restarován, před pokračování svou práci uložte!"
            Read-Host -Prompt "Press enter to continue..."
            Install-WinUpdates
        }
    }
    End
    {
    }
}
<#
.Synopsis
   Smaže tiskovou frontu
.DESCRIPTION
   Long description
.EXAMPLE
   Delete-PrintJob
   Smaže tiskovou frontu a resetuje službu tiskového serveru
#>
function Delete-PrintJob
{
    Stop-Service spooler
    Remove-Item $env:SystemRoot\system32\printers\*.shd
    Remove-Item $env:SystemRoot\system32\printers\*.spl
    Start-Service spooler
}
<#
.Synopsis
   Vypíše informace o nainstalovaných aplikacích
.DESCRIPTION
   Vypíše informace o nainstalovaných Win32 aplikacích a MS Store balíčcích
.EXAMPLE
   Get-InstalledApps
   Provede výpis do svou gridových zobrazní
#>
function Get-InstalledApps
{
    #výpis win32 aplikací
    Get-CimInstance -ClassName win32_product | select name, packagename, installdate | Out-GridView
    #Výpis MS Store aplikací
    Get-AppPackage -AllUsers | select Name, Publisher, User | Out-GridView
}
<#
.Synopsis
   Zobrazí certifikáty uživatele a počítače
.DESCRIPTION
   Zobrazí certifikáty uživatele a počítače
.PARAMETER pocitac
    Přepne zdroj pro získání certifikátů na účet počítače.
.EXAMPLE
   Get-Cert
   Provede výpis certifikátů uživatele
.EXAMPLE
   Get-Cert -pocitac
   Provede výpis certifikátů počítače
#>
function Get-Cert
{
    Param
    (
        # Počítač
        [switch] $pocitac
    )
    if($pocitac)
    {
        gci Cert:\LocalMachine\My | select Subject, FriendlyName, EnhancedKeyUsageList, NotAfter, NotBefore, HasPrivateKey, SerialNumber, Issuer, Thumbprint | Out-GridView
    }
    else
    {
        gci Cert:\CurrentUser\My | select Subject, FriendlyName, EnhancedKeyUsageList, NotAfter, NotBefore, HasPrivateKey, SerialNumber, Issuer, Thumbprint | Out-GridView
    }
}
<#
.Synopsis
   Nalezne IP adresu dle jeho MAC adresy
.DESCRIPTION
   Nalezne IP adresu dle jeho MAC adresy ve stejné síti, nebo rautované síti
.PARAMETER mojesit
    Nastavuje, že oblastí hledání je IP rozsah, ve kterém je zařízení, které se ptá.
.PARAMETER ip
    Nastavuje IP adresu sítě kategorie C, kde se má hledat. požadavkem je, aby mezi zařízením a zařízeními v cílové síti byl propustný příkaz ping.
.PARAMETER mac
    Udává MAC adresu zařízení, které je hledáno
.EXAMPLE
   Seach-IPfromMAC -mojesit -mac d4-ca-6d-6d-b3-5d
   Zobrazí IP adresu zařízení s MAC adresou d4-ca-6d-6d-b3-5d v stejné síti, jako je moje zařízení
.EXAMPLE
   Seach-IPfromMAC -ip 192.168.0.1 -mac d4-ca-6d-6d-b3-5d
   Zobrazí IP adresu zařízení s MAC adresou d4-ca-6d-6d-b3-5d v síti 192.168.0.0/24, kam má moje zařízení dosah
#>
function Seach-IPfromMAC
{
    param
    (
        [Parameter(Mandatory=$true)][string] $mac,
        [switch] $mojesit,
        [string] $ip
    )
    if($mojesit)
    {
        $brana = Get-NetIPConfiguration | Foreach IPv4DefaultGateway | select NextHop
        $part = $brana.NextHop.ToString().Split(".")
        $sit = $part.GetValue(0)+"."+$part.GetValue(1)+"."+$part.GetValue(2)
        [int]$start = 1
        for($start -eq 1, $start -eq 255, $start++)
        {
            $adresa = $sit+"."+$start
            Invoke-Expression "ping -n 1 $adresa"
        }
        $mac.Replace(":","-")
        $mac.ToLower()
        arp -a | findstr "$mac" 
    }
    else
    {
        $part = $ip.NextHop.ToString().Split(".")
        $sit = $part.GetValue(0)+"."+$part.GetValue(1)+"."+$part.GetValue(2)
        [int]$start = 1
        for($start -eq 1, $start -eq 255, $start++)
        {
            $adresa = $sit+"."+$start
            Invoke-Expression "ping -n 1 $adresa"
        }
        $mac.Replace(":","-")
        $mac.ToLower()
        arp -a | findstr "$mac"
    }
}
<#
.Synopsis
   Zobrazí DNS záznamy
.DESCRIPTION
   Zobazí DNS záznamy v paměti počítače, ale také záznamy o konkrétní doméně
.PARAMETER cache
    slouží k výpisu cache DNS v počítači
.PARAMETER domena
    slouží k zadání domény, pro kteru je třeba získat DNS záznamy.
.PARAMETER DNS
    slouží ke specifikaci IP adresy DNS serveru, který má zpracovat DNS dotaz
.PARAMETER mx
    slouží k získání mx záznamu z DNS
.PARAMETER TXT
    slouží k získání txt záznamů z DNS
.PARAMETER ns
    slouží k získání ns záznamů z DNS
.PARAMETER cname
    slouží k získání cname záznamů z DNS
.PARAMETER dname
    slouží k získání dname záznamů z DNS
.PARAMETER vse
    slouží k získání všech dostupných typů záznamů z DNS
.EXAMPLE
   Get-DNS -cache
   Zobrazí DNS záznamy v paměti počítače
.EXAMPLE
   Get-DNS -domena bing.com
   Zobtazí A a AAA záznamy domény bing.com s využitím systémového DNS
.EXAMPLE
   Get-DNS -domena bing.com -txt -DNS 1.1.1.1
   Zobtazí TXT záznamy domény bing.com s využitím DNS serveru 1.1.1.1
.EXAMPLE
   Get-DNS -domena bing.com -txt
   Zobtazí TXT záznamy domény bing.com s využitím systémového DNS
#>
Function Get-DNS
{
    Param
    (
        [string] $domena,
        [string] $DNS,
        [switch] $cache,
        [switch] $mx,
        [switch] $ns,
        [switch] $cname,
        [switch] $dname,
        [switch] $txt,
        [switch] $vse
    )
    if($cache)
    {
        Invoke-Expression "ipconfig /displaydns"
    }
    if(($domena -eq "") -and ($cache -eq $false))
    {
        Write-Error "Chybné zadání"
    }
    if($DNS)
    {
        if($mx)
        {
            Resolve-DnsName $domena -Type MX -Server $DNS
        }
        if($ns)
        {
            Resolve-DnsName $domena -Type NS -Server $DNS
        }
        if($cname)
        {
            Resolve-DnsName $domena -Type CNAME -Server $DNS
        }
        if($dname)
        {
            Resolve-DnsName $domena -Type DNAME -Server $DNS
        }
        if($txt)
        {
            Resolve-DnsName $domena -Type TXT -Server $DNS
        }
        if($vse)
        {
            Resolve-DnsName $domena -Type ALL -Server $DNS
        }
    }
    else
    {
      if($mx)
        {
            Resolve-DnsName $domena -Type MX
        }
        if($ns)
        {
            Resolve-DnsName $domena -Type NS
        }
        if($cname)
        {
            Resolve-DnsName $domena -Type CNAME
        }
        if($dname)
        {
            Resolve-DnsName $domena -Type DNAME
        }
        if($txt)
        {
            Resolve-DnsName $domena -Type TXT
        }
        if($vse)
        {
            Resolve-DnsName $domena -Type ALL
        }
    }
    Resolve-DnsName $domena 
}
<#
.Synopsis
   Zobrazí informace o napájení
.DESCRIPTION
   Zobrazí informace o využití energie a stavu bateriebaterie
.PARAMETER baterie
    slouží k vygenerování reportu o stvu baterie
.EXAMPLE
   Get-energi
   Zobrazí informace o využití energie
.EXAMPLE
   Get-energi -baterie
   Zobrazí informace o využití energie a stavu bateriebaterie
#>
function Get-energi
{
    param
    (
        [switch] $baterie
    )
    if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
    {}
    else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
    if($baterie)
    {
        Invoke-Expression "powercfg /energy"
        Invoke-Expression "powercfg /batteryreport"

    }
    else
    {
        Invoke-Expression "powercfg /energy"
    }
}
<#
.Synopsis
   Zobrazí asociace typů souborů a programů
.DESCRIPTION
    Zobrazí asociace typů souborů a programů
.PARAMETER pripona
    slouží k definování formátu souboru, pro který chceme získat asociaci
.EXAMPLE
   Get-Asociate
   Zobrazí asociace typů souborů a programů
.EXAMPLE
   SGet-Asociate -pripona avi
   Zobrazí asociaci souborů formátu avi
#>
function Get-Asociate
{
    param
    (
        [string] $pripona
    )
    if($pripona -ne "")
    {
        Invoke-Expression "cmd /k assoc | findstr $pripona"
    }
    Invoke-Expression "cmd /k assoc"
}
<#
.Synopsis
   Zobrazí běžící skripty
.DESCRIPTION
    Zobrazí běžící skripty
.EXAMPLE
   Get-RunningScripts
   Zobrazí běžící skripty
#>
function Get-RunningScripts
{
    Invoke-Expression "tasklist | findstr script"
}
<#
.Synopsis
   Připraví report o stavu bezdrátové konektivity
.DESCRIPTION
    Připraví report o stavu bezdrátové konektivity
.EXAMPLE
   Get-WiFiReport
   Vypracuje report
#>
function Get-WiFiReport
{
    if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
    {}
    else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
    Invoke-Expression "netsh wlan Get wlanreport"
}
<#
.Synopsis
   Vypíše procesy, které využívají síť
.DESCRIPTION
    Vypíše procesy, které využívají síť a informace o tom, kam a na jakém portu komunikují
.EXAMPLE
   Get-NetworkUseProcess
   Vypíše procesy, které využívají síť a informace o tom, kam a na jakém portu komunikují
#>
function Get-NetworkUseProcess
{
    Get-NetTCPConnection | select Local*, Remote*, State,`
    @{n="ProcessName";e={(Get-Process -Id $_.OwningProcess).ProcessName}},`
    @{n="ProcessPath";e={(Get-Process -Id $_.OwningProcess).Path}} | Out-GridView
}
<#
.Synopsis
   Restartuje počítač do BIOSU
.DESCRIPTION
    Restartuje počtač do BIOS, nebo nastavení UEFI
.EXAMPLE
   Open-Bios
   Restartuje počtač do BIOS, nebo nastavení UEFI
#>
function Open-Bios
{
    Write-Warning "Počítač bude restarován, před pokračování svou práci uložte!"
    Read-Host -Prompt "Press enter to continue..."
    Invoke-Expression "shutdown /r /fw /f /t 0"
}
<#
.Synopsis
   Nalzne duplicitní soubory
.DESCRIPTION
    Na základě SHA256 nalezne duplicitní soubory v adresáři a podadresářích
.PARAMETER cesta
    určuje kořenový adresář, kde se mají hledat duplicitní soubory
.EXAMPLE
   Get-DupliciteFile -cesta D:\
   Zobrazí seznam duplicitních souborů v adresáři a podadresářích
#>
function Get-DupliciteFile
{
    param
    (
        [Parameter(Mandatory=$true)][struing] $cesta
    )
    If (Test-Path $cesta) {
        ''
        Write-Warning 'Searching for duplicates ... Please wait ...'
        $duplicates = Get-ChildItem $cesta -File -Recurse -ErrorAction SilentlyContinue | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object Count -GT 1
 
        If ($duplicates.count -lt 1)
        {
            Write-Warning 'No duplicates found.'
            Break ''
        }
        else 
        {
        Write-Warning "Duplicates found."
        $result = foreach ($d in $duplicates)
        {
            $d.Group | Select-Object -Property Path, Hash, LastWriteTime
        }
 
        $date = Get-Date -Format "dd/MM/yyy"
        $itemstomove = $result | Out-GridView -Title "Select files (CTRL for multiple) and press OK. Selected files will be moved to C:\Duplicates_$date" -PassThru
        If ($itemstomove)
 
        {
            New-Item -ItemType Directory -Path $env:SystemDrive\Duplicates_$date -Force
            Move-Item $itemstomove.Path -Destination $env:SystemDrive\Duplicates_$date -Force
            ''
            Write-Warning "Mission accomplished. Selected files moved to C:\Duplicates_$date"
 
            Start-Process "C:\Duplicates_$date"
        }
 
        else
        {
            Write-Warning "Operation aborted. No files selected."
        }
    }
    }
    else
    {
        Write-Warning `
        "Folder not found. Use full path to directory e.g. C:\photos\patrick"
    }
}
<#
  .Synopsis
     Convert-Folder2ESD -rezim {<info> | <komprese> | <dekomprese>} -soubor <cesta k souboru> -slozka <cesta zdrojové složky> [-nazev <string>] [-index <number]
  .DESCRIPTION
     Pomocí nástroje DISM umožňuje zobrazit informace o daném ESD souboru. Umí extrhovat daný index či název do zadané složky. Pokud se nazadá název nebo index,
     bude do zadané složky extrahován index 1 daného souboru.
     Hlavním úkolem je tvorba ESD souborů ze zadané složky, do archivu jsou samozřejmně zahrnuty všechny podložky a jejich obsah. Komprese archivu je maximální možná.
     Název indexu je možné zadat v podobě volitelného parametru.
     Není podporována komprese samostatných souborů ani více indexové archivy či popis jednotlivých indexů.
  .PARAMETER rezim
    Příjímá hodnoty: komprese, info a dekomprese, což slouží k nastavení režimu práce
  .PARAMETER soubor
    Udává cestu k souboru esd
  .PARAMETER slozka
    Udává cestu ke složce, se kterou pracuji
  .PARAMETER index
    Udává číslo indexu v ESD archivu, který chci extrahovat
  .PARAMETER nazev
    Udává název indexu v ESD archivu, který chci extrahovat
  .EXAMPLE
      Convert-Folder2ESD -rezim komprese -soubor I:\2016-2017.esd -slozka I:\2016-2017 -nazev Fotokrouzek2016-2017
      Do souboru I:\I:\2016-2017.esd zabalí obsah složky I:\2016-2017 na index 1 pod jménem indexu Fotokrouzek2016-2017
  .EXAMPLE
     Convert-Folder2ESD -rezim dekomprese -soubor I:\Drivers.ESD -slozka I:\Ovladace
     Do složky I:\Ovladace vybalí obsah archivu I:\Drivers.esd
  .EXAMPLE
     Convert-Folder2ESD -rezim info -soubor I:\Drivers.ESD -slozka I:\Ovladace
     DZobrazí dostuné informace o archyvu I:\Drivers.esd
  .EXAMPLE
     Convert-Folder2ESD -rezim dekomprese -soubor I:\Windows\Souces\Install.esd -slozka I:\Win10Pro -index 5
     Extrahuje instalačního souboru offline podobu obrazu Windows 10 Pro, které jsou na indexu 5 do složky C:\Win10Pro
  .EXAMPLE
     Convert-Folder2ESD -rezim dekomprese -soubor I:\2016-2017.esd -slozka I:\2016-2017 -nazev Fotokrouzek2016-2017
     Extrahuje z archivu I:\2016-2017.esd index se jménem Fotokrouzek2016-2017 do složky I:\2016-2017 
  .NOTES
     Verze: 1.0
     Autor: Petrásek Jan
     Autor nenese žádnou odpovědnost za případnou ztrátu či poškození dat!
     Všechna práva vyhrazena
     ©2020
  .FUNCTIONALITY
     Tvorba a extrahování ESD
#>
function Convert-Folder2ESD
{
    param(
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
    [string]$rezim, 
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
    [string]$soubor, 
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
    [string]$slozka,
    [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
    [string]$nazev,
    [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
    [string]$index,
    [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
    [bool]$wim
    )
 
    Switch($rezim)
    {
        info{
           Dism.exe /Get-ImageInfo /ImageFile:$soubor
        }
        komprese {
            if($nazev -ne "")
            {
                Dism /Capture-Image /ImageFile:$soubor /Compress:max /CheckIntegrity /CaptureDir:$slozka /Name:$nazev
            }else{
                Dism /Capture-Image /ImageFile:$soubor /Compress:max /CheckIntegrity /CaptureDir:$slozka /Name:$soubor
            }
            if($wim){
                Dism /Capture-Image /ImageFile:$soubor.wim /Compress:max /CheckIntegrity /CaptureDir:$slozka /Name:$nazev
                }
            Write-Host ""
            Write-Host "Komprese dokončena" -ForegroundColor Green
        }
        dekomprese{
            IF(!(Test-Path 'C:\temp\ESD2Folder'))
            {
                New-Item -Path 'C:\temp\ESD2Folder' -ItemType Directory
            }
            if($nazev -ne ""){
                dism /export-image /SourceImageFile:$soubor /SourceName:$nazev /DestinationImageFile:C:\temp\ESD2Folder.wim /Compress:max /CheckIntegrity
                Dism /Mount-Image /ImageFile:C:\temp\ESD2Folder.wim /MountDir:C:\temp\ESD2Folder /Name:$nazev
                cd C:\temp\ESD2Folder
                Copy-Item C:\temp\ESD2Folder\* -Recurse $slozka
                cd $home
                Dism /Unmount-Image /MountDir:C:\temp\ESD2Folder /discard
                Remove-Item -Path C:\temp\ESD2Folder.wim -Force
                Remove-Item -Path C:\temp -Recurse -Force
                Write-Host ""
                Write-Host "Extrahování dat dokončeno" -ForegroundColor Green
            }elseif($index -ne "")
            {
                dism /export-image /SourceImageFile:$soubor /SourceIndex:$index /DestinationImageFile:C:\temp\ESD2Folder.wim /Compress:max /CheckIntegrity
                Dism /Mount-Image /ImageFile:C:\temp\ESD2Folder.wim /MountDir:C:\temp\ESD2Folder /Index:$index
                cd C:\temp\ESD2Folder
                Copy-Item C:\temp\ESD2Folder\* -Recurse $slozka
                cd $home
                Dism /Unmount-Image /MountDir:C:\temp\ESD2Folder /discard
                Remove-Item -Path C:\temp\ESD2Folder.wim -Force
                Remove-Item -Path C:\temp -Recurse -Force
                Write-Host ""
                Write-Host "Extrahování dat dokončeno" -ForegroundColor Green
            }else{
                dism /export-image /SourceImageFile:$soubor /SourceIndex:1 /DestinationImageFile:C:\temp\ESD2Folder.wim /Compress:max /CheckIntegrity
                Dism /Mount-Image /ImageFile:C:\temp\ESD2Folder.wim /MountDir:C:\temp\ESD2Folder /Index:1
                cd C:\temp\ESD2Folder
                Copy-Item C:\temp\ESD2Folder -Recurse $slozka
                cd $home
                Dism /Unmount-Image /MountDir:C:\temp\ESD2Folder /discard
                Remove-Item -Path C:\temp\ESD2Folder.wim -Force
                Remove-Item -Path C:\tempr -Recurse -Force
                Write-Host ""
                Write-Host "Extrahování dat dokončeno" -ForegroundColor Green
            }
        }
        Default{
            Write-Host "KONČÍM, chybně neplatná hodnota parametru režim" -ForegroundColor Red
        }
    }
}
<#
.Synopsis
   vygeneruje náhodné heslo
.DESCRIPTION
    Vygeneruje náhodné heslo zadabné délky a užitím speciálních znaků, nebo bez nich. Ke generování využito nativní rozhraní pro kryptografii ve Windows.
.PARAMETER delka
    Slouží k nastavení délky generovaného hesla
.PARAMETER specZnak
    Nastavuje, že heslo bude obsahovat speciální znaky
.PARAMETER czech
    Nastavuje, že heslo bude obsahovat znaky české abecedy včetně diaktitiky
.PARAMETER czechSpec
    Nastavuje, že heslo bude obsahovat znaky české abecedy včetně diaktitiky a speciální znaky
.EXAMPLE
   Generate-Password
   Výsledek: 1u0a63Q5AGOV
.EXAMPLE
   Generate-Password -delka 4
   Výsledek: z6kb
.EXAMPLE
   Generate-Password -specZnak
   Výsledek: YrI1mcNOzTY9
.EXAMPLE
   Generate-Password -delka 24 -specZnak
   Výsledek: 8G{5jIzes9[ezJ{9DzDUP8QE
.EXAMPLE
   Generate-Password -czech -delka 12
   Výsledek: dŽElůěř12ěýý
.EXAMPLE
   Generate-Password -czechSpec -delka 12
   Výsledek: ěqaž?6?8nŽBě
#>
function Generate-Password
{
    param
    (
        [int] $delka = 12,
        [switch] $specZnak,
        [switch] $czech,
        [switch] $czechSpec
    )
    $length = $delka
    if($specZnak)
    {
        $charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{]+-[*=@:)}$^%;(_!&amp;#?>/| .'.ToCharArray()
    }
    elseif($czech)
    {
        $charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ěščřžýáíéĚŠČŘŽÝÁÍÉůŮúÚ'.ToCharArray()
    }
    elseif($czechSpec)
    {
        $charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{]+-[*=@:)}$^%;(_!&amp;#?>/| .ěščřžýáíéĚŠČŘŽÝÁÍÉůŮúÚ'.ToCharArray()
    }
    else
    {
        $charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.ToCharArray()
    }
    $rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
    $bytes = New-Object byte[]($length)
    $rng.GetBytes($bytes)
    $result = New-Object char[]($length)
    for ($i = 0 ; $i -lt $length ; $i++) {
        $result[$i] = $charSet[$bytes[$i]%$charSet.Length]
    }
    return (-join $result)
}
<#
.Synopsis
   Zobrazí nainstalované aktualizace ze služby Windows Updates
.DESCRIPTION
    Zobrazí nainstalované aktualizace ze služby Windows Updates
.EXAMPLE
   Get-WindowsUpdateHistory
   Zobrazí Gridview s informacemi o nainstalovaných aktualizacích
#>
function Get-WindowsUpdateHistory
{
    function Convert-WuaResultCodeToName
    {
        param( [Parameter(Mandatory=$true)][int] $ResultCode
        )
        $Result = $ResultCode
        switch($ResultCode)
        {
        2
            {
                $Result = "Succeeded"
            }
        3
            {
                $Result = "Succeeded With Errors"
            }
        4
            {
                $Result = "Failed"
            }
        }
       return $Result
    }
    function Get-WuaHistory
    {
        # Get a WUA Session
        $session = (New-Object -ComObject 'Microsoft.Update.Session')
        # Query the latest 1000 History starting with the first recordp
        $history = $session.QueryHistory("",0,50) | ForEach-Object {
        $Result = Convert-WuaResultCodeToName -ResultCode $_.ResultCode
        # Make the properties hidden in com properties visible.
        $_ | Add-Member -MemberType NoteProperty -Value $Result -Name Result
        $Product = $_.Categories | Where-Object {$_.Type -eq 'Product'} | Select-Object -First 1 -ExpandProperty Name
        $_ | Add-Member -MemberType NoteProperty -Value $_.UpdateIdentity.UpdateId -Name UpdateId
        $_ | Add-Member -MemberType NoteProperty -Value $_.UpdateIdentity.RevisionNumber -Name RevisionNumber
        $_ | Add-Member -MemberType NoteProperty -Value $Product -Name Product -PassThru
        Write-Output $_
    }
    #Remove null records and only return the fields we want
    $history |
    Where-Object {![String]::IsNullOrWhiteSpace($_.title)} |
    Select-Object Result, Date, Title, SupportUrl, Product, UpdateId, RevisionNumber | Out-GridView
    }
    Get-WuaHistory
}
<#
.Synopsis
   Nainstaluje aktualizace z Windows Update
.DESCRIPTION
    Nainstaluje aktualizace z Windows Update, k čemuž využívá externí modul. Umožňuje rovněž jen vyhledat, nebo odebrat již nainstalované aktualizace.
.PARAMETER najit
    Přepíná do režimu pouze vyhledat, ale neinstalovat a nestahovat
.PARAMETER jeden
    Přepíná do režimu, kdy se bude instalovat jen 1 konkrétní aktualizace, vyžaduje doplnění parametrem cislo
.PARAMETER cislo
    Udává KB číslo aktualizace, se kterou se pracuje
.PARAMETER odinstalovat
    Přepíná do módu odinstalace aktualizace, vyžaduje kombinaci s parametrem cislo, nebo parametrem mesic
.PARAMETER mesic
    Udává, že se odebírají aktualizace nainstalované v posledních 30 dnech
.EXAMPLE
   Install-WinUpdates
   Nainstaluje všechny dostupné aktualizace z Windows update
.EXAMPLE
   Install-WinUpdates -najit
   Pouze vyhledá všechny dostupné aktualizace z Windows update
.EXAMPLE
   Install-WinUpdates -jeden -cislo KB5017308 
   Nainstaluje aktualizaci KB5017308 z Windows update
.EXAMPLE
   Install-WinUpdates -odinstalovat -cislo KB5017308
   Odinstaluje aktualizaci KB5017308 z počítače
.EXAMPLE
   Install-WinUpdates -odinstalovat -mesic
   Odinstaluje všechny hotfixy instalované za poslední měsíc
#>
function Install-WinUpdates
{
    param(
        [switch] $najit,
        [switch] $odinstalovat,
        [string] $cislo,
        [switch] $jeden,
        [switch] $mesic
    )
    if (Get-Module -ListAvailable -Name PSWindowsUpdate) {
        Update-Module -Name PSWindowsUpdate -Force
    } 
    else {
        Install-Module -Name PSWindowsUpdate -Force
    }
    Import-Module PSWindowsUpdate
    if($najit)
    {
        Get-WindowsUpdate | Out-GridView
    }
    if($odinstalovat)
    {
        if($mesic)
        {
            $ListOfHotfixes = Get-Hotfix | where -Property InstalledOn -le (get-date).AddMonths(-1).Date
            foreach ($item in $ListOfHotfixes)
            {
                $polozka = $item.hotfixID
                $cislo = [string] $polozka.Split("KB")
                $c = $cislo.TrimStart()
                wusa.exe /uninstall /kb:$c /norestart /quiet | out-null
            }
        }
        Get-WindowsUpdateHistory
        $cislo = Read-Host -Prompt "Zadej KB číslo aktualizace: "
        if($cislo -eq '')
        {
            Write-Error "KB číslo aktualizace musí být zadáno!"
            break
        }
        Remove-WindowsUpdate -KBArticleID $cislo -NoRestart
    }
    if($jeden)
    {
        if($cislo -eq '')
        {
            Write-Error "KB číslo aktualizace musí být zadáno!"
            break
        }
        Get-WindowsUpdate -Install -KBArticleID $cislo
    }
    else
    {
        Get-WindowsUpdate -AcceptAll -Install -AutoReboot
    }
}
<#
.Synopsis
   Zobrazí soubory s exportovanými cetifikáty
.DESCRIPTION
    Zobrazí soubory s exportovanými cetifikáty ve formátech pfx, cer a pem, které nejsou starší 1,5 roku
.PARAMETER umisteni
    Udává kořen cesty, kde se mají hledat exporty certifikátů. Výchozí cesta je %userprofile%
.EXAMPLE
   Get-CertExport
   Zobrazí v profilu uživatele uložené soubory s exportovanými cetifikáty ve formátech pfx, cer a pem, které nejsou starší 1,5 roku
.EXAMPLE
   Get-CertExport -umisteni D:\
   Zobrazí soubory s exportovanými cetifikáty ve formátech pfx, cer a pem uložené na disku D:, které nejsou starší 1,5 roku
#>
function Get-CertExport
{
    param(
        [string]$umisteni
    )
    if($umisteni -ne '')
    {
        gci $umisteni -Recurse -Filter *.pfx | where -FilterScript{$_.LastWriteTime -gt (get-date).AddYears(-1.5)}
        gci $umisteni -Recurse -Filter *.pem | where -FilterScript{$_.LastWriteTime -gt (get-date).AddYears(-1.5)}
        gci $umisteni -Recurse -Filter *.cer | where -FilterScript{$_.LastWriteTime -gt (get-date).AddYears(-1.5)}
    }
    else
    {
        gci $env:USERPROFILE -Recurse -Filter *.pfx | where -FilterScript{$_.LastWriteTime -gt (get-date).AddYears(-1.5)}
        gci $env:USERPROFILE -Recurse -Filter *.pem | where -FilterScript{$_.LastWriteTime -gt (get-date).AddYears(-1.5)}
        gci $env:USERPROFILE -Recurse -Filter *.cer | where -FilterScript{$_.LastWriteTime -gt (get-date).AddYears(-1.5)}
    }
}
<#
.Synopsis
   Zobrazí 48 mísný obnovovací kód nástroje Bitlocker
.DESCRIPTION
    Zobrazí 48 mísný obnovovací kód nástroje Bitlocker
.PARAMETER jednotka
    Udává písmeno (bez dvojtečky) disku, pro který se má zobrazit 48 místný obnovovací klíč
.EXAMPLE
   Get-BitlockerRecovery
   Zobrazí ID a obnovací kód pro systémovou jednotku
.EXAMPLE
   Get-BitlockerRecovery -jednotka D
   Zobrazí ID a obnovací kód pro disk D:
#>
function Get-BitlockerRecovery
{
    param
    (
        #[switch] $backupToAD,
        [string] $jednotka
    )
    if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
    if($jednotka -ne '')
    {
        manage-bde -protectors -get ($jednotka+":")
    }
    if($backupToAD)
    {
        $id = manage-bde -protectors -get C: | findstr ID
        foreach($k in $ID)
        {
            $i = $k.substring($k.Length-37,36)
            manage-bde -protectors -adbackup $env:SystemDrive -id "{$i}"
        }
    }
    else
    {
        manage-bde -protectors -get $env:SystemDrive
    }
}
<#
.Synopsis
   Zobrazí výsledky doazu na systém whois
.DESCRIPTION
    Zobrazí výsledky doazu na systém whois pro domény: br.com, cn.com, com, eu.org, net, org,edu, gov, cz, eu, sk, de, ua, pro další domény je potřeba specifikovat sertver
.PARAMETER server
    Udává whois server, na kterém se má dotaz vyhodnotit
.PARAMETER NoForward
    Blokuje předávání požadavku mezi registrátory
.PARAMETER iana
    Nastaví, že dotaz se bude zpracovávat na whois.iana.org
.EXAMPLE
   Get-WhoIs google.cz
   Zobrazí základní výsledky ze systém Whois pro doménu google.cz
.EXAMPLE
   Get-WhoIs google.cz -NoForward
   Zobrazí základní výsledky ze systém Whois pro doménu google.cz bez předávání mimo whois serververy cz.nic
.EXAMPLE
   Get-WhoIs google.cz -iana
   Zobrazí informace o správci domény 1. řádu hledané domény (včetně adresy whois serveru pro danou doménu 1. řádu)
.EXAMPLE
   Get-WhoIs google.cz -server whois.iana.org
   Zobrazí základní výsledky ze systém Whois pro doménu google.cz ze serveru whois.iana.org
.EXAMPLE
   Get-WhoIs 8.8.8.8
   Zobrazí základní výsledky ze systém Whois pro IP 8.8.8.8
#>
function Get-WhoIs {
    [CmdletBinding()]
    param(
        
        [Parameter(Position=0, ValueFromRemainingArguments=$true)]
        [string]$query,
        [string]$server,
        [switch]$NoForward,
        [switch]$iana
    )
    end {
        $TLDs = DATA {
          @{
            ".br.com"="whois.centralnic.net"
            ".cn.com"="whois.centralnic.net"
            ".eu.org"="whois.eu.org"
            ".com"="whois.crsnic.net"
            ".net"="whois.crsnic.net"
            ".org"="whois.publicinterestregistry.net"
            ".edu"="whois.educause.net"
            ".gov"="whois.nic.gov"
            ".cz"="whois.nic.cz"
            ".eu"="whois.eu"
            ".sk"="whois.sk-nic.sk"
            ".de"="whois.denic.de"
            ".ua"="whois.ua"
          }
        }
        if($iana)
        {
            $server = "whois.iana.org"
        } 
        $EAP, $ErrorActionPreference = $ErrorActionPreference, "Stop"
 
        $query = $query.Trim()
 
        if($query -match "(?:\d{1,3}\.){3}\d{1,3}") {
            Write-Verbose "IP Lookup!"
            <#if($query -notmatch " ") {
                $query = "n $query"
            }
            if(!$server) { $server = "whois.arin.net" }#>
        } elseif(!$server) {
            $server = $TLDs.GetEnumerator() |
                Where { $query -like  ("*"+$_.name) } |
                Select -Expand Value -First 1
                (Invoke-WebRequest -URI "www.whois.com/whois/$query").AllElements | Where {$_.id -eq "registryData"} 
        }
 
        if(!$server) { $server = "whois.arin.net" }
        $maxRequery = 3 
 
        do {
            Write-Verbose "Connecting to $server"
            $client = New-Object System.Net.Sockets.TcpClient $server, 43
 
            try {
                $stream = $client.GetStream()
 
                Write-Verbose "Sending Query: $query"
                $data = [System.Text.Encoding]::Ascii.GetBytes( $query + "`r`n" )
                $stream.Write($data, 0, $data.Length)
 
                Write-Verbose "Reading Response:"
                $reader = New-Object System.IO.StreamReader $stream, [System.Text.Encoding]::ASCII
 
                $result = $reader.ReadToEnd()
 
                if($result -match "(?s)Whois Server:\s*(\S+)\s*") {
                    Write-Warning "Recommended WHOIS server: ${server}"
                    if(!$NoForward) {
                        Write-verbose "Non-Authoritative Results:`n${result}"
                        if(!$cachedResult) {
                            $cachedResult = $result
                            $cachedServer = $server
                        }
                        $server = $matches[1]
                        $query = ($query -split " ")[-1]
                        $maxRequery--
                    } else { $maxRequery = 0 }
                } else { $maxRequery = 0 }
            } finally {
                if($stream) {
                    $stream.Close()
                    $stream.Dispose()
                }
            }
        } while ($maxRequery -gt 0)
 
        $result
 
        if($cachedResult -and ($result -split "`n").count -lt 5) {
            Write-Warning "Original Result from ${cachedServer}:"
            $cachedResult
        }
 
        $ErrorActionPreference = $EAP
    }
 }
 <#
.Synopsis
   Provede synchronizaci dvou adresářů
.DESCRIPTION
    Provede synchronizaci obsahu dvou adresářů (může jít i o Disk Volume) včetně oprávnění, nebo přenese pouze oprávnění
.PARAMETER zdroj
    Udává cestu ke zdrojovému adresáři
.PARAMETER cil
    Udává cestu k cílovému adresáři
.PARAMETER prava
    Přpíná do režimu přenosu pouze ACL, nikoliv samotných dat
.EXAMPLE
   Clone-Folder -zdroj C:\FFOutoput\ -cil E:\Video
   Přenese obsah složky z C:\FFOutput do složky E:\video se zachováním zdrojových oprávnění. Obsah složky E:\video, který není ve složce C:\FFOutput bude odebrán!
.EXAMPLE
   Clone-Folder -zdroj D:\ -cil E:\
   Přenese obsah disku D: na disk E: se zachováním zdrojových oprávnění. Obsah složky E:\, který není na disku D:\ bude odebrán!
.EXAMPLE
   Clone-Folder -zdroj D:\ -cil E:\ -prava
   Přenese oprávnění z disku D:\ na disk E:\, původní nastavení oprávnění na disku E:\ budou smazána.
#>
 function Clone-Folder
 {
    param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]$zdroj,
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=1)]$cil,
        [switch]$prava
    )
    if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
    if($prava)
    {
        Invoke-Command "robocopy $zdroj $cil /e /sec /secfix /xo /xn /xc"
    }
    else
    {
        Invoke-Command "robocopy $zdroj $cil /mir /sec /secfix /v"
    }
 }
 <#
.Synopsis
   Provede 35 násobný přepis diku nulou nebo jinou hodnotou
.DESCRIPTION
    Provede 35 násobný přepis diku nulou nebo jinou hodnotou. U fyzických disků smaže všechny oddíly a vytvoiří nové
.PARAMETER disk
    Zadává písmeno disku (oddílu), který má být vydrhnut
.PARAMETER fyzicky
    Udává, že budeme čistit fyzický disk, který může obsahovat více oddílů
.PARAMETER pismeno
    Udává, jaké písmeno bude přiřazeno nově vytvořenému oddílu po dokončení vydrhnutí fyzického disku
.EXAMPLE
   Delte-Disk -disk G
   Disk G bude 35x přepsán náhodným číslem a následně pomalu naformátován na NTFS
.EXAMPLE
   Delte-Disk -fyzicky
   Vyžádá si výběr fyzického disku ze zovbrazeného seznamu dostupných fyzických disků. Následně smaže všechny oddíly a disk 35x přepíš náhodným číslem. Po skončení oprace vytvoří jeden oddíl naformátovaný na NTFS s písmenem W.
.EXAMPLE
   Delte-Disk -fyzicky -pismeno E
   Vyžádá si výběr fyzického disku ze zovbrazeného seznamu dostupných fyzických disků. Následně smaže všechny oddíly a disk 35x přepíš náhodným číslem. Po skončení oprace vytvoří jeden oddíl naformátovaný na NTFS s písmenem E.
#>
function Delte-Disk
{
    Param(
        [string]$Disk,
        [switch]$fyzicky,
        [string]$pismeno
    )
    if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
    if($fyzický)
    {
        if($pismeno -eq "")
        {
            $pismeno = "W"
        }
        Get-Disk | FT
        $cil = Read-Host -Prompt "Zadejte číslo disku"
        Get-Disk $cil | Clear-Disk -RemoveData -RemoveOEM
        Initialize-Disk $cil
        New-Partition -DiskNumber $cil -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel Nedostupno
        Get-Partition -DiskNumber 0 | Set-Partition -NewDriveLetter W
        Invoke-Expression "format W: / fs: NTFS /v:Volny / p: 35"
        New-Partition -DiskNumber $cil -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel Volny
        Get-Partition -DiskNumber 0 | Set-Partition -NewDriveLetter $pismeno
    }
    elseif($Disk -ne "")
    {
        $Disk = $Disk+":"
        Invoke-Expression "format $Disk / fs: NTFS /v:Volny / p: 35"
        Invoke-Expression "format $Disk / fs: NTFS /v:Volny"
    }
    else
    {
        Write-Error "Musí být zadán DISK!"
    }
}
 <#
.Synopsis
   Zobrazí informace o hesle uživatele
.DESCRIPTION
    Zobrazí informace o hesle lokálního nebo doménového uživatele. Mezi zoíbrazené informace patří expirace, chybné zadání nebo poslední nastavení.
.PARAMETER login
    Udává login účtu, pro který chceme vrátit informace o hesle
.PARAMETER domena
    Přepíná do režimu doménových uživatelů
.EXAMPLE
   Get-UserPasswordInfo -login Administrator -domena
   Zobrazí informace o hesle účtu Administrator z domény, ve které je počítač
.EXAMPLE
   Get-UserPasswordInfo -login Administrator
   Zobrazí informace o hesle účtu Administátor, který je lokálním účtem daného PC.
#>
Function Get-UserPasswordInfo
{
    param(
    [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]$login,
    [switch]$domena
    )
    if($domena)
    {
        get-aduser -Identity $login -Properties * | select Name, UserPrincipalName, DistinguishedName, @{name="badPasswordTime"; expression={[datetime]::FromFileTime($_.badPasswordTime)}}, @{name ="pwdExpire";expression={[datetime]::FromFileTime($_.pwdExpire)}}, @{name ="pwdLastSet";expression={[datetime]::FromFileTime($_.pwdLastSet)}}
    }
    else
    {
        Get-LocalUser -Name $login  | select Name, PasswordLastSet, PasswordRequired, UserMayChangePassword, PasswordExpires, PasswordChangeableDate
    }
}
 <#
.Synopsis
   Zobrazí informace o nastavených šifrovacích algoritmech pro daný úživatelský účet
.DESCRIPTION
    Zobrazí informace o nastavených šifrovacích algoritmech protokolu Kerberos pro daný úživatelský účet
.PARAMETER login
    Udává login uživatele, pro kterého potřebuji znát informace o podporovaném šifrování vrámci kerberosu
.EXAMPLE
   Get-KrbEncriptionTypes -login Administrator
   Administrator,Not defined - defaults to RC4_HMAC_MD5
#>
function Get-KrbEncriptionTypes
{
    param(
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]$login
    )
    $encTypes = @("Not defined - defaults to RC4_HMAC_MD5","DES_CBC_CRC","DES_CBC_MD5","DES_CBC_CRC | DES_CBC_MD5","RC4","DES_CBC_CRC | RC4","DES_CBC_MD5 | RC4","DES_CBC_CRC | DES_CBC_MD5 | RC4","AES 128","DES_CBC_CRC | AES 128","DES_CBC_MD5 | AES 128","DES_CBC_CRC | DES_CBC_MD5 | AES 128","RC4 | AES 128","DES_CBC_CRC | RC4 | AES 128","DES_CBC_MD5 | RC4 | AES 128","DES_CBC_CBC | DES_CBC_MD5 | RC4 | AES 128","AES 256","DES_CBC_CRC | AES 256","DES_CBC_MD5 | AES 256","DES_CBC_CRC | DES_CBC_MD5 | AES 256","RC4 | AES 256","DES_CBC_CRC | RC4 | AES 256","DES_CBC_MD5 | RC4 | AES 256","DES_CBC_CRC | DES_CBC_MD5 | RC4 | AES 256","AES 128 | AES 256","DES_CBC_CRC | AES 128 | AES 256","DES_CBC_MD5 | AES 128 | AES 256","DES_CBC_MD5 | DES_CBC_MD5 | AES 128 | AES 256","RC4 | AES 128 | AES 256","DES_CBC_CRC | RC4 | AES 128 | AES 256","DES_CBC_MD5 | RC4 | AES 128 | AES 256","DES+A1:C33_CBC_MD5 | DES_CBC_MD5 | RC4 | AES 128 | AES 256")
    $EncVal = Get-ADUser -Identity $login
    foreach($e in $EncVal)
    {
        try 
        {
            $e.Name + "," + $encTypes[$e.'msDS-SupportedEncryptionTypes']
        }
        catch
        {
            $e.Name + "," + $encTypes[0]
        }    
     }
}
<#
    .SYNOPSIS
        Vrací informace o účtu Krbtgt.
     
    .DESCRIPTION
        Vrací informace o účtu Krbtgt.
        Obsahuje informace o konfiguraci tiketu Kerberos.
        Pokusí se pomocí modulu GroupPolicy zjistit nastavení zásad Kerberos.
     
    .PARAMETER Server
        Řadič domény, ze kterého se vyžádají informace
     
    .PARAMETER Identity
        Účet, na který se zaměřit.
        Výchozí hodnota je účet krbtgt, ale lze jej použít i pro jiné účty (např.: účet krbtgt pro RODC).Účet, na který se zaměřit.
     
    .PARAMETER EnableException
        Tento parametr vypíná uživatelsky přívětivá varování a umožňuje vyhazování výjimek.
        To je méně uživatelsky přívětivé, ale umožňuje to zachytávat výjimky ve volajících skriptech.
     
    .EXAMPLE
        Get-KrbAccount
        vypíše informace o účtu krbtgt

    .NOTE
        Tato funkce je přezvazta z: https://www.powershellgallery.com/packages/Krbtgt/1.0.0/Content/functions%5CGet-KrbAccount.ps1 a opravena (vyřešeny problémy v kódu + dokumentace přeložena do češtiny).
        Autorem je: Friedrich Weinmann
#>
function Get-KrbAccount
{
     [CmdletBinding()]
    param (
        [string]
        $Server,
        
        [string]
        $Identity = 'krbtgt',
        
        [switch]
        $EnableException
    )
    
    begin
    {
        $parameter = @{
            Identity   = $Identity
            Properties = 'PasswordLastSet'
        }
        if ($Server) { $parameter['Server'] = $Server }
        
        try
        {
            if ($Server) { $domainName = (Get-ADDomain -Server $Server -ErrorAction Stop).DNSRoot }
            else { $domainName = (Get-ADDomain -ErrorAction Stop).DNSRoot }
        }
        catch
        {
            exit
            return
        }
    }
    process
    {
        Write-Host "Get-KrbAccount.Start $Identity"
        $krbtgt = Get-ADUser @parameter -ErrorAction Stop
        Write-Host "Get-KrbAccount.UserFound $krbtgt.DistinguishedName"
        
        $result = [PSCustomObject]@{
            PSTypeName               = 'Krbtgt.Account'
            EarliestResetTimestamp = $null
            Name                   = $krbtgt.Name
            SamAccountName           = $krbtgt.SamAccountName
            DistinguishedName       = $krbtgt.DistinguishedName
            PasswordLastSet           = $krbtgt.PasswordLastSet
        }
        try
        {
            Write-host "Get-KrbAccount.ScanningKerberosPolicy $domainName"
            [xml]$gpo = Get-GPOReport -Guid '{31B2F340-016D-11D2-945F-00C04FB984F9}' -ReportType Xml -ErrorAction Stop -Domain $domainName
            $result.MaxTgtLifetimeHours = (($gpo.gpo.Computer.ExtensionData | Where-Object { $_.name -eq 'Security' }).Extension.ChildNodes | Where-Object { $_.Name -eq 'MaxTicketAge' }).SettingNumber
            $result.MaxClockSkewMinutes = (($gpo.gpo.Computer.ExtensionData | Where-Object { $_.name -eq 'Security' }).Extension.ChildNodes | Where-Object { $_.Name -eq 'MaxClockSkew' }).SettingNumber
        }
        catch
        {
            Write-Warning -Message "Get-KrbAccount.FailedKerberosPolicyLookup $domainName"
        }
        $result.EarliestResetTimestamp = (($Krbtgt.PasswordLastSet.AddHours($result.MaxTgtLifetimeHours)).AddMinutes($result.MaxClockSkewMinutes)).AddMinutes($result.MaxClockSkewMinutes)
        
        Write-Host "Get-KrbAccount.Success" $result.SamAccountName", "$result.EarliestResetTimestamp
        $result
    }
}
 <#
.Synopsis
   Zobrazí Kerberos tikety
.DESCRIPTION
    Zobrazí Kerberos tikety přihlášenoho uživatele, nebo systému
.PARAMETER system
    Nastavuje, že zdrojem pro výčet tiketů bude účet počítače
.EXAMPLE
   Get-KrbTickets
   Zobrazí tikety uživatele, pod kterým běží PowerShell
.EXAMPLE
   Get-KrbTickets -system
   Zobrazí tikety účtu počítače
#>
function Get-KrbTickets
{
    param(
        [switch]$system
    )
    if($system)
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        klist -li 0x3e7
    }
    else
    {
        klist
    }
}
<#
.Synopsis
   Zobrazí uživatele, jejichž hesla jsou součástí srovnávacího slovníku.
.DESCRIPTION
    Zobrazí uživatele, jejichž hesla jsou součástí srovnávacího slovníku. Využívá modul DSInternals. Umí zpracovat více slovníků stejného typu, které jsou v jedné složce. P5i běhu na DC, si umí samostatně zajistit kopii databáze ntds.dit a potřebných registrů.
.PARAMETER slovnik
    Udává cestu keslovníku ve formátu txt
.PARAMETER slozka
    Udává, že porovnání bude provedeno s více slovníky, které jsou uloženy ve složce
.PARAMETER txt
    Udává, že slovník obsahuje hesla v plaintextu (v plné formě)
.PARAMETER dc
    Udává, že kontrola běží na doménovém řadiči a má si sama zajistit dočasnou kopii databáze AD a potřebných registrů
.PARAMETER ntds
    Udává cestu k souboru ntds.dit
.PARAMETER reg
    Udává cestu ke kopii souboru SYSTEM, který obsahuje systémovou větev registru
.EXAMPLE
   Test-AdUserPasswordQuality -slovnik H: -slozka -txt -dc
   Na plochu vygeneruje sadu reportů ve formátu txt, když každý report odpovídá jednomu slovníku uloženému na disku H. Slovky obsahují palintextová hesla a volání probíhá na běžícím DC.
.EXAMPLE
   Test-AdUserPasswordQuality -slovnik H:\haveibennpwd.txt -nts E:\IFM\Active Directory\ntds.dit -reg E:\IFM\registry\SYSTEM
   Na plochu vygeneruje report ve formátu txt, který obsahuje výsledky vůči slovníku haveibennpwd.txt. Slovník haveibennpwd.txt obsahuje NTLM Hash hesel. Jako zdroj AD databáze je export IFM na disku E:
#>
function Test-AdUserPasswordQuality
{
    param(
        [string]$slovnik,
        [switch]$dc,
        [string]$ntds,
        [string]$reg,
        [switch]$txt,
        [switch]$slozka
    )
    if (Get-Module -ListAvailable -Name DSInternals) {
        Update-Module -Name DSInternals -Force
    } 
    else {
        Install-Module -Name DSInternals -Force
    }
    Import-Module DSInternals
    $ntdsPath = $ntds
    $systempath = $reg
    $vystup = "$env:userprofile\Desktop\vystup"
    if($dc)
    {
        New-Item -Path 'C:\IFM' -ItemType Directory
        ntdsutil "activate instance ntds" IFM "create full C:\IFM" q q
        $ntdsPath = "C:\IFM\Active Directory\ntds.dit"
        $systempath = "C:\IFM\registry\SYSTEM"
    }
    $key = Get-BootKey -SystemHivePath $systempath
    if($slozka)
    {
        $i = 1
	$files = gci -Path $slovnik -Filter *.txt
        #gci -Path $slovnik -Filter *.txt | Foreach-Object
	ForEach($file in $files)
        {
	    if($txt)
            {
                Get-ADDBAccount -All -DBPath $ntdsPath -BootKey $key | Test-PasswordQuality -WeakPasswordsFile ($slovnik + "\" + $file) | Out-File ($vystup+$i+".txt") -Encoding utf8 
            }
            else
            {
                Get-ADDBAccount -All -DBPath $ntdsPath -BootKey $key | Test-PasswordQuality -WeakPasswordHashesFile ($slovnik + "\" + $file)| Out-File ($vystup+$i+".txt") -Encoding utf8
            }
            $i++
        }
    }
    elseif($txt)
    {
        Get-ADDBAccount -All -DBPath $ntdsPath -BootKey $key | Test-PasswordQuality -WeakPasswordsFile $slovnik | Out-File ($vystup+".txt") -Encoding utf8 
    }
    else
    {
        Get-ADDBAccount -All -DBPath $ntdsPath -BootKey $key | Test-PasswordQuality -WeakPasswordHashesFile $slovnik | Out-File ($vystup+".txt") -Encoding utf8
    }
    if($dc)
    {
        Remove-Item -Path C:\IFM -Force
    }
}
<#
.Synopsis
   Zobrazí Zařízení v AAD
.DESCRIPTION
	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!
.PARAMETER PC
    Udává AAD login uživatele, jehož počítače chceme vylistovat
.EXAMPLE
   Get-AzureAdDevices -PC zak@skola.cz
   Zobrazí všechna zařízení, která má uživatel zak zaregistrovaný v AAD a nejsou součáslí lokální AD skola.cz
#>
function Get-AzureAdDevices
{
	param (
		[Parameter(Mandatory = $true,
				   ValueFromPipelineByPropertyName = $true,
				   Position = 0)]$PC
	)
	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)
	#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 - pbjekt pro 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'
	}
}
<#
.Synopsis
   Zobrazí informace o časové službě Windows
.DESCRIPTION
	Zobrazí informace o časové službě Windows jako je stav, poslední synchronizace, časový server apod.
.EXAMPLE
   Get-TimeServiceInfo

   Leap Indicator: 0(no warning)
   Stratum: 4 (secondary reference - syncd by (S)NTP)
   Precision: -23 (119.209ns per tick)
   Root Delay: 0.0262875s
   Root Dispersion: 0.0478826s
   ReferenceId: 0x28779426 (source IP:  40.119.148.38)
   Last Successful Sync Time: 2. 3. 2023 7:46:46
   Source: time.windows.com,0x9
   Poll Interval: 10 (1024s)
.NOTE
    Na nedoménových PC je často před provedením potřba zapnout službu w32tm
#>
function Get-TimeServiceInfo
{
    Invoke-Expression "w32tm /query /status"
}
<#
.Synopsis
   Umožní nastavit systémový čas
.DESCRIPTION
    Umožní nastavit systémový čas pomcí časového serveru, opravy či ručního zadání
.PARAMETER oprava
    Udává rozdílovou hodnotu mezi správným časem a časem systému
.PARAMETER sync
    Provede okamžitou synchronizaci se zadaným časovým serverem
.PARAMETER server
    Udává, vůči jakému serveru se má provést synchronizace času
.PARAMETER manual
    Udává hodnotu ve formátu datetime, která má být v systému nastavena
.EXAMPLE
   Set-Time -sync
   Provede okamžitou synchronizaci s časovým serverem
.EXAMPLE
   Set-Time -server time.moje.domena
   Provede synchronizaci s časovým serverem time.moje.domena. Podporuje pouze interní časové servery.
.EXAMPLE
   Set-Time -oprava +0:01:15
   Provede opravu zpoždění času o minutu a 15 s
.EXAMPLE
   Set-Time -manual 02/01/2023 08:15
   Nastaví čas systému na 1.2.2023 v 8:15 ráno
.NOTE
    Na PC mimo doménu může být potřeba před provdením spustit službu w32tm
#>
function Set-Time
{
    param(
        [string]$oprava,
        [string]$server,
        [string]$manual,
        [switch]$sync
    )
    if($sync)
    {
        Invoke-Expression "w32tm /resync"
    }
    if($server -ne "")
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        $text = "net time \\"+$server +" /set /y"
        Invoke-Expression $text
    }
    if($manual -ne "")
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        $text = ($manual -match "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}")
        if($text)
        {
            set-date -date $manual
        }
        else
        {
            Write-Error "Nevalidní formát pro nastavení data a času, užij formát: mm/dd/yyyy hh:mm"
        }
    }
    if($oprava -ne "")
    {
        if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
        {}
        else
        {
            Write-Error "Tento úkon smí vykonávat pouze správce"
            Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
        }
        $format = ($oprava -match "[+-]{1}[0-9]{1,2}:[0-9]{2}:[0-9]{0,2}")
        if($format)
        {
            Set-Date -Adjust $oprava -DisplayHint Time
        }
        else
        {
            Write-Error "Nevalidní formát pro opravu času, užij formát: +hh:mm:ss nebo -hh:mm:ss"
        }
    }
}
<#
.Synopsis
   Odebere MS Universal Apps
.DESCRIPTION
    Je vhodné po instalaci systému. Odebere MS Universall Apps, což jsou sponzorské aplikace ve Windows 10. Ponechá jen Store, Kalkulačku a prohlížeč fotek, jinak vše odebere.
.PARAMETER allusers
    Přepíná do režimu, že odebírané aplikace budou odebrány všem uživatelům počítače, nokoliv jen tomu, pod kým běží PowerShell
.EXAMPLE
   Remove-MsUniversalApp
   Odebere universální aplikace pro daného uživatele, pod kterým je modul spuštěn.
.EXAMPLE
   Remove-MsUniversalApp -allusers
   Odebere universální aplikace pro všechny existující uživatele a odebere i instalační balíčky předinstalovaných aplikací ve Windows 10.
#>
function Remove-MsUniversalApp
{
    param(
        [switch]$allusers
    )
    if($allusers)
    {
        Get-AppxPackage -AllUsers | where-object {$_.name –notlike “*store*”} | where-object {$_.name -notlike "*Microsoft.WindowsCalculator*"} | where-object {$_.name -notlike "*Microsoft.Windows.Photos*"} |Remove-AppxPackage
        Get-appxprovisionedpackage –online | where-object {$_.packagename –notlike “*store*”} | where-object {$_.name -notlike "*Microsoft.WindowsCalculator*"} | where-object {$_.name -notlike "*Microsoft.Windows.Photos*"} | where-object {$_.name -notlike "*Corinth*"}| Remove-AppxProvisionedPackage -online
    }
    else
    {
        Get-AppxPackage | where-object {$_.name –notlike “*store*”} | where-object  where-object {$_.name -notlike "*Microsoft.WindowsCalculator*"} | where-object {$_.name -notlike "*Microsoft.Windows.Photos*"} |Remove-AppxPackage
    }
}
<#
.Synopsis
   Konvertuje slovník z plantextu do NTLM hash
.DESCRIPTION
    Konvertuje slovník z plantextu do NTLM hash
.PARAMETER slovnik
    Udává cestu ke slovníku formátu txt, který obsahuje hesla v plné formě
.PARAMETER vystup
    Udává cestu k výstupnímu souboru
.EXAMPLE
   Convert-PasswodToNTLMhash -slovnik H:\slovnik.txt -vystup H:\NTLMslovnik.txt
   Konvertuje všechna hesla obsažená v H:\slovnik.txt do NTLM hash a uloží je do H:\NTLMslovnik.txt
#>
function Convert-PasswodToNTLMhash
{
    param(
        [Parameter(Mandatory=$true)][string]$slovnik,
        [Parameter(Mandatory=$true)][string]$vystup
    )
    if (Get-Module -ListAvailable -Name DSInternals) {
        Update-Module -Name DSInternals -Force
    } 
    else {
        Install-Module -Name DSInternals -Force
    }
    Import-Module DSInternals
    $pwd = ""
    $pass = ""
    foreach($heslo in $slovnik)
    {
        $pwd = ConvertTo-SecureString -String $heslo -AsPlainText -Force
        $pass = ConvertTo-NTHash -Password $pwd
        Add-Content $vystup "$pass"
    }
}
<#
.Synopsis
   Vynucuje změnu hesla doménového uživatele při dalším přihlášení
.DESCRIPTION
    Vynucuje změnu hesla doménového uživatele při dalším přihlášení
.PARAMETER hromadne
    Přepíná do režimu hromadného nastavení požadavku na změnu hesla. Kombinuje se s parametrem list
.PARAMETER list
    Udává cestu k seznamu uživatelů,kteří si mají měnit heslo. Tento seznam musí být ve formátu txt a co žádek, to uživatel
.PARAMETER uzivatel
    Udává loin uživatele, který si má měnit heslo
.EXAMPLE
   Set-AdUserMustChanePassword -uzivatel zak
   Nastaví uživateli žák nutnost změnit heslo při dalším přihlášení
.EXAMPLE
   Set-AdUserMustChanePassword -hromadne -list C:\uzivatele.txt
   Nastaví nutnost změnit heslo při dalším přihlášení všem účtům uvedeným v C:\uzivatele.txt
#>
function Set-AdUserMustChanePassword
{
    param(
        [switch]$hromadne,
        [string]$list,
        [string]$uzivatel
    )
    if($hromadne)
    {
        foreach($uzivatel in $list)
        {
            Set-ADUser -Identity $uzivatel -ChangePasswordAtLogon $true
        }
    }else
    {
        Set-ADUser -Identity $uzivatel -ChangePasswordAtLogon $true
    }
}
<#
.Synopsis
   Zobrazí informace uložené v TGT nebo PRT
.DESCRIPTION
    Zobrazí informace uložené v TGT nebo PRT uživatele, pod kterým běží PowerShell. Pro svůj běh vyžaduje Full Language mode, protože využívá .NET rozhraní. To, zds dojde k vypsání informací o TGT nebo PRT záleží na ověření uživatele (AD / Entra ID)
.PARAMETER claims
    Slouží k zobrazení claimů u uživatelů přihlášených pomocí Entra ID.
.EXAMPLE
   Get-TokenInfo
   Vypíše informace obsažené v TGT, nebo PRT aktuálně přihlášeného uživatele (respektive uživatele, pod kterým běží PowerShell)
.EXAMPLE
   Get-TokenInfo -clames
   Do výpisu přidá informace o claimech v případě uživatle přihlášeného MS účtem (osobním i firemním)
#>
function Get-TokenInfo
{
    param(
        [switch]$clames
    )
    if($ExecutionContext.SessionState.LanguageMode -eq "FullLanguage")
    {
        $token = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        if($token.AuthenticationType -eq "CloudAP")
        {
            Write-Host "Informace o PRT (MS Entra ID, nebo MS účet)" -ForegroundColor Yellow
            Write-Host ""
            #výpis info
            Write-Host "AuthenticationType:" $token.AuthenticationType
            Write-Host "ImpersonationLevel:" $token.ImpersonationLevel
            Write-Host "IsAuthenticated   :" $token.IsAuthenticated
            Write-Host "IsGuest           :" $token.IsGuest
            Write-Host "IsSystem          :" $token.IsSystem
            Write-Host "Nane              :" $token.Name
            Write-Host "Owner             :" $token.Owner.Translate([System.Security.Principal.NTAccount])
            Write-Host "User SID          :" $token.User
            Write-Host "Skupiny uživatele :"
            $groupSIDs = $token.Groups # Načtení SID skupin z tokenu
            foreach($sid in $groupSIDs) { 
                try 
                { 
                    Write-Host ("                    "+($sid).Translate([System.Security.Principal.NTAccount])) 
                }
                catch 
                {
                    Write-Warning ("Není možné přeložit " + $sid.Value + ". Reason: " + $_.Exception.Message)
                }
            }
            Write-Host "Token             :" $token.Token
            Write-Host "AccessToken       :" $token.AccessToken
            if($clames)
            {
                Write-Host "UserClaims        :" -ForegroundColor Green
                $clams = $token.UserClaims
                foreach($clams in $token.UserClaims) { #výpis uživatelských clame
                    Write-Host "  type   :" $clams.Type
                    Write-Host "  Subject:" $clams.Subject
                    Write-Host "  klíč   :" $clams.Properties.Keys
                    Write-Host "  Hodnota:" $clams.Properties.Values
                    Write-Host "  " 
                }
                Write-Host "DeviceClaims      :" -ForegroundColor Green
                $clams = $token.DeviceClaims
                foreach($clams in $token.DeviceClaims) { #výpis clame zařízení
                    Write-Host "  Type   :" $clams.Type
                    Write-Host "  Subject:" $clams.Subject
                    Write-Host "  Klíč   :" $clams.Properties.Keys
                    Write-Host "  Hodnota:" $clams.Properties.Values
                    Write-Host "  " 
                }
            }
            Write-Host "Actor             :" $token.Actor
            Write-Host "BootstrapContext  :" $token.BootstrapContext
            Write-Host "Popisek           :" $token.Label
            Write-Host "NameClaimType     :" $token.NameClaimType
            Write-Host "RoleClaimType     :" $token.RoleClaimType
        }
        if($token.AuthenticationType -eq "Kerberos" -or $token.AuthenticationType -eq "Negotiate")
        {
            Write-Host "Informace o Kerberos TGT" -ForegroundColor Yellow
            Write-Host ""
            #výpis info
            Write-Host "AuthenticationType:" $token.AuthenticationType
            Write-Host "ImpersonationLevel:" $token.ImpersonationLevel
            Write-Host "IsAuthenticated   :" $token.IsAuthenticated
            Write-Host "IsGuest           :" $token.IsGuest
            Write-Host "IsSystem          :" $token.IsSystem
            Write-Host "Nane              :" $token.Name
            Write-Host "Owner             :" $token.Owner.Translate([System.Security.Principal.NTAccount])
            Write-Host "User SID          :" $token.User
            Write-Host "Skupiny uživatele :"
            $groupSIDs = $token.Groups # Načtení SID skupin z tokenu
            foreach($sid in $groupSIDs) { 
                try 
                { 
                    Write-Host ("                    "+($sid).Translate([System.Security.Principal.NTAccount])) 
                }
                catch 
                {
                    Write-Warning ("Není možné přeložit " + $sid.Value + ". Reason: " + $_.Exception.Message)
                }
            }
        }
    }
    else
    {
        Write-Error "Kód nelze v tomto režimu zabezpečení PowerSellu vykonat"
    }
    Invoke-Expression "whoami /priv"
}
<#
.SYNOPSIS
    Nastavení titulku konzole na definovaný text.
       
.DESCRIPTION
    Nastavení titulku konzole na definovaný text.

.PARAMETER TitleText
    Text titulku

.EXAMPLE
    C:\PS> Set-ConsoleTitle -Titulek '<<<This window is for installation>>>'
    Nastaví aktuální text titulku konzolena: <<<This window is for installation>>>

.NOTE
    Převzato od CyberRangers z Cyb3rtools v souladu s licencí MIT.

#>
function Set-ConsoleTitle {
    [cmdletbinding()]
    param(
        [Parameter(Mandatory = $true, HelpMessage = 'Enter new console title.')][ValidateNotNullOrEmpty()][string]$Titulek
    )

    $host.ui.RawUI.WindowTitle = $Titulek
}
<#
.SYNOPSIS
    Nalezne Alternate Data Streams v souborech ve specifických složkách.
       
.DESCRIPTION
    Nalezne Alternate Data Streams v souborech ve specifických složkách.

.PARAMETER Cesta
    Umístění, kde se mají hledat alternate data streams.

.PARAMETER Recurse
    Nalezení alternate data streams v zadaném umístění a ve všech podřízených položkách umístění.

.PARAMETER ShowContent
    Zobrazí konkrétní obsah alternate data stream na daném souboru.

.EXAMPLE
    Find-ItemADS -Cesta C:\Temp -Recurse
    Nalezení alternate data streams v souborech umístěných vadresáři C:\Temp a všech podadresářích.

.NOTE
    Převzato od CyberRangers z Cyb3rtools v souladu s licencí MIT.
#>
function Find-ItemADS {
    [CmdletBinding()]
    Param(
        [ValidateScript( {
                if (!$($_ | Test-Path) ) {
                    throw "Folder does not exist" 
                }
                if (!$($_ | Test-Path -PathType Container) ) {
                    throw "The Path argument must be a Folder."
                }
                return $true
            })]
        [Parameter(Mandatory)]
        [System.IO.FileInfo]$Cesta,
        [switch]$Recurse,
        [switch]$ShowContent
    )

    if ($Recurse) {
        $ObjectsToAnalyze = Get-ChildItem -Path $Cesta -Recurse
    }
    else {
        $ObjectsToAnalyze = Get-ChildItem -Path $Cesta
    }

    foreach ($ObjectToAnalyze in $ObjectsToAnalyze) {
        if ($ShowContent) {
            $ObjectToAnalyze | Get-Item -Stream * | Where-Object { $_.stream -ne ':$DATA' } | Select-Object -Property FileName, Stream, Length, @{n = 'Content'; e = {
                    return $(Get-Content -Path "$($_.FileName):$($_.stream)")
                }
            }
        }
        else {
            $ObjectToAnalyze | Get-Item -Stream * | Where-Object { $_.stream -ne ':$DATA' } | Select-Object -Property FileName, Stream, Length
        }
    }
}
<#
    .SYNOPSIS
        Vytváří alternativní datové proudy v konkrétních souborech nebo složkách.
    .DESCRIPTION
        Vytváří alternativní datové proudy v konkrétních souborech nebo složkách.
    .PARAMETER Stream
        Jméno alternate data stream.
    .PARAMETER Content
        Obsha alternate data streamu.
    .PARAMETER ContentEncoding
        Nastavení kódování obsahu.
    .PARAMETER ItemType
        Typ položky, do které se má ukládat alternativní datový proud.
    .PARAMETER Path
        Cesta k existujícímu souboru nebo složce pro uložení alternativního datového proudu.
    .EXAMPLE
        New-ItemADS -Path 'C:\Temp' -Name 'ADSFile.txt' -StreamName 'Secrets' -StreamContent 'This is secret content' -ContentEncoding Ascii -ItemType File
        Vytvoří soubor ADSFile.txt v C:\Temp s alternativním datovým tokem Secrets.
    .EXAMPLE
        New-ItemADS -Path 'C:\Temp' -Name 'ADSFolder' -StreamName 'Secrets' -StreamContent 'This is secret content' -ContentEncoding Ascii -ItemType Directory
        Vytvoří adresář ADSFolder v C:\Temp s alternativním datovým proudem Secrets.
    .EXAMPLE
        New-ItemADS -Path 'C:\Temp' -Name 'ADSFileWithBinary.txt' -StreamName 'SecretBinary' -StreamContent ([System.IO.File]::ReadAllBytes("C:\Source\Coreinfo.exe")) -ContentEncoding Byte -ItemType File
        Vytvoří soubor s ADS obsahující binární soubor CoreInfo.exe v alternativním datovém proudu Secrets.
    .NOTE
    Převzato od CyberRangers z Cyb3rtools v souladu s licencí MIT.
    #>
function New-ItemADS {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)][string]$StreamName,
        [Parameter(Mandatory)]$StreamContent,
        [Parameter(Mandatory)][ValidateSet('Ascii', 'Byte', 'UTF8')][string]$ContentEncoding,
        [Parameter(Mandatory)][ValidateSet('File', 'Directory')][string]$ItemType,
        [ValidateScript( {
                if (!$($_ | Test-Path) ) {
                    throw "Path does not exist" 
                }
                return $true
            })]
        [System.IO.FileInfo]$Path,
        [Parameter(Mandatory)][string]$Name
    )

    $FullName = Join-Path $Path $Name

    if ($ItemType -eq 'Directory') {
        if (Test-Path $FullName) {
            throw ('Item {0} already exists.' -f $FullName)
        }
        New-Item $FullName -ItemType Directory -Force | Out-Null
    }
    Set-Content $('{0}:{1}' -f $FullName, $StreamName) -Value $StreamContent -Encoding $ContentEncoding
}

<#
.SYNOPSIS
    Nastavení PowerShell Transcript
       
.DESCRIPTION
    Nastavení PowerShell Transcript

.PARAMETER VystupniAdresar
    Umístění, kam se budou transcripty ukládat.

.PARAMETER On
    Zapnutí transkripce.
.PARAMETER Off
    Vypnutí transkripce.

.PARAMETER IncludeInvocationHeader
    Aktivuje přidání časové známky ke zaznamenanému příkazu.

.EXAMPLE
    Set-PSTranscription -VystupniAdresar C:\Temp -IncludeInvocationHeader -On
    Zapne Trnaskripci s časovými známkami u příkazů a logy se budou ukládat do C:\Temp.

.EXAMPLE
    Set-PSTranscription -On
    Zapne Trnaskripci s výchozími parametry.

.EXAMPLE
    Set-PSTranscription -Off
    Vypne Trnaskripci.

.NOTE
    Převzato od CyberRangers z Cyb3rtools v souladu s licencí MIT. Tato funkce byla výrazněji upravena.
#>
function Set-PSTranscription{
    [CmdletBinding()] param($VystupniAdresar, [Switch] $IncludeInvocationHeader, [Switch] $On, [Switch] $Off)
    if($On)
    {
        if (!$(Test-Path $RegistryPath)) { 
            $null = New-Item $RegistryPath -Force
        }
        Set-ItemProperty $RegistryPath -Name EnableTranscripting -Value 1
        if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("OutputDirectory")) {
            Set-ItemProperty $RegistryPath -Name OutputDirectory -Value $VystupniAdresar
        }
        if ($IncludeInvocationHeader) {
            Set-ItemProperty $RegistryPath -Name IncludeInvocationHeader -Value 1
        } 
    }
    elseif($Off)
    {        Remove-Item HKLM:\Software\Policies\Microsoft\Windows\PowerShell\Transcription -Force -Recurse
    }
}
<#
.SYNOPSIS
    Nastavení PowerShell script block logging
       
.DESCRIPTION
    Nastavení PowerShell zaznamenávání zpracování příkazů, skriptových bloků, funkcí a skriptů, ať už jsou vyvolány interaktivně, nebo prostřednictvím automatizace.

.PARAMETER On
    Zapnutí PowerShell script block logging.

.PARAMETER Off
    Vypnutí PowerShell script block logging.

.EXAMPLE
    Set-PSScriptBlockLogging -On
    Zapnutí PowerShell script block logging.

.EXAMPLE
    Set-PSScriptBlockLogging -Off
    Vypnutí PowerShell script block logging.

.NOTE
    Převzato od CyberRangers z Cyb3rtools v souladu s licencí MIT. Tato funkce byla výrazněji upravena.
#>
function Set-PSScriptBlockLogging
{
    [CmdletBinding()] param([Switch] $On, [Switch] $Off)
    if($On)
    {
        [string]$RegistryPath = "HKLM:\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging"
        if (!$(Test-Path $RegistryPath)) {
            $null = New-Item $RegistryPath -Force
        }
        Set-ItemProperty $RegistryPath -Name EnableScriptBlockLogging -Value "1"
    }
    elseif($Off)
    {
        Remove-Item 'HKLM:\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' -Force -Recurse
    }
}
<#
.SYNOPSIS
    Vypíše informace o procesoru.
       
.DESCRIPTION
    Vypíše informace o procesoru.
.EXAMPLE
    Get-CPUinfo
#>
function Get-CPUinfo
{
  $Architecture = @{
  Name = 'Architecture'
  Expression = {
    $value = $_.Architecture
    switch([int]$value)
      {
        0          {'x86'}
        1          {'MIPS'}
        2          {'Alpha'}
        3          {'PowerPC'}
        6          {'ia64'}
        9          {'x64'}
        5          {'ARM'}
        12         {'ARM64'}
        default    {"$value"}
      }
      
    }  
   }
 $UpgradeMethod = @{
  Name = 'UpgradeMethod'
  Expression = {
    $value = $_.UpgradeMethod
    
    switch([int]$value)
      {
        1          {'Other'}
        2          {'Unknown'}
        3          {'Daughter Board'}
        4          {'ZIF Socket'}
        5          {'Replacement/Piggy Back'}
        6          {'None'}
        7          {'LIF Socket'}
        8          {'Slot 1'}
        9          {'Slot 2'}
        10         {'370 Pin Socket'}
        11         {'Slot A'}
        12         {'Slot M'}
        13         {'Socket 423'}
        14         {'Socket A (Socket 462)'}
        15         {'Socket 478'}
        16         {'Socket 754'}
        17         {'Socket 940'}
        18         {'Socket 939'}
        default    {"$value"}
      }
  }  
 }
 $ProcessorType = @{
  Name = 'ProcessorType'
  Expression = {
    $value = $_.ProcessorType
    
    switch([int]$value)
      {
        1          {'Other'}
        2          {'Unknown'}
        3          {'Central Processor'}
        4          {'Math Processor'}
        5          {'DSP Processor'}
        6          {'Video Processor'}
        default    {"$value"}
      }  
  }  
 }
 $Family = @{
  Name = 'Family'
  Expression = {
    $value = $_.Family
    switch([int]$value)
  {
    1          {'Other'}
    2          {'Unknown'}
    3          {'8086'}
    4          {'80286'}
    5          {'80386'}
    6          {'80486'}
    7          {'8087'}
    8          {'80287'}
    9          {'80387'}
    10         {'80487'}
    11         {'Pentium(R) brand'}
    12         {'Pentium(R) Pro'}
    13         {'Pentium(R) II'}
    14         {'Pentium(R) processor with MMX(TM) technology'}
    15         {'Celeron(TM)'}
    16         {'Pentium(R) II Xeon(TM)'}
    17         {'Pentium(R) III'}
    18         {'M1 Family'}
    19         {'M2 Family'}
    20         {'Intel(R) Celeron(R) M processor'}
    21         {'Intel(R) Pentium(R) 4 HT processor'}
    24         {'K5 Family'}
    25         {'K6 Family'}
    26         {'K6-2'}
    27         {'K6-3'}
    28         {'AMD Athlon(TM) Processor Family'}
    29         {'AMD(R) Duron(TM) Processor'}
    30         {'AMD29000 Family'}
    31         {'K6-2+'}
    32         {'Power PC Family'}
    33         {'Power PC 601'}
    34         {'Power PC 603'}
    35         {'Power PC 603+'}
    36         {'Power PC 604'}
    37         {'Power PC 620'}
    38         {'Power PC X704'}
    39         {'Power PC 750'}
    40         {'Intel(R) Core(TM) Duo processor'}
    41         {'Intel(R) Core(TM) Duo mobile processor'}
    42         {'Intel(R) Core(TM) Solo mobile processor'}
    43         {'Intel(R) Atom(TM) processor'}
    48         {'Alpha Family'}
    49         {'Alpha 21064'}
    50         {'Alpha 21066'}
    51         {'Alpha 21164'}
    52         {'Alpha 21164PC'}
    53         {'Alpha 21164a'}
    54         {'Alpha 21264'}
    55         {'Alpha 21364'}
    56         {'AMD Turion(TM) II Ultra Dual-Core Mobile M Processor Family'}
    57         {'AMD Turion(TM) II Dual-Core Mobile M Processor Family'}
    58         {'AMD Athlon(TM) II Dual-Core Mobile M Processor Family'}
    59         {'AMD Opteron(TM) 6100 Series Processor'}
    60         {'AMD Opteron(TM) 4100 Series Processor'}
    64         {'MIPS Family'}
    65         {'MIPS R4000'}
    66         {'MIPS R4200'}
    67         {'MIPS R4400'}
    68         {'MIPS R4600'}
    69         {'MIPS R10000'}
    80         {'SPARC Family'}
    81         {'SuperSPARC'}
    82         {'microSPARC II'}
    83         {'microSPARC IIep'}
    84         {'UltraSPARC'}
    85         {'UltraSPARC II'}
    86         {'UltraSPARC IIi'}
    87         {'UltraSPARC III'}
    88         {'UltraSPARC IIIi'}
    96         {'68040'}
    97         {'68xxx Family'}
    98         {'68000'}
    99         {'68010'}
    100        {'68020'}
    101        {'68030'}
    112        {'Hobbit Family'}
    120        {'Crusoe(TM) TM5000 Family'}
    121        {'Crusoe(TM) TM3000 Family'}
    122        {'Efficeon(TM) TM8000 Family'}
    128        {'Weitek'}
    130        {'Itanium(TM) Processor'}
    131        {'AMD Athlon(TM) 64 Processor Family'}
    132        {'AMD Opteron(TM) Processor Family'}
    133        {'AMD Sempron(TM) Processor Family'}
    134        {'AMD Turion(TM) 64 Mobile Technology'}
    135        {'Dual-Core AMD Opteron(TM) Processor Family'}
    136        {'AMD Athlon(TM) 64 X2 Dual-Core Processor Family'}
    137        {'AMD Turion(TM) 64 X2 Mobile Technology'}
    138        {'Quad-Core AMD Opteron(TM) Processor Family'}
    139        {'Third-Generation AMD Opteron(TM) Processor Family'}
    140        {'AMD Phenom(TM) FX Quad-Core Processor Family'}
    141        {'AMD Phenom(TM) X4 Quad-Core Processor Family'}
    142        {'AMD Phenom(TM) X2 Dual-Core Processor Family'}
    143        {'AMD Athlon(TM) X2 Dual-Core Processor Family'}
    144        {'PA-RISC Family'}
    145        {'PA-RISC 8500'}
    146        {'PA-RISC 8000'}
    147        {'PA-RISC 7300LC'}
    148        {'PA-RISC 7200'}
    149        {'PA-RISC 7100LC'}
    150        {'PA-RISC 7100'}
    160        {'V30 Family'}
    161        {'Quad-Core Intel(R) Xeon(R) processor 3200 Series'}
    162        {'Dual-Core Intel(R) Xeon(R) processor 3000 Series'}
    163        {'Quad-Core Intel(R) Xeon(R) processor 5300 Series'}
    164        {'Dual-Core Intel(R) Xeon(R) processor 5100 Series'}
    165        {'Dual-Core Intel(R) Xeon(R) processor 5000 Series'}
    166        {'Dual-Core Intel(R) Xeon(R) processor LV'}
    167        {'Dual-Core Intel(R) Xeon(R) processor ULV'}
    168        {'Dual-Core Intel(R) Xeon(R) processor 7100 Series'}
    169        {'Quad-Core Intel(R) Xeon(R) processor 5400 Series'}
    170        {'Quad-Core Intel(R) Xeon(R) processor'}
    171        {'Dual-Core Intel(R) Xeon(R) processor 5200 Series'}
    172        {'Dual-Core Intel(R) Xeon(R) processor 7200 Series'}
    173        {'Quad-Core Intel(R) Xeon(R) processor 7300 Series'}
    174        {'Quad-Core Intel(R) Xeon(R) processor 7400 Series'}
    175        {'Multi-Core Intel(R) Xeon(R) processor 7400 Series'}
    176        {'Pentium(R) III Xeon(TM)'}
    177        {'Pentium(R) III Processor with Intel(R) SpeedStep(TM) Technology'}
    178        {'Pentium(R) 4'}
    179        {'Intel(R) Xeon(TM)'}
    180        {'AS400 Family'}
    181        {'Intel(R) Xeon(TM) processor MP'}
    182        {'AMD Athlon(TM) XP Family'}
    183        {'AMD Athlon(TM) MP Family'}
    184        {'Intel(R) Itanium(R) 2'}
    185        {'Intel Pentium M Processor'}
    186        {'Intel(R) Celeron(R) D processor'}
    187        {'Intel(R) Pentium(R) D processor'}
    188        {'Intel(R) Pentium(R) Processor Extreme Edition'}
    189        {'Intel(R) Core(TM) Solo Processor'}
    190        {'K7'}
    191        {'Intel(R) Core(TM)2 Duo Processor'}
    192        {'Intel(R) Core(TM)2 Solo processor'}
    193        {'Intel(R) Core(TM)2 Extreme processor'}
    194        {'Intel(R) Core(TM)2 Quad processor'}
    195        {'Intel(R) Core(TM)2 Extreme mobile processor'}
    196        {'Intel(R) Core(TM)2 Duo mobile processor'}
    197        {'Intel(R) Core(TM)2 Solo mobile processor'}
    198        {'Intel(R) Core(TM) i7 processor'}
    199        {'Dual-Core Intel(R) Celeron(R) Processor'}
    200        {'S/390 and zSeries Family'}
    201        {'ESA/390 G4'}
    202        {'ESA/390 G5'}
    203        {'ESA/390 G6'}
    204        {'z/Architecture base'}
    205        {'Intel(R) Core(TM) i5 processor'}
    206        {'Intel(R) Core(TM) i3 processor'}
    207        {'Intel(R) Core(TM) i9 processor'}
    210        {'VIA C7(TM)-M Processor Family'}
    211        {'VIA C7(TM)-D Processor Family'}
    212        {'VIA C7(TM) Processor Family'}
    213        {'VIA Eden(TM) Processor Family'}
    214        {'Multi-Core Intel(R) Xeon(R) processor'}
    215        {'Dual-Core Intel(R) Xeon(R) processor 3xxx Series'}
    216        {'Quad-Core'}
    217        {'VIA Nano(TM) Processor Family'}
    218        {'Dual-Core Intel(R) Xeon(R) processor 5xxx Series'}
    219        {'Quad-Core Intel(R) Xeon(R) processor 5xxx Series'}
    221        {'Dual-Core Intel(R) Xeon(R) processor 7xxx Series'}
    222        {'Quad-Core Intel(R) Xeon(R) processor 7xxx Series'}
    223        {'Multi-Core Intel(R) Xeon(R) processor 7xxx Series'}
    224        {'Multi-Core Intel(R) Xeon(R) processor 3400 Series'}
    230        {'Embedded AMD Opteron(TM) Quad-Core Processor Family'}
    231        {'AMD Phenom(TM) Triple-Core Processor Family'}
    232        {'AMD Turion(TM) Ultra Dual-Core Mobile Processor Family'}
    233        {'AMD Turion(TM) Dual-Core Mobile Processor Family'}
    234        {'AMD Athlon(TM) Dual-Core Processor Family'}
    235        {'AMD Sempron(TM) SI Processor Family'}
    236        {'AMD Phenom(TM) II Processor Family'}
    237        {'AMD Athlon(TM) II Processor Family'}
    238        {'Six-Core AMD Opteron(TM) Processor Family'}
    239        {'AMD Sempron(TM) M Processor Family'}
    250        {'i860'}
    251        {'i960'}
    254        {'Reserved (SMBIOS Extension)'}
    255        {'Reserved (Un-initialized Flash Content - Lo)'}
    260        {'SH-3'}
    261        {'SH-4'}
    280        {'ARM'}
    281        {'StrongARM'}
    300        {'6x86'}
    301        {'MediaGX'}
    302        {'MII'}
    320        {'WinChip'}
    350        {'DSP'}
    500        {'Video Processor'}
    default    {"$value"}
    }
      
  }  
 }
 Get-WmiObject -Class Win32_Processor | select PSComputerName, Manufacturer, Name, $ProcessorType, AddressWidth, DataWidth, L2CacheSize, L3CacheSize, Caption, NumberOfCores, NumberOfLogicalProcessors, PowerManagementSupported, ProcessorId, VirtualizationFirmwareEnabled, VMMonitorModeExtensions, $Architecture, SocketDesignation, $UpgradeMethod, SecondLevelAddressTranslationExtensions, $Family
}
<#
.SYNOPSIS
    Vypíše datum a čas instalace / posledního upgrade.

.DESCRIPTION
    Vypíše datum a čas instalace / posledního upgrade.

.EXAMPLE
    Get-InstallDate
#>
functio Get-InstallDate
{
    (gcim Win32_OperatingSystem).InstallDate
}
Export-ModuleMember -Function '*' 
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Pokročilá nastavení BitLockeru

Tento krátký text bude o možnostech nástroje BitLocker, které nejsou konfigurovatelné pomocí GUI, ale mohou se hodit pro datové disky, USB klíčenky, zálohy nebo další paměťová média. Pro práci s níže popsaným je potřeba PowerShell, nebo příkazová řádka.

Pro odemčení jednotky je možné využít certifikátu, který vystaví interní certifikační autorita. Přidání možnosti odemknout jednotku certifikátem ukáži na příkladu níže. Pokud využíváme PowerShell je možné místo souboru certifikátu odkázat na certifikát instalovaný v systému (účet uživatele, nebo počítače).

manage-bde -protectors -add E: -certificate -cf c:\File Folder\Filename.cer

Velmi zajímavou možností pro sdílená externí paměťová média je pak možnost odemknout jednotku pomocí členství účtu uživatele, nebo počítače ve skupině zabezpečení. Pro uživatele jde o velmi pohodlnou možnost, kdy pro odemčení jednotky nemusí nic zadávat a zároveň nehrozí vyzrazení pinu nepovolané osobě. Tuto možnost ovšem nedoporučuji využívat pro zálohovací média, protože při ztrátě AD již nebude možné takové médium odemknout, pokud nebude vytvořená vytištěná záloha 48 mastného obnovovacího klíče. Níže uvedený příklad nastavuje právo odemknout jednotku E: členům skupiny ekonomického oddělení.

manage-bde -protectors -add E: -sid DOMAIN\skupina-ekonomicke

V konfiguraci nástroje BitLocker je potřeba mít pořádek, proto se hodí vypsat konfiguraci pro danou jednotku (např. C:), což provede příkaz:

manage-bde -protectors -get C:

Výše uvedený příkaz rovněž zobrazí obnovovací 48 ciferný klíč. Posledním typem, který zde v krátkosti popíši je vynucení zálohy obnovovacího klíče do účtu počítače v AD. Pomocí GPO je možné nastavit, že bez této úspěšné zálohy nepůjde zahájit šifrování, ale někdy se může hodit možnost přidat klíč ručně (např. počítač je již šifrovaný v době zařazení do domény). Pro úspěšné provedený zálohy je nutné znát ID obcovacího klíče, které je mimo jiné výstupem příkazu výše uvedeného. Vlastní zálohu pak realizuje příkaz:

manage-bde -protectors -adbackup C: -id '{00000000-0000-0000-0000-000000000000}'
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Povolení vzdálené plochy PowerShellem

Někdy je potřeba z nějakého důvodu si povolit na vzdálený PC RDP, např. aplikace, které nemají známé parametry oprav pro příkazovou řádku apod, nebo něco potřebujete prostě a jednoduše udělat v aplikaci, která zrovna pomocí PowerShell commandů ovládat nelze. Fyzicky svou cestu k počítači vážit nemusíme, pokud jde k dispozici vzdálená správa pomocí PowerShellu.

Pokud přistupuji vzdáleně, pak do relace zadám příkaz:

Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0

Pokud jsem na stroji fyzicky, musím spustit PowerSehll jako správce a následně využiji příkaz výše. Příkaz povolení realizuje změnou hodnoty položky registru. Nyní ještě musíme zajistit povolení ve Firewallu, což zajistí následující příkaz:

Enable-NetFirewallRule -DisplayGroup "Remote Desktop"

Příkaz Enable-NetFirewallRule slouží k povolení některého z hotových pravidel Firewallu, může to být některá z výchozích šablon (nikdy dříve nevyužitá), nebo uživatelsky definované pravidlo, které je v danou chvíli neaktivní či zakázané.

Posted in: Literatura, Základy PowerShellu

PowerShell CookBook

Napsal: Lee Holmes – jende z prvních členů PowerShell týmu v Microsoftu
Vydáno: leden 2013
Vydavatel: O’Reilly Media, Inc.
ISBN: 9781449320683
Vydání: 3.
Kniha plná rozšíření a vzorových řešení pro PowerShell 4. Díky aktivní práci autora a oblíbenosti jeho rozšíření mezi PowerShell MVP jsou dnes již některá z rozšíření popsaná v této knize nativní součástí PowerShell 5, například cmdlet get-clipboard a spousta dalšího.
I po 7 letech je kniha dobrým pomocníkem všem, kdo se starají o Windows platformu jak v serverové, tak klientské podobě.

Back to Top