Posted in: Základy PowerShellu

České video tutoriály pro úplný začátek s PowerShellem

Dnes bych se rád podělil o videa, která zveřejnil Microsoft na Channel 9 a mě osobně hodně pomohly se základy PowerShellu. Po sloučení Channel 9 a MS Learn tato česká videa přestala být dostupná a je potřeba se pro ně vypravit do webových archivů. Autorem české PowerShell akademie je David Moravec MVP. Online video se bohužel načítá z archivu pomalu, proto prosím o trpělivost při vyčkávání na obsah.

Úvod do PowerShellu

Stažení přímo z archivu

Práce se rourou (pajpou)

Stažení přímo z archivu

Exporty a PS Drive

Stažení přímo z archivu

CIM a skripty

Stažení přímo z archivu

Azure

Stažení přímo z archivu

Alternativní možnost stažení všech videí

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: 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ě.

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

Vytvoření ISO souboru ze složky pomocí PowerShellu

Následující skript, který v článku uveden je převzat z Githubu: https://raw.githubusercontent.com/wikijm/PowerShell-AdminScripts/master/Miscellaneous/New-IsoFile.ps1
Skript je otestován a je v pořádku, na druhou stranu má jednu nevýhodu, kterou je, že nepracuje, pokud je PowerShell v režimu Constrained Language Mode, protože přímo využívá .NET příkazy.

Zdrojový kód skriptu

function New-IsoFile
{
<# .Synopsis Creates a new .iso file .Description The New-IsoFile cmdlet creates a new .iso file containing content from chosen folders .Example New-IsoFile „c:\tools“,“c:Downloads\utils“ This command creates a .iso file in $env:temp folder (default location) that contains c:\tools and c:\downloads\utils folders. The folders themselves are included at the root of the .iso image. .Example New-IsoFile -FromClipboard -Verbose Before running this command, select and copy (Ctrl-C) files/folders in Explorer first. .Example dir c:\WinPE | New-IsoFile -Path c:\temp\WinPE.iso -BootFile „${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\efisys.bin“ -Media DVDPLUSR -Title „WinPE“ This command creates a bootable .iso file containing the content from c:\WinPE folder, but the folder itself isn’t included. Boot file etfsboot.com can be found in Windows ADK. Refer to IMAPI_MEDIA_PHYSICAL_TYPE enumeration for possible media types: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366217(v=vs.85).aspx .Notes NAME: New-IsoFile AUTHOR: Chris Wu LASTEDIT: 03/23/2016 14:46:50 #>

[CmdletBinding(DefaultParameterSetName=’Source‘)]Param(
[parameter(Position=1,Mandatory=$true,ValueFromPipeline=$true, ParameterSetName=’Source‘)]$Source,
[parameter(Position=2)][string]$Path = „$env:temp\$((Get-Date).ToString(‚yyyyMMdd-HHmmss.ffff‘)).iso“,
[ValidateScript({Test-Path -LiteralPath $_ -PathType Leaf})][string]$BootFile = $null,
[ValidateSet(‚CDR‘,’CDRW‘,’DVDRAM‘,’DVDPLUSR‘,’DVDPLUSRW‘,’DVDPLUSR_DUALLAYER‘,’DVDDASHR‘,’DVDDASHRW‘,’DVDDASHR_DUALLAYER‘,’DISK‘,’DVDPLUSRW_DUALLAYER‘,’BDR‘,’BDRE‘)][string] $Media = ‚DVDPLUSRW_DUALLAYER‘,
[string]$Title = (Get-Date).ToString(„yyyyMMdd-HHmmss.ffff“),
[switch]$Force,
[parameter(ParameterSetName=’Clipboard‘)][switch]$FromClipboard
)

Begin {
($cp = new-object System.CodeDom.Compiler.CompilerParameters).CompilerOptions = ‚/unsafe‘
if (!(‚ISOFile‘ -as [type])) {
Add-Type -CompilerParameters $cp -TypeDefinition @‘
public class ISOFile
{
public unsafe static void Create(string Path, object Stream, int BlockSize, int TotalBlocks)
{
int bytes = 0;
byte[] buf = new byte[BlockSize];
var ptr = (System.IntPtr)(&bytes);
var o = System.IO.File.OpenWrite(Path);
var i = Stream as System.Runtime.InteropServices.ComTypes.IStream;

if (o != null) {
while (TotalBlocks– > 0) {
i.Read(buf, BlockSize, ptr); o.Write(buf, 0, bytes);
}
o.Flush(); o.Close();
}
}
}
‚@
}

if ($BootFile) {
if(‚BDR‘,’BDRE‘ -contains $Media) { Write-Warning „Bootable image doesn’t seem to work with media type $Media“ }
($Stream = New-Object -ComObject ADODB.Stream -Property @{Type=1}).Open() # adFileTypeBinary
$Stream.LoadFromFile((Get-Item -LiteralPath $BootFile).Fullname)
($Boot = New-Object -ComObject IMAPI2FS.BootOptions).AssignBootImage($Stream)
}

$MediaType = @(‚UNKNOWN‘,’CDROM‘,’CDR‘,’CDRW‘,’DVDROM‘,’DVDRAM‘,’DVDPLUSR‘,’DVDPLUSRW‘,’DVDPLUSR_DUALLAYER‘,’DVDDASHR‘,’DVDDASHRW‘,’DVDDASHR_DUALLAYER‘,’DISK‘,’DVDPLUSRW_DUALLAYER‘,’HDDVDROM‘,’HDDVDR‘,’HDDVDRAM‘,’BDROM‘,’BDR‘,’BDRE‘)

Write-Verbose -Message „Selected media type is $Media with value $($MediaType.IndexOf($Media))“
($Image = New-Object -com IMAPI2FS.MsftFileSystemImage -Property @{VolumeName=$Title}).ChooseImageDefaultsForMediaType($MediaType.IndexOf($Media))

if (!($Target = New-Item -Path $Path -ItemType File -Force:$Force -ErrorAction SilentlyContinue)) { Write-Error -Message „Cannot create file $Path. Use -Force parameter to overwrite if the target file already exists.“; break }
}

Process {
if($FromClipboard) {
if($PSVersionTable.PSVersion.Major -lt 5) { Write-Error -Message ‚The -FromClipboard parameter is only supported on PowerShell v5 or higher‘; break }
$Source = Get-Clipboard -Format FileDropList
}

foreach($item in $Source) {
if($item -isnot [System.IO.FileInfo] -and $item -isnot [System.IO.DirectoryInfo]) {
$item = Get-Item -LiteralPath $item
}

if($item) {
Write-Verbose -Message „Adding item to the target image: $($item.FullName)“
try { $Image.Root.AddTree($item.FullName, $true) } catch { Write-Error -Message ($_.Exception.Message.Trim() + ‚ Try a different media type.‘) }
}
}
}

End {
if ($Boot) { $Image.BootImageOptions=$Boot }
$Result = $Image.CreateResultImage()
[ISOFile]::Create($Target.FullName,$Result.ImageStream,$Result.BlockSize,$Result.TotalBlocks)
Write-Verbose -Message „Target image ($($Target.FullName)) has been created“
$Target
}
}

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, Základy PowerShellu

Odesílání emailu pomocí PowerShellu

S moderní autentizací na straně emailových serverů dokážeme i nadále PowerShellem odesílat emaily. Následující kód využívá SMTP Office 365 pro Evropu k odeslání emailu. Kód je určen k uložení ve formátu ps1 a volání s patřičnými parametry. Odesílání emailů tak může zajíst např. zasílání výpisu z logů, nebo odbavovat požadavky v rámci naší serverové aplikace. Po úpravě SMTP serveru zvládne spolupracovat i s jinými emailovými službami.
Zdrojový kód skriptu:


param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string] $userName,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string] $password,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string[]] $komu,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string] $predmet,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string] $telo,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][switch] $teloHTML,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][switch] $priloha,
[Parameter(Mandatory=$false, ValueFromPipeline=$true)][string] $cestaKpriloze

)
[SecureString]$securepassword = $password | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securepassword
$server = „smtp.office365.com“
$port = 587
if($teloHTML -and $priloha)
{
Send-MailMessage -SmtpServer $server -Port $port -UseSsl -From $userName -To $komu -Subject $predmet -Body $telo -BodyAsHtml -Attachments $cestaKpriloze -Credential $credential
}
elseif($teloHTML)
{
Send-MailMessage -SmtpServer $server -Port $port -UseSsl -From $userName -To $komu -Subject $predmet -Body $telo -BodyAsHtml -Credential $credential
}
elseif($priloha)
{
Send-MailMessage -SmtpServer $server -Port $port -UseSsl -From $userName -To $komu -Subject $predmet -Body $telo -Attachments $cestaKpriloze -Credential $credential
}
else
{
Send-MailMessage -SmtpServer smtp.office365.com -Port 587 -UseSsl -From $userName -To $komu -Subject $predmet -Body $telo -Credential $credential
}

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

Generování hesel v PowerShellu

Každý správce, který se stará o nějaký identitní systém, potřebuje vymýšlet bezpečná jednorázová hesla. K tomu mu může sloužit například následující kousek PowerShell kódu:

$delka = 10
$specZnaku = 2
Add-Type -AssemblyName System.Web
[System.Web.Security.Membership]::GeneratePassword($delka,$specZnaku)

Verze, která nevyužívá volání .NET:

function Generate-Password
{
param
(
[int] $delka = 12,
[switch] $specZnak
)
$length = $delka
if($specZnak)
{
$charSet = ‚abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{]+-[*=@:)}$^%;(_!&#?>/|.‘.ToCharArray()
}
else
{
$charSet = ‚abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘.ToCharArray()
}
$rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
$bytes = New-Object byte
$rng.GetBytes($bytes)
$result = New-Object char
for ($i = 0 ; $i -lt $length ; $i++) {
$result[$i] = $charSet[$bytes[$i]%$charSet.Length]
}
return (-join $result)
}

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

Spuštění PowerShellu pod účtem operačního systému

V rámci balíčku nástrojů SysInternals od Microsoftu je k dispozici nástroj PSEXEC, který umožní spouštět aplikace pod účtem operačního systému. Nejspolehlivější a nejlepší využití je spustit si PowerShell, protože jeho pomocí mohu dělat cokoliv a spouštět cokoliv.
Příkaz bude mít tvar:
psexec -s -i powershell

Stažení a dokumentace PSXEC

Back to Top