9Sep

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

click fraud protection

Z několika důvodů většina skriptů PowerShell souvisejících s bezpečností není 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ší sérii 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ě to není 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í.
    instagram viewer
  2. PowerShell ve výchozím nastavení neumožňuje provádění externího skriptu.
    Nastavení ExecutionPolicy v PowerShell zabraňuje ve výchozím nastavení ve všech verzích systému Windows 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 žádném počítači.
  3. Některé skripty PowerShell nebudou pracovat bez oprávnění správce.
    Dokonce běžící s účtem na úrovni správce, 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 spouštět často, ale když to uděláte, může být skriptování a odstraňování problémů trochu frustrující.Naštěstí se můžeme 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 - asociací 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íte znovu psát 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 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. Potom vložte tyto řádky do dávkového skriptu:

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

Pokud by nebylo pro ostatní bezpečnostní omezení platné, bylo by to opravdu všechnoto vyžaduje 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:

@ECHO OFF vypne příkaz echoing. To pouze udržuje další příkazy, aby se zobrazovaly 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 lze samozřejmě volat z libovolného okna CMD nebo dávkového souboru a spustit PowerShell na holou konzolu jako obvykle. Můžete jej také použít k spuš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.Spustit z dávkového souboru,% ~ dpn0 se vyhodnotí na písmeno jednotky, cestu ke složce a název souboru( bez přípony) dávkového souboru. Vzhledem k tomu, že dávkový soubor a skript PowerShell budou ve stejné složce a budou mít stejný název, bude aplikace% ~ dpn0.ps1 přeložen do cesty úplného souboru skriptu PowerShell.

PAUSE přeruší spuštění dávky a čeká na vstup uživatele. To je obecně užitečné mít na konci vašeho dávkového souboru, takže máte šanci přezkoušet jakýkoli výstup příkazu dříve, než zmizí okno. Když procházíme zkouškou každého kroku, učiní to zřejmě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ž poklepeme na MyScript.bat.

Skript PowerShell zřejmě nebyl spuštěn, ale očekává se to - řešili jsme pouze první z našich čtyř problémů.Některé důležité bity jsou však demonstrovány 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 demonstruje omezení ExecutionPolicy. To je náš problém č. 2.
  4. Podtržená část chybové zprávy( která se provádí nativně pomocí výstupu chyby 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 mnoho funguje správně.

Profil je v tomto případě 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 CustomShell!'

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

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

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

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

Krok 2: Získání ExecutionPolicy.

Získání nastavení ExecutionPolicy, z CMD nebo dávkového skriptu, je ve skutečnosti poměrně 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 této relaci, takže můžeme takhle PowerShell spustit, kdykoli potřebujeme, aniž bychom oslabili obecnou bezpečnostní pozici systému. Nyní, když jsme to opravili, pojďme jít dál:

Nyní, když skript řádně provedl, můžeme vidět, co vlastně 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, avšak uživatelský účet se dostává do cesty. Ačkoli podrobnosti o tom, jak skript kontroluje přístup správce, přesahuje rozsah tohoto článku, je zde kód, který se používá pro demonstraci:

pokud( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent(){ IsNRole( [Security. Principal. WindowsBuiltInRole] "Administrator")){ Write-Output 'Spuštěn jako správce!'} Else{ Write-Output 'Running Limited!'} Pozastavit

Také si všimnete, Operace "Pozastavit" 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 ve vašem skriptu nejsou spuštěny žádné příkazy, které vyžadují nadmořskou výšku, a jste si jistá, že nebudete muset dělat starosti o to, že někdo vlastní profily zabrání, můžete vynechat zbytek. 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 to dovoluje provést pomocí Start-Process. Při použití argumentů "-Verb RunAs" ve svých argumentech se program Start-Process pokusí spustit aplikaci s oprávněními správce. Pokud relace PowerShell není již zvýšená, spustí se výzva UAC.Použijeme-li to z dávkového souboru pro spuštění našeho skriptu, skončíme s tvořením dvou procesů PowerShell - jedním pro spuštění Start-Process a druhým spustením Start-Process pro spuštění skriptu. Druhý řádek dávkového souboru musí být změněn na toto:

PowerShell.exe -Command "&{ Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -Soubor" "% ~ dpn0.ps1" "' -VerbRunAs} "

Při spuštění dávkového souboru bude první řádek výstupu vidět 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í upozornění na profilový skript. Pak běží MyScript.ps1 a vidíme, že jsme skutečně ve zvýšené relaci.

A je tu také důvod, proč máme zde i dvě pauzy. Pokud tomu tak není v 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 chyby, které by spustily PowerShell.

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

Zbavme se toho ohavného vlastního profilu, teď?Tady je to 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ávali ve vašem 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. Chcete-li to provést, stačí ještě jednou změnit druhou řádku dávkového souboru:

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

Přidání parametru -NoProfile na oba instance PowerShell, které jsou spuštěny skriptem, znamená, že uživatelský profilový skript bude zcela vynechán v obou krocích a náš skript PowerShell bude spuštěnpoměrně předvídatelné, výchozí prostředí.Zde můžete vidět, že v žádné z plodů neobsahuje žádný vlastní profil.

Pokud v skriptu PowerShell nepotřebujete práva správce a vy jste vynechali krok 3, můžete to provést 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 následovně:

( Samozřejmě pro skripty, které nejsou správcem, můžete udělat bez pauzy v skriptu PowerShelli v tomto okamžiku, protože vše je zachyceno ve stejném okně konzoly a bude se tam držet pozastavením na konci dávkového souboru.)

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 správce:

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

S administrátorským přístupem:

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

Nezapomeňte dát dávkový soubor do stejné složky jako skript PowerShell, který chcetepoužívat ji a dáte jej stejný název. Poté, bez ohledu na to, do jakého systému budete tyto soubory přijímat, 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.

Odkazy:

  • Spouštění skriptů PowerShell z dávkového souboru - programovací blog programu Daniel Schroeder
  • Kontrola oprávnění správce v PowerShell - Hej, skriptování Guy! Blog