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ň>

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

Validace a oprava systémových souborů offline

Dostat se do situace, že počítač nestartuje a je potřeba systém opravit pomocí WinRE nebo instalačního média zase není nic vzácného. Opravu spouštěcích souborů už Microsoft předpřipravil jako jedno kliknutí, byť stále ji můžeme provést pomocí příkazové řádky, ale stavy jako je nestartující systém po BSOD z důvodu selhání NTFS.sys neřeší a určitě i v dalších scénářích nemusí postačovat.

Možnosti kontroly jako je chkdsk nebo diskpart nejsou nikomu cizí, ale jak zkontrolovat systémové soubory offline kopie Windows, nebo offline odebrat problémový ovladač, je předmětem tohoto článku. Pro kontrolu a opravu systémových souborů slouží 2 nástroje, SFC a DISM. SFC(system file chacker) je nástroj přímo určený na kontrolu systémových souborů, a pokud chci kontrolovat a opravit offline kopii systému, zapisuji příkaz takto:

sfc /scannow /offbootdir=c:\ /offwindir=c:\windows

Písmenu systémového disku offline kopie Windows, víše C, si zjistím pomocí nástroje diskpart příkazem list volume. Další systémové komponenty je potřeba kontrolovat pomocí DISM, kdy analýzu provedeme příkazem:

Dism /Image:C:\ /Cleanup-Image /scanhealth

Následnou opravu pak:

Dism /Image:C:\ /Cleanup-Image /RestoreHealth

Písmeno disku, víše C, opět pochází z výsledku diskpartu.

Pokud je příčinou pádu systému ovladač (a není to zrovna ntfs.sys, či jiný od MS, ty opraví příkazy výše), tak je možné jej offline odebrat, následně spustit systém a danému zařízení nainstalovat ovladač nový. K zobrazení přesného názvu ovladače využijeme příkaz:

Dism /Image:C:\ /Get-Drivers /format:table

Po nalezení odpovídajícího ovladače jej odebereme pomocí příkazu:

Dism /Image:C:\ /Remove-Driver /Driver:OEM1.inf

V příkladu výše pak OEM.inf je název problémového ovladače, který jsme si našli v tabulce z předešlého příkazu.

Poslední, co se nechá se systémem, krom modifikace registrů a souborů, dělat, je vrácení změn rolí a funkcí, případně aktualizací. Na odebrání posledních aktualizací MS opět nabízí GUI, ale to neřeší případ, že k pádu OS dojde při spouštění v rámci aktualizačního restartu. Stejně tak přidávání či odebírání komponent (jako např. Hyper-V). V těchto případech se pak pomocí DISM vrátí čekající změny příkazem:

DISM /image:C:\ /cleanup-image /revertpendingactions
Back to Top