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

Zranitelnost Follina (CVE-2022-30190)

Jde o zranitelnost online části nástroje pro automatické řešení problémů v systému Windows, konkrétně pak v jeho protokolu. Problém je, že do komunikace lze celkem bezproblému vstoupit a přesvědšit nástroj, aby komunikoval se serverem útočníka, nikoliv serverem Microsoftu.

Na edici Home doporučím řešení pomocí registru, na edici Pro a vyšší pak pomocí omezení nástroje zkrz GPO (nebo lokální politiky). Níže příkládám originální článek Windows blogu. Aktualizace 06-2022 pro Windows 10, 11, Windows server 2016, 2019 a 2022 tuto zranitelnost opravuje, prostarší systémy dále doporučuji využít postup posaný níže.

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

Zařazení všech počítačů do skupiny v Active Directory

Dnešní příspěvek je opět trocha PowerShellu a jednoduché řešní na zdánlivě triviální problém. Jde o to, jak dostat všechny počítače do určité skupiny (vlastně by se mohlo jedna po drobné úpravě i o uživatele) bez ohledu na to, ve které OU jsou. To může být potřeba například ve chvíli, kdy synchronizujeme jen určitou skupinu mezi AD a AAD pomocí Azure AD Conect.

$skupina = Read-Host -promt "Zadej distinguished name skupiny"
ADD-ADGroupMember -identity "$skupina" -members (Get-ADComputer -Filter * | select SAMAccountName)
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Úklid po aktualizacích

Asi obecně známý je nástroj cleanmgr.exe, který slouží k úklidu po aktualizacích, úklidu dočasných souborů, cache apod. Trochu hlubší úklid je možné provést pomocí nástroje DISM (automaticky jej spouští aktualizační proces u servisních aktualizací, ale i zde je lepší uživatelské zpuštění). Úklid pomocí DISM je vhodný rovněž po větších aktualizacích komponent doručených pomocí MS Store. Úklid nástrojem DISM má 2 fáze (stejně jako u cleanmgr.exe), analýzu a následný úklid.

Analýza se spouští příkazem:

DISM.exe /Online /Cleanup-Image /AnalyzeComponentStore

Vlastní úklid pak příkazem:

DISM.exe /Online /Cleanup-Image /StartComponentCleanup

Nezmínil jsem jednu důležitou věc, nástroj DISM vyžaduje na všechny operace (včetně úklidu) práva administrátora, ale to již zkušený uživatel ví a ten nezkušený se to dozví z chybového hlášení 😉

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

Plánovaná kontrola disku

Dnešní PowerShell skript vyžaduje práva administrátora a spouští kontrolu zvoleného svazku nástrojem chkdsk.exe.

d1 = get-date -format G
$vstup = Read-Host "Zadej datum a čas spuštění ve formatu: ddMMyyyyHHmm"
$disk = Read-Host "Zadej písmeno svazku ke kontrole (napr. C:)"
If(($disk.Substring($text.Length)) -ne  ":"){
$disk = $disk + ":"
}
$d2 = [datetime]::ParseExact($vstup,'ddMMyyyyHHmm',$null)
[int] $cas = (New-TimeSpan -Start $d1 -End $d2).TotalSeconds
sleep $cas
Invoke-Command -ScriptBlock {
echo y | chkdsk $disk  /F
}
#pro případ skenu systémové jednotky
Restart-Computer -Force 
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server, Základy PowerShellu

Jak obejít ExecutionPolicy v PowerShellu

Dnes bych rád ukázal, jak si může naprosto běžný uživatel spustit skript PowerShellu aníž by měl právo si měnit ExecutionPolicy. Jak víme, tak ExecutionPolicy říká, zda je možné na daném systému spouštět skripty (případně jaké skripty) psané v PowerShellu a také zda systém přijme prostřednictvím PowerShellu soubory stažené z internetu.

Ve výchozím stavu máme na klientských Windows (7, 8, 10) restricted, což velmi zjednodušeně znamená, že skripy nelze spouštět.

Užijeme PowerShell ISE:
Skript otevřeme pomocí ISE, následně pomocí CTRL+A vybareme vše a využijeme Run Selection (zkratka: F8). skript se provede. Bohužel jediné parametry, které takto můžeme zadat jsou ty Mandatory.

Využijeme průzkumníku Windows:
Na skript klikneme pravým tlačítkem myši a zvolíme Run with PowerShell. Bohužel jediné parametry, které takto můžeme zadat jsou ty Mandatory.

Změníme ExecutionPolicy v rámci daného procesu:
Použijeme příkaz: Set-ExecutionPolicy Bypass -Scope Process
Nyní v rámci daného okna PowerShellu nemáme žádné restrikce

Spustíme skript pomocí načtení do paměti:
Využijeme příkaz: Get-Content .\skript.ps1 | PowerShell -noprofile -exec bypass
Tím dojde k načtení skriptu jako příkazu a provede se. Bohužel předání parametrů je problematické, ty Mandatory předané budou.

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

Primitivní mazání duplicitních souborů Powershellem

Dnes si ukážeme, jak využít PowerShell verze 5.1 (předinstalovaný na Windows 10) nebo verze 7.x pro smazání duplicitních (mám na mysli obsahově duplicitních v rámci stejného formátu) souborů z daného adresáře a jeho podadresářů. Tento problém zcela jistě sousta z Vás řeší při nějakém tom úklidu PC.
Kód skriptu (klině lze po řádkách vkládat do konzole) je následující:

$WorkDirectory = Read-Host -Prompt „Zadejte cestu k adresáři, který chcete zbavit duplicitnich souboru:“
$OutputDirectory = Read-Host -Prompt „Zadejte cestu k adresáři pro umisteni vysledku: „
#vypíše soubory a jejich sha512 do csv
Get-ChildItem -Path $WorkDirectory -Recurse -ErrorAction SilentlyContinue | Get-FileHash -Algorithm SHA512 | select Path, Hash | Export-Csv -Path „$OutputDirectory\All_Files.csv“ -Delimiter ‚;‘ -Encoding UTF8 -NoTypeInformation
#načte si csv s informacemi o souborech
$soubor = Import-Csv -Path „$OutputDirectory\All_Files.csv“ -Delimiter „;“
#identifikuje SHA512, které jsou v informačním csv více jak 1x
$duplikat = ($soubor.hash | Group-Object | Where-Object -FilterScript {$_.count -gt 1}).values
#na základě SHA512 identifikuje soubory, které jsou v prohledávaném adresáři a jeho podadresářích více jak 1x
$vystup = ($soubor | ForEach-Object {if($_.hash -in $duplikat) {$_}}) | Sort-Object -Property Hash
#najde od každého vícenásobného souboru „originál“
$vystup2 = ($soubor | ForEach-Object {if($_.hash -in $duplikat) {$_}}) | Sort-Object -Property Hash -Unique
#smaže všechny výskyty vícenásobných souborů vyjímaje originálů
(($vystup | ForEach-Object {if($_ -notin $vystup2) {$_}}) | Sort-Object -Property Hash).Path | Remove-Item -force

# O něco chytřejší funkci PowerShellu, která umí uklízet ještě lépe si představíme někdy příště.

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

Práce s ESD

V tomto příspěvku bych se s Vámi rád podělil o svůj PowerShell modul, který prostřednictvím nástroje DSM umožňuje vytvářet datové Archivy ve formátu ESD a rovněž již Existující ESD soubory extrahovat do složky.
Infomrace je schopen číst i o WIM souborech a vlastně nic nebrání vytvoření souboru ve formátu WIM místo ESD, rozbalení WIM pak sice zvládnuto je, ale stojí hodně času.
Pro stažení modulu a zobrazení jeho zdrojového kódu čtěte dále Stažení modulu ve formátu psm1

Zdrojový kód modulu:

@{
        Author = ‚Petrásek Jan‘
        CompanyName = ‚elektrotechnika.vesele.info‘
        Copyright = ‚Petrásek ©2020‘
        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ů. Informace dokáže vypsat i o Wim souboru.‘
        PowerShellVersion = ‚5.1‘ #minimální verze PowerShellu
        CLRVersion = ‚5.1‘ #minimální verze příkazového runtimeu
        ModuleVersion = ‚1.0‘
        ModulToProcess = ‚folder2ESD.psm1‘
        AliasesToExport = ‚*‘ #oddělujeme čárkou
        FunctionsToExport =’*‘
    }

Set-Alias -name F2ESD -value Convert-Folder2ESD
function Convert-Folder2ESD
{
<#
  .Synopsis
     Convert-Folder2ESD
  .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ů.
  .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
#>
    param(
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [validateSet(‚Info‘, ‚dekomprese‘, ‚komprese‘)] [Alias(‚r‘)]
    [string]$rezim,
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [Alias(‚f‘)]
    [string]$soubor,
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [Alias(‚d‘)]
    [string]$slozka,
    [Parameter(Mandatory=$false, ValueFromPipeline=$true)] [Alias(‚name‘, ‚n‘)]
    [string]$nazev,
    [Parameter(Mandatory=$false, ValueFromPipeline=$true)] [Alias(‚i‘)]
    [string]$index
    )

    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
            }
            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
        }
    }
}
#Zobrazní nápovědy

man Convert-Folder2ESD -ShowWindow

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

Nastavit všechna připojení na doménová

Mám pro všechny kolegy správce ideální příkaz do příkazové řákdy, který nastaví na stanici všechna existující připojení jako doménová. Tento příkaz se může hodit především jako součást task sekvence v MDT nebo SCCM.
Tady je: powershell.exe $net = get-netconnectionprofile;Set-NetConnectionProfile -Name $net.Name -NetworkCategory DomainAuthenticated

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

Odinstalace aktualizací od určeného data po dnešek

<#
    Skript odebere všechny hotfiy ze systmu, které byly instalované mezi zadaným datumem a dneškem.
    Autor nenese žádnou odpovědnost za případné škody, uživatel je povinen před spuštěním se seznámit se skriptem!

    Požadavky:
    – PowerShell verze 5 a novější
    – ExcutionPolicy set na bypass

    Petrásek Jan
    ©2020
#>
Write-Host ‚Odinstalace všech aktualizací od zadaného datmu po dnešek‘
$datum = Read-Host -Prompt „Zadejte datum: „
$ListOfHotfixes = Get-Hotfix |where -Property InstalledOn -ge (get-date -date $datum)

    foreach ($item in $ListOfHotfixes)
    {
        $polozka = $item.hotfixID
        $cislo = [string] $polozka.Split(„KB“)
        $c = $cislo.TrimStart()
        wusa.exe /uninstall /kb:$c /norestart /quiet | out-null
    }

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

Zjištění informací o Off-line instalaci Windows a Off-line úprava registrů

Dnes bych rád ukázal postup, kterým je možné pomocí instalačního média Windows se dostat k informacím obsaženým v registrech off-line instalace Windows, nebo provést některé změny v registrech, které je lepší provádět off-line. Tento postup se hodí především v dnešní době, kdy je nemálo instalací Windows 10 poháněno digitální licencí na základě HW, nebo upgrade nároku ze starší verze Windows. Při reinstalaci Windows s digitální licencí je dnes potřeba (pokud není využito vestavění digitální licence do UFI) vědět, kterou edici máte na instalačním médiu zvolit, což ví člověk bezpečně u svého zařízení, ale u zařízení rodinných příslušníků nebo přátel to již tak jednoznačné být nemusí.
Pojďme se nyní podívat, jak se tedy pomocí registrů dostat k informacím o instalaci, či jak ovlivnit off-line registry operačního systému Windows. Ti, kdož tento odstave čtou z náhledu článku v rubrice by si nyní měli otevřít celý článek. Nyní již k věci, pojďme si ukázat jak na Windows 7 a novějších zjistit informace o OS, nebo udělat zásahy do registru, když systém nestartuje. Pokud systém nestartuje, je tedy v Off-line režimu, je možné PC spustit z instalačního média Windows 7 nebo novějšího bez ohledu na to, jaké Windows od verze 2000 byly na PC instalovány i bez ohledu na to, zda se jednalo o 32 nebo 64 bit instalaci. Příklad ukáži na instalačním médiu Windows 8, s užitím média Windows 10, jsou jednotlivé kroky stejné, jen mají trochu jiné umístění voleb.
Spustíme tedy PC z instalačního média a zvolíme opravit PC.

V příkazovém řádku vyvoláme notepad.exe, abychom pomocí Soubor => Uložit jako mohli vyvolat průzkumník Windows. Pomocí průzkumníka si nyní můžeme zjistit, jak se jmenuje systémový diska off-line instalace, na základě složky Program Files (x86) respektive její nepřítomnosti, zjistíme, zda je instalace x64 nebo x86. Pomocí takto vyvolaného průzkumníka je možné rovněž přenášet soubory na externí jednotky, nebo interní datový disk. Klasické volání Explorer.exe skončí chybou, tento program není možné volat z instalačního média takto na přímo.

Nyní již přistupme k zjištění podrobných informací o instalaci. Tyto informace v případě reinstalace Windows 8, 8.1 nebo 10 potřebujeme pro uplatnění elektronické licence.
Zavřeme notepad a zavoláme regedit.exe. Klikneme na větev HKEY_LOCAL_MACHINE a následně použijeme Soubor => Načíst Podregistr

Na systémovém disku si najdeme složku Windows\System32\Config

Najdeme si registrovou větev SOFTWARE a zvolíme otevřít.

Nyní zadáme název, pod kterým se nám tato větev registru načte.

Nyní daný podregistr najdeme.

V načteném podregistru najdeme následující cestu: HKEY_LOCAL_MACHINE\Off-line\Microsoft\Windows NT\CurrentVersion

Zde vidíme všechny informace o systému, BuildLabEx obsahuje architekturu systému, zde si můžeme potvrdit naše zjištění ze souborového systému. Produktový klíč je možné zjistit pomocí nástrojů třetích stran, např. Nirsoft. Po dokončení práce zavřeme regedit a příkazem Exit se dostaneme z příkazového řádku dostaneme do možností opravy počítače, kde je možné PC ukončit, nebo se pokusit o automatické opravy, pokud jsme použili správné instalační médium.

Back to Top