cs.phhsnews.com


cs.phhsnews.com / 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 skript PowerShell, který se týká zabezpečení, 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 budeme ukázat některé z těchto problémových oblastí a vytvářet dávkový skript, který je obklopuje.

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

Pokud není cílový systém předem nakonfigurová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ě narazíte na některé problémy při pokusu o to.

  1. PowerShell je není ve výchozím nastavení přidružen k příponu souboru .PS1 Nejprve jsme se dostali do naší série 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 chcete dělat na každém počítači, ve kterém máte své skripty, zejména pokud některé z těchto počítačů nejsou vaše vlastní.
  2. PowerShell neumožňuje externí spuštění skriptu ve výchozím nastavení 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 libovolném počítači.
  3. Některé skripty PowerShell nebudou pracovat bez Oprávnění administrátora. I při spouštění účtu s administrátorskou úrovní je nutné provést určité akce pomocí Řízení uživatelských účtů (UAC). Nechceme to zakázat, ale je to stále pěkné, když to můžeme udělat 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 způsobit spuštění a odstraňování problémů se skripty trochu frustrující. Naštěstí se to můžeme obejít bez trvalých změn.

Krok 1: Poklepejte na spuštění

Začněme řešením prvního problému - 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, který nám zavolá skript 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 a 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. Pak vložte tyto řádky do dávkového skriptu:

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

Pokud by nebyly platné ostatní bezpečnostní omezení, opravdu stačí spustit skript 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 rozdělení:

@CHO OFF vypne příkaz echoing. To pouze udržuje ostatní 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 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, aplikace% ~ dpn0.ps1 bude převedena na cestu k úplnému souboru skriptu PowerShell.

PAUSE právě pozastaví provádě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. Během testování každého kroku bude užitečnější zřejmé.

Takže je nastaven základní dávkový soubor. 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.

Skript PowerShell se nečekal, ale to se dá očekávat - koneckonců jsme se zabývali pouze prvním z našich čtyř problémů. Existují zde však některé důkazy:

  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. Toto je potenciální problém č. 4.
  3. Chybová zpráva ukazuje omezení ExecutionPolicy. To je náš problém číslo 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 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 následující řádek do svého profilového skriptu:

Write-Output "Vlastní profil PowerShell účinně!"

ExecutionPolicy v testovacím systému je nastaven 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, který má označit MyScript.ps1 jako z externího zdroje:

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

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

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

Krok 2: Získání ExecutionPolicy. kolem nastavení ExecutionPolicy, z CMD nebo dávkového skriptu, je skutečně 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 může být použit 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 kontroluje. Ačkoli podrobnosti o tom, jak skript kontroluje přístup správce, jsou mimo rozsah tohoto článku, je zde kód, který se používá pro demonstraci:

pokud (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetInterface ()) IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) {Write-Output 'Spuštěn jako správce!'} Else {Write-Output 'Running Limited! že ve výstupu skriptu existují dvě operace "Pozastavit" - jednu ze skriptu PowerShell a jednu ze dávkového souboru. Důvod pro to bude více zřejmý v dalším kroku

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

Pokud váš skript nespustí žádné příkazy, které vyžadují elevaci a jste si jistý, že nebudete mít abyste se obávali, že se někdo dostane do cesty, můžete vynechat zbytek. Pokud však používáte některé cmdletníky na úrovni správce, 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" "' Verb RunAs} "

Když je dávkový soubor spuštěn, první řádek výstupu, který uvidíme, je z skriptu profilu PowerShell. Potom se po spuštění aplikace Start-Process pokusí spouštět MyScript.ps1 výzva 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. Potom běží MyScript.ps1 a vidíme, že jsme skutečně ve zvýšené relaci. A to je důvod, proč tu máme také 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 došlo k chybám spouštění PowerShellu.

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

Pojďme se zbavit toho hnusného oznámení vlastní profil nyní, my? 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 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 udělat, stačí změnit druhý řádek dávkového souboru ještě jednou:

PowerShell.exe -NoProfile -Command "& {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 fungovat v poměrně předvídatelném výchozím prostředí. Zde vidíte, že v žádné z plodů se nenachází žádný vlastní profil.

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 udělat bez pauzy na konci skriptu ve vašem 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), měl by vypadat poslední dávkový soubor jako je jeden z níže uvedených.

Bez přístupu správce:

@ECHO OFF PowerShell.exe -NoProfile -ExecutionPoli cy 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ého adresáře jako skript PowerShell, který jej chcete použít, a dejte mu stejný název . Poté, bez ohledu na to, do kterého systému tyto soubory přejdete, budete moci spustit váš 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ří potíže a nebudete se muset starat o to, abyste později změnili změny.

Odkazy:

Spouštění PowerShellových skriptů z dávkového souboru - programovací blog společnosti Daniel Schroeder

Kontrola oprávnění administrátora v PowerShell - Hej, skriptování Guy! Blog



Jak se dostat výstrahy obchodování jen o jakémkoli produktu se Slickdeals

Jak se dostat výstrahy obchodování jen o jakémkoli produktu se Slickdeals

Existuje tolik obchodů, které se objevují každý den, že to může být opravdu těžké držet krok se všemi z nich. Existuje však snadný způsob, jak sledovat pouze produkty, které vás zajímají, a přijímat upozornění v e-mailu, když určitá dohoda funguje. Můžete si objednat hrst adresářů z více obchodů, jen abyste mohli sledovat obchody, které vylepšují váš zájem, ale které mohou zmačknout vaše e-mailové schránky v srdci.

(how-to)

Když se poprvé začnete učit, jak se všechny doménové jména, adresy IP, webové servery a webové stránky hodí a pracují společně, může to být trochu matoucí

Když se poprvé začnete učit, jak se všechny doménové jména, adresy IP, webové servery a webové stránky hodí a pracují společně, může to být trochu matoucí

Nebo občas ohromující. Jak je vše nastaveno tak, aby fungovalo tak hladce? Dnešní příspěvek SuperUser Q & A obsahuje odpovědi na zvědavé čtenářské otázky. Současná otázka a odpověď se k nám dostala s laskavým svolením SuperUser - subdivize Stack Exchange, komunitně řízeného seskupení webových stránek Q & A.

(how-to)