Posted in: Základy PowerShellu

Nápověda PowerShellu

PowerShell je MS produktem s nejlepší dokumentací. Hodně tomu napomáhá silná komunita, ale také fakt, že PowerShell prochází všemi produkty Microsoftu. Pojďme se tedy podívat, jak pracovat s nápovědou, tedy dokumentací.

Před prvním užitím je dobré nápovědu aktualizovat:

Update-Help -Force

Nyní nám již nic nebrání otevřít si okno nápovědy

Get-Help -ShowWindow

Na tomto místě by se slušelo říct, že PowerShell má dva základní druhy nápovědy:

  1. Nápovědu k příkazům
  2. Tématickou nápovědu

Nápovědu k příkazu spustíme tak, že za příkaz nápovědy dáme příkaz, k němuž hledáme nápovědu. Opět na příkladu, řekněme, že chci zjistit nápovědu k práci s procesy ve Windows:

get-help process

Nyní vidím příkazy pro práci s procesy, např. pro výpis procesů vidím, že slouží příkaz get-process a pokud budu chtít další informace o tomto příkazu zadám si 

get-help get-process -ShowWindow
#nebo prop výpis v konzoli
get-help get-process

Kdo by chtěl v konzoli podrobnou nápovědu, pak využije příkaz:

get-help get-process -Full

Komu se naopak nechce číst celou nápovědu, ale chce vidět jen příklady použití, pak může využít:

get-help get-process -examples

Příklady užití příkazu přikládám z vlastního modulu:

Asi nejzajímavější možností, pokud je k dispozici konektivita, je zobrazení nápovědy online pomocí výchozího webového prohlížeče:

get-help get-process -online

A jak je to s tématickou nápovědou? Inu dost obdobně jako s tou k cmdletům. Základem je opět příkaz get-help, ale másto názvu příkazu nebo odvětví zadávám about_ a tématický okruh. V tomto případě již důrazně doporučuji otevírat nápovědu v samostatném okně. Opět si vše ukažme na příkladu, budou nás zajímat rozšíření PowerShellu, kterým se říká moduly:

get-help about_modules -ShowWindow

Pokud se vám zdá psát get-help zdlouhavé, tak mě také, proto prozradím zkratku, stačí napsat man. Připomíná vám to Bash? Nedivím se, jde o jednu ze zkratek, kterou PowerShell právě z Bashe převzal ;). Případně se dá syntaxe převzít z CMD a lze pro základní nápovědu psát (vždy základní výpis do konzoly):

get-process -?

Tvorba nápovědy

Vlastní skripty, funkce a moduly můžeme rovněž vybavit integrovanou nápovědou. Pro skripty a moduly publikované v PowerShell galerii je povinností nápovědu obsahovat. Pokud využíváme pro psaní PowerShell ISE, tak nám s nápovědou pomohou snipety, ale i bez nich to není nic těžkého, jde vlastně o blokový komentář, který má předepsaný tvar.

Nápověda nemusí obsahovat všechny bloky uvedené na obrázku (může navíc obsahovat .NOTE [informace o autorovi a verzi] apod.), úplný výčet klíčových slov a jejich význam je v dokumentaci. Častěji má nápověda podobu následujícího příkladu:

<#
.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
#>

Pokud jsou komentáře u definic parametrů, pak výsledná nápověda vypadá následovně:

Synopsis
    kontrola systémovýh souborů.

Description
    kontrola systémových souborů nativními nástroji scf a dism


Parameters
    -path <String>
        Určuje cestu k souboru, který má být verifikován nebo opraven

        Required?                    false
        Position?                    1
        Default value                
        Accept pipeline input?       true (ByPropertyName)
        Accept wildcard characters?  false

    -scannow <SwitchParameter>
        Spustí kontrolu systémových souborů běžícího systému, vede na sfc /scannow

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -verifyonly <SwitchParameter>
        Provede kontrolu bez pokusů o opravu poškozeného souboru, vede na sfc /verifyonly

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -scanfile <SwitchParameter>
        Nastavuje nástroj sfc do móduz kontroly konkrétního soubooru, vždy kombinován s parametrem Path

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -offline <SwitchParameter>
        Říká, že se bude verifikovat jiná, nežli běžící instance systému Windows, kombinuje se s parametry offbootdir a offwindir

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -verifyfile <SwitchParameter>
        kontrola souboru

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -offbootdir <String>
        U offline kopie systému Windows říká, který disk je její systémový

        Required?                    false
        Position?                    named
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -offwindir <String>
        U offline kopie systému Windows udává její systémový adresář

        Required?                    false
        Position?                    named
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -store <SwitchParameter>
        pomocí nástroje DISM provede sken a následně opravu systémových balíčů běžící kopie systému Windows

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false



Syntax
    Check-SystemFiles [[-path] <String>] [-scannow ] [-verifyonly ] [-scanfile ] [-offline ] [-verifyfile ] [-offbootdir <String>] [-offwindir <String>] [-store ] [<CommonParameters>]


Examples
    -------------------------- EXAMPLE 1 --------------------------
    PS C:\>Check-SystemFiels -scannow
    
    provede příkaz sfc /scannow




    -------------------------- EXAMPLE 2 --------------------------
    PS C:\>Check-SystemFiels -verifyonly
    
    provede příkaz sfc /verifyonly - tedy pouze kontrolu bez oprav




    -------------------------- EXAMPLE 3 --------------------------
    PS C:\>Check-SystemFiels -scanfile -Path c:\windows\system32\kernel32.dll
    
    Provede kontrolu integrity a pokusí se o opravu souboru kernel32.dll




    -------------------------- EXAMPLE 4 --------------------------
    PS C:\>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 5 --------------------------
    PS C:\>Check-SystemFiels -store
    
    Provede kontrolu systému příkazem dism /online /cleanup-image /restorehealth

Jak je vidět, nápovědu je možné (až na klíčová slova definující jednotlivé sekce) psát v mateřském jazyce, ale pro PowerShell galerii je potře mít nápovědu anglicky, teoreticky pak můžete mít značkou jazyka odlišený odstavec mateřském jazyce v každé sekci.

Posted in: Základy PowerShellu

Svatá trojice – aneb 3 nejzákladnější příkazy PowerShellu

Svatou trojicí nazývám trojici nejdůležitějších cmdletů (příkazů), které nám dokáží pomoci při naší práci s PowerShellem. Jen pro pořádek v PowerShellu provádíme komentář znakem #

Get-command

Slouží k vypsání všech dostupných příkazů, které můžeme užívat. Problémem je opravdu obří množství příkazů, které se ještě liší dle toho, jaká rozšíření jsou na daném počítači dostupná.

Máme možnost nechat si vypsat jen podstatné příkazy v kontextu našeho aktuálního příkazového okna. V takovém případě PowerShell zohlední to, která rozšíření máme aktivní, zda jsme na vzdáleném počítači či provádíme správu konkrétní cloudové aplikace. Příkaz pak má tvar: 

Get-Command -ListImported

Již tady padla zmíňka o rozšířeních PowerShellu (tzv. modulech), pak je asi logické, že je možné zeptat se na příkazy, které obsahuje konkrétní rozšíření, např. modul pro Office 365: 

Get-Command -Module MSOnline

Poslední možnost, kterou zmíním je vypsání informací o konkrétním příkazu včetně jeho syntaxe, tuto možnost si ukážeme na příkazu pro vypsání obsahu adresáře: 

Get-Command Get-Childitem | select *

Get-Help

Tento příkaz slouží pro hledání v nápovědě, pokud nechcete pracovat s Googlem nebo online nápovědou. Další informace najdete v kapitole o nápovědě.

Get-Member

PowerShell stejně jako ostatní moderní jazyky je objektový, proto potřebuje něco, co dokáže vypasat vlastnosti a dovednosti objektu, tedy programátorsky metody a vlastnosti.

Pojďme si vše opět ukázat na příkladu, využijme opět procesy systému a pojďme zjistit, co vše můžeme s procesy dělat a zjišťovat o nich. Výše jsme si ukázali, že výpis procesů zajistí příkaz get-process. Pokud využijeme příkaz:

get-process | get-member

Dostaneme seznam obecných vlastností procesů a jejich popis, samozřejmostí je seznam úkonů, které můžeme s procesy dělat. Vidíme, že můžeme například proces zabít, což dělá metoda kill.

Z výše uvedeného víme, že zabití procesu správce úloh by se provedlo příkazem:

get-process -name taskmgr | kill
Posted in: Základy PowerShellu

Co je PowerShell?

„Peklo je teprve předstupněm PowerShellu“ (cit. Ondřej Ševečk)

PowerShell je skriptovací jazyk z dílen Microsoftu, který je dnes již dostupný napříč platformami. Do verze 5.1 šlo o výhradně Widnows nástroj, od verze Core 6 je možné jej instalovat i na Linux či macOS.

Powershell slouží hlavně pro automatizci a úloh správy počítačů, serverů a síťových prvků, ale díky své všestranosti a intuitivnosti si našel své místo i u programátorů a hekrů. Původní PowerShell stál (a na Windows stále stojí) nad .NET Frameworkem, z toho plyne, že umí volat i .NET příkazy.

Pokročilé zabezpečení je dostupné od verze 5, ale již od verze 3 bylo možné určité omezení toho, co lze spouštět. Základní vlastností PowerShellu je modulárnost, existují statisíce modulů, kterými je možné si Powershell obohatit a každý si může napsat svoje vlastní moduly. Nejsnažší cestou, jak přijít k modulu je na Widnows serveru instalace nové role či funkce, kde pokud zahrneme nástroje pro správu získáme tím krom MMC konzole i rozšíření PowerShellu, dále je možné moduly instalovat příkazem, který je stáhne z internetu (např. z PowerShell Galerie).

Jen pro zajímavost, někteří pamětníci mohou znát projekt Nomád, pod kterým se první generace PowerShellu představila veřejnosti v roce 2005. První i druhá generace podporovaly Windows XP a Widnows server 2003.

Druhou zajímavostí je, že Microsoftu PowerShell tým stále vede jeden z otců Powershellu Jeffrey Snover.

Historie

•2005 představen veřejnosti projekt Nomád

•2006 z projektu Nomád se stává PowerShell verze 1

•2009 verze 2 umožňující rozšiřitelnost

•2012 verze 3 se základní podporou nastavení bezpečnosti

•2016 verze 5 s pokročilou bezpečností

•2018 PowerShell Cor verze 6, první multiplatformní verze

•2020 PowerShell verze 7 LTS nad .NET Core 3.1

•Verze 7 100% dokáže nahradit verzi 5 na Windows

Jmenná konvence verzí

  • Verze 1 až 5.1: Windows PowerShell
  • verze 6: PowerShell Core
  • Verze 7: PowerShell

Názvosloví

Technické požadavky

Windows

Na platformě Windows můžeme dnes již provozovat jak běžný PowerShell, tak jeho multiplatformní verzi Core. Poslední verzí je PowerShell 7.1, který je nyní na Windows k dispozici jako Preview, nicméně základ tvoří předinstalovaný Powershell verze 5.1 ve Windows 10.

Jaké verze Windows pordporuje PowerShell 5.1 a 7?

Od Windows 7 je PowerShell nějaké verze nativní součístá operačního systému. Na serverch je pak nativně Powershell dostupný nativně od verze 2008.PowerShell 5.1 je možné si manuálně doinstalovat na:

  • Windows 7 SP1
  • Windows 8
  • Windows 8.1
  • Windows server 2008 R2
  • Windows server 2012
  • Windows server 2012 R2

Windows 10, Windows server 2016 a Windows server 2019 jej obsahují nativně

Powershell verze 7 lze ručně instalovat na všechny výše zmíněné OS, není nativně obsažen v žádné verzi Windows.

PowerShell 5.x je sovu instalací svázán s frameworkem pro vzdálenou správu počítače a je k dispozici jako samostatná aktualizace Windows. Novější verze se pak instalují jako libovolný jiný program.

Powershell Core, tedy multiplatformní verzi, je potřeba vždy instalovat. Tato verze na Windows ovšem může fungovat po boku nativní Windows verze.

Linux

Přátelé z Linoxového spektra IT mě mají za blázna, když mým prvník krokem po příchodu k Linux počítači byla instalae PowerShellu. Většinový názor linuxáků je, že Bash stačí, ale pro ty, kteří potřebují skriptovat na Windows i Linuxu a nechtějí vše psát dvakrát v různých jazycích zde uvedu přehled distribucí, které podporují instalaci PowerShell Core.

Podporované distribuce:

  • Ubuntu
  • Debian
  • CentOS
  • Red Hat Enterprise Linux
  • OpenSUSE
  • Fedora

Komunitní balíčky jsou k dispozici i pro:

  • Arch Linux
  • Kali Linux

Ty komunitní balíčky jsou mimo oficiální podporu Micorosftu.

macOS

Pro příznivce Apple je k dispozici PowerShell Core na jejich macOS 10.12 a novější.

Posted in: Windows 10, Windows 11, Windows server

Odinstalace programů PowerShellem

Nainstalovat program příkazovou řádkou, nebo pomocí PwerShellu, klidně i vzdáleně, není nic až tak těžkého. Pro msi balíčky máme msiexec a pro balíčky z MS Store máme rovněž integrované jednotné nástroje, horší je to s exe soubory, tam potřebujeme pokyny od vydavatele aplikace. Otázkou pak zůstává, jak vzdáleně takové programy odinstalovat.

Vzdálený přístup na systém nám může zajistit vzdálená relace, nebo v případě software distribuovaného jako msi také parametr ComputerName. Pokud chceme odebrat program, který byl instalován jako MSI, pak potřebujeme identifikační číslo dané instalace programu. Identifikační číslo nejsnáze zjistíme příakzem:

Get-WmiObject Win32_Product | select Name, Version, IdentifyingNumber | FL
#pro vzdálený počítač
Get-WmiObject Win32_Product -ComputerName pc2 | select Name, Version, IdentifyingNumber | FL

Následuje již příklad se samotnou odinstalací programu:

(Get-WmiObject Win32_Product | where IdentifyingNumber -eq "{C17F6DEF-D34C-4B75-97E1-D81062408B4A}").Uninstall()
#pro vzdálený počítač
(Get-WmiObject Win32_Product -ComputerName pc2 | where IdentifyingNumber -eq "{C17F6DEF-D34C-4B75-97E1-D81062408B4A}").Uninstall()

Pokud budu chtít odebrat programy, které jsou instalované pomocí exe souborů, pak potřebuji malinko jiný příkaz, ale i to se dá zvládnout vzdáleně, tentokrát již s pomocí vzdálené relace (Enter-PSSession).

Get-Package -ProviderName Programs -IncludeWindowsInstaller | select Name, Version, Source, ProviderName | FL
#příklad odinstalace 7zipu
Get-Package -Name "7-zip*" | Uninstall-Package
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Správa automatického spouštění aplikací PowerShellem

Všichni čas od času řešíme, co se nám spouští spolu s přihlášením, no startem systému. Často jsou to chtěné funkcionality, jako třeba OneDrive, ale např. Teams již chtěné být nemusí a spousta dalších aplikací zrovna tak. Běžně se tyto problémy dají řešit pomocí Autoruns od Sysinternals, správcem úloh, nebo složitěji přes registry, služby a specifické složky. Ale jak to řešit na vzdáleném počítači? Když vynecháme RDP, AnyDesk a další, které připojí pracovní plochu jiného PC, zbyde nám PowerShell a editor registru (pokud je povolná vzdálená správa registru). A právě o možnostech PowerShellu to dnes bude.

PowerShllem máme 2 možnosti řešení, tu komplexnější, kdy využijeme vzdáleného připojení pomocí Enter-PSSession -ComputerName <název počítače>, nebo budeme využívat parametr ComputerName. Níže budu popisovat řešení přímé připojení se k danému stroji pomocí Enter-PSSession.

Automaticky spouštěné položky vypíšeme následujícím příkazem:

Get-CimInstance Win32_StartupCommand | Select-Object Name, command, Location, User | Format-List

Bližší informace k příkazu Get-CimInstance jsou v dokumentaci. Příkaz Get-CimInstance podporuje parametr ComputerName. Pokud ve výstupu bude uvedeno jako Location: common startup location, jde o cestu: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

Většina položek ovšem povede do registrů. Pro práci s registry se nám budou hodit následující příkazy:

  • Get-ItemProperty -Path <doplň>
  • Remove-ItemProperty -Path <doplň> -Name <doplň>

Pokud naopak budeme chtít něco do autoranu přidat, např. Outlook, tak do registrového klíče doplníme záznam příkazem: New-ItemProperty -Path <doplň> -Name <doplň> -PropertyType <doplň> -Value <doplň>

Back to Top