Domovská » jak » Jak používat dávkový soubor pro snadnější spuštění skriptů PowerShell

    Jak používat dávkový soubor pro snadnější spuštění skriptů PowerShell

    Z několika důvodů většinou skripty PowerShell, které se týkají především zabezpečení, nejsou tak snadno přenosné a použitelné jako dávkové skripty. Můžeme však spojit dávkový skript s našimi skripty PowerShell, abychom tyto problémy vyřešili. Zde vám ukážeme některé z těchto problémových oblastí a sestavení dávkového skriptu.

    Proč nemohu jen kopírovat soubor .PS1 do jiného počítače a spustit jej?

    Pokud není cílový systém předkonfigurován tak, aby umožňoval spouštění libovolných skriptů s požadovanými oprávněními a pomocí správných nastavení, pravděpodobně dojde k problémům při pokusu o to.

    1. PowerShell není ve výchozím nastavení přidružen k příponu souboru .PS1.
      Přinesli jsme to zpočátku v naší seriálu PowerShell Geek School. Systém Windows přiřazuje soubory PS1 k programu Poznámkový blok ve výchozím nastavení namísto jejich odeslání do interpretačního příkazu PowerShell. To má zabránit náhodnému spuštění škodlivých skriptů jednoduchým dvojitým kliknutím na ně. Existují způsoby, jak toto chování změnit, ale pravděpodobně není to něco, co byste chtěli udělat na každém počítači, ve kterém jste skripty vedli - zejména pokud některé z těchto počítačů nejsou vaše vlastní.
    2. PowerShell ve výchozím nastavení nepovoluje provedení externího skriptu.
      Nastavení ExecutionPolicy v PowerShell zabraňuje ve všech verzích systému Windows ve výchozím nastavení provádět externí skripty. V některých verzích systému Windows výchozí v žádném případě neumožňuje provedení skriptu. Ukázali jsme, jak změnit toto nastavení v tématu Jak povolit spuštění skriptů PowerShell v systému Windows 7. Je to však také něco, co nechcete dělat na libovolném počítači.
    3. Některé skripty PowerShell nebudou pracovat bez oprávnění správce.
      I když běžíte s účtem na úrovni Administrator, stále musíte procházet Řízením uživatelských účtů (UAC), abyste mohli provádět určité akce. Nechceme to zakázat, ale je to pěkné, když se nám to daří trochu jednodušší.
    4. Někteří uživatelé mohou mít přizpůsobená prostředí PowerShell.
      Pravděpodobně to nebudete často spouštět, ale když to uděláte, může být skriptování a odstraňování problémů trochu frustrující. Naštěstí můžeme tuto situaci obejít, aniž by došlo k trvalým změnám.

    Krok 1: Poklepejte na spuštění.

    Začněme tím, že řešíme první problém - sdružení souborů .PS1. Nemůžete dvakrát kliknout na spuštění souborů .PS1, ale můžete spustit soubor .BAT tímto způsobem. Takže napíšeme dávkový soubor a zavoláme skriptu PowerShell z příkazového řádku.

    Takže nemusíme přepisovat dávkový soubor pro každý skript, nebo pokaždé, když přesučíme skript, použije proměnnou pro vlastní odkaz, která vytvoří cestu k souboru pro skript PowerShell. Chcete-li to provést, dávkový soubor bude muset být umístěn ve stejné složce jako skript PowerShell a mít stejný název souboru. Pokud se tedy váš skript PowerShell nazývá "MyScript.ps1", budete chtít pojmenovat dávkový soubor "MyScript.bat" a ujistěte se, že je ve stejné složce. Pak vložte tyto řádky do dávkového skriptu:

    @ECHO OFF PowerShell.exe -Command "&"% ~ dpn0.ps1 '"PAUSE

    Pokud by to nebylo pro ostatní bezpečnostní omezení na místě, to by bylo opravdu vše, co potřebujete ke spuštění skriptu PowerShell z dávkového souboru. První a poslední řádky jsou ve skutečnosti jen otázkou preference - je to druhá linka, která opravdu dělá práci. Zde je rozpis:

    @ OFF OFF vypne příkaz echoing. To jen udržuje vaše další příkazy zobrazené na obrazovce při spuštění dávkového souboru. Tento řádek je sám skrytý použitím symbolu @ (@) před ním.

    PowerShell.exe -Command "&"% ~ dpn0.ps1 "" ve skutečnosti spouští skript PowerShell. PowerShell.exe může být samozřejmě volán z jakéhokoliv okna CMD nebo dávkového souboru, aby mohl PowerShell spustit na holou konzolu jako obvykle. Můžete jej také použít pro spouštění příkazů přímo z dávkového souboru, včetně parametru -Command a příslušných argumentů. Způsob, jakým se používá k cílení na náš soubor .PS1, je se speciální proměnnou% ~ dpn0. Při spuštění ze dávkového souboru je hodnota% ~ dpn0 vyhodnocena písmenem jednotky, cestou složky a názvem souboru (bez přípony) dávkového souboru. Vzhledem k tomu, že dávkový soubor a skript PowerShell budou ve stejném adresáři a budou mít stejný název, bude aplikace% ~ dpn0.ps1 přeložen do cesty úplného souboru skriptu PowerShell.

    PAUZA stačí pozastavit provádění dávky a čeká na vstup uživatele. To je obecně užitečné mít na konci dávkových souborů, takže máte možnost zkontrolovat jakýkoli výstup příkazu dříve, než zmizí okno. Když procházíme zkouškou každého kroku, učiní to užitečnější.

    Takže základní dávkový soubor je nastaven. Pro demonstrační účely je tento soubor uložen jako "D: \ Script Lab \ MyScript.bat" a ve stejné složce je "MyScript.ps1". Uvidíme, co se stane, když dvakrát klikneme na MyScript.bat.

    Zřejmě skript PowerShell neběžel, ale to se dá očekávat - koneckonců jsme se zabývali pouze prvním z našich čtyř problémů. Některé důležité bity se však ukázaly zde:

    1. Název okna ukazuje, že dávkový skript úspěšně spustil PowerShell.
    2. První řádek výstupu ukazuje, že je používán vlastní profil PowerShell. To je potenciální problém č. 4, uvedený výše.
    3. Chybová zpráva ukazuje účinnost omezení ExecutionPolicy. To je náš problém číslo 2.
    4. Podtržená část chybové zprávy (která se provádí nativně pomocí výstupu chyb PowerShell) ukazuje, že dávkový skript správně směřoval na zamýšlený skript PowerShell (D: \ Script Lab \ MyScript.ps1). Takže alespoň víme, že to funguje správně.

    Profil, v tomto případě, je jednoduchý jednorázový skript používaný pro tuto ukázku pro generování výstupu vždy, když je profil aktivní. Můžete také přizpůsobit svůj vlastní profil PowerShell, pokud chcete otestovat tyto skripty sami. Jednoduše přidejte do svého profilového skriptu následující řádek:

    Write-Output 'Vlastní profil PowerShell ve skutečnosti!'

    Implementační polici v testovacím systému je nastavena na RemoteSigned. To umožňuje provádět lokálně vytvořené skripty (například profilový skript) a blokovat skripty z externích zdrojů, pokud nejsou podepsané důvěryhodným orgánem. Pro účely demonstrace byl použit následující příkaz k označení MyScript.ps1 jako z externího zdroje:

    Add-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3" -Stream' Zone.Identifier '

    To nastaví alternativní datový proud Zone.Identifier na MyScript.ps1 tak, aby si Windows myslel, že soubor pochází z Internetu. Může se snadno obrátit pomocí následujícího příkazu:

    Clear-Content-cesta "D: \ Script Lab \ MyScript.ps1 '-Stream' Zone.Identifier '

    Krok 2: Získání zásady ExecutionPolicy.

    Získání nastavení ExecutionPolicy, z CMD nebo dávkového skriptu, je ve skutečnosti velmi snadné. Jednoduše upravíme druhý řádek skriptu, abychom do příkazu PowerShell.exe přidali další parametr.

    PowerShell.exe -ExecutionPolicy Bypass -Command "&"% ~ dpn0.ps1 ""

    Parametr -ExecutionPolicy lze použít k úpravě ExecutionPolicy, která se používá při spuštění nové relace PowerShell. To nebude trvat i po tomto zasedání, takže můžeme takhle PowerShell spustit, kdykoli potřebujeme, aniž bychom oslabili obecnou bezpečnostní pozici systému. Teď, když jsme to opravili, pojďme jít dál:

    Nyní, když je skript správně spuštěn, můžeme vidět, co skutečně dělá. Dává nám vědět, že používáme tento skript jako omezený uživatel. Skript je ve skutečnosti spuštěn pomocí účtu s oprávněním správce, ale uživatelský účet kontroluje. Přestože podrobnosti o tom, jak skript kontroluje přístup správce, jsou mimo rozsah tohoto článku, je zde kód, který se používá k demonstraci:

    pokud (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()) IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) Write-Output Running as Administrator! Write-Output 'Running Limited!' Pozastavit

    Také si všimnete, že nyní existují dvě operace "Pauza" ve výstupu skriptu - jeden z skriptu PowerShell a jeden ze dávkového souboru. Důvod pro to bude zřejmý v dalším kroku.

    Krok 3: Získání přístupu administrátora.

    Pokud váš skript nespustí žádné příkazy vyžadující nadmořskou výšku a jste si jistý, že nebudete muset dělat starosti o to, že někdo vlastní profily dostanou cestu, můžete zbytek tohoto vynechat. Pokud používáte některé rutiny správce na úrovni, budete potřebovat tento kus.

    Bohužel neexistuje způsob, jak spustit UAC pro výšku z dávkového souboru nebo relace CMD. Ovšem PowerShell nám dovoluje, abychom to udělali pomocí procesu Start-Process. Při použití argumentů "-Verb RunAs" ve svých argumentech se program Start-Process pokusí spustit aplikaci s oprávněním správce. Pokud relace PowerShell není již zvýšená, vyvolá to výzva UAC. Použijeme-li to z dávkového souboru pro spuštění našeho skriptu, skončíme tím, že vytvoříme dva procesy PowerShell - jeden spustí proces Start-Process a druhý spustí Start-Process pro spuštění skriptu. Druhý řádek dávkového souboru je třeba změnit na toto:

    PowerShell.exe -Command "a Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -Soubor" "% ~ dpn0.ps1" "-Verb RunAs"

    Při spuštění dávkového souboru se zobrazí první řádek výstupu z skriptu profilu PowerShell. Potom se po spuštění aplikace Start-Process pokusí spustit program MyScript.ps1 příkaz UAC.

    Po kliknutí na výzvu UAC se objeví nová instance PowerShell. Vzhledem k tomu, že se jedná o novou instanci, samozřejmě se opět zobrazí oznámení o profilu skriptu. Pak běží MyScript.ps1 a vidíme, že jsme skutečně ve zvýšené relaci.

    A tam je také důvod, proč tu máme dvě pauzy. Pokud tomu tak není ve skriptu PowerShell, nikdy bychom neviděli výstup skriptu - okno PowerShell by se objevilo a zmizelo, jakmile je skript hotový. A bez pauzy v dávkovém souboru bychom nebyli schopni zjistit, zda se na prvním místě objevily nějaké chyby spouštějící PowerShell.

    Krok 4: Získání vlastních profilů PowerShell.

    Pojďme se zbavit toho ošklivého vlastního profilu, teď? Tady je sotva obtížné, ale pokud uživatelský profil PowerShell změní výchozí nastavení, proměnné nebo funkce způsobem, který pravděpodobně neočekáváte ve svém skriptu, mohou to být opravdu obtížné. Je to mnohem jednodušší spouštět svůj skript bez profilu úplně, takže se o to nemusíte bát. K tomu je třeba ještě jednou změnit druhý řádek dávkového souboru:

    PowerShell.exe -NoProfile -Command "a Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verb RunAs"

    Přidání parametru -NoProfile do obou instancí PowerShell spuštěných skriptem znamená, že uživatelský profilový skript bude zcela vynechán v obou krocích a náš skript PowerShell bude spouštěn v poměrně předvídatelném výchozím prostředí. Zde vidíte, že v žádné z plodů, které se plodily, není žádné oznámení o vlastním profilu.

    Pokud v skriptu PowerShell nepotřebujete práva správce a vy jste vynechali krok 3, můžete to udělat bez druhé instance PowerShell a druhý řádek dávkového souboru by měl vypadat takto:

    PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "&"% ~ dpn0.ps1 ""

    Výstup bude vypadat takto:

    (Samozřejmě, že pro skripty bez administrátorů byste mohli v této chvíli udělat i bez pauzy v skriptu PowerShell, protože vše je zachyceno ve stejném okně konzoly a bude se tam konat pauzou na konci dávkový soubor stejně.)

    Dokončené dávkové soubory.

    V závislosti na tom, zda potřebujete oprávnění administrátora pro váš skript PowerShell (a opravdu byste je neměli žádat, pokud nemáte), poslední dávkový soubor by měl vypadat jako jeden ze dvou níže uvedených.

    Bez přístupu administrátora:

    @ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "&"% ~ dpn0.ps1 '"PAUSE

    S administrátorským přístupem:

    @ECHO OFF PowerShell.exe -NoProfile -Command "a Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verb RunAs" PAUSE

    Nezapomeňte dát dávkový soubor ve stejném adresáři jako skript PowerShell, který jej chcete použít, a dejte mu stejný název. Poté, bez ohledu na to, do jakého systému tyto soubory převezmete, budete moci spustit skript PowerShell, aniž byste se museli vypořádat s některými bezpečnostními nastaveními systému. Tyto změny můžete určitě provést ručně pokaždé, ale to vám ušetří problémy a nebudete se muset starat o to, abyste změny později změnili.


    Reference:

    • Spouštění skriptů PowerShell z dávkového souboru - Programovací blog Daniel Schroeder
    • Kontrola oprávnění administrátora v PowerShell - Hej, skriptovací kluk! Blog