Ako používať dávkový súbor na ľahšie spustenie skriptov PowerShell
Z viacerých dôvodov väčšinou skript PowerShell súvisiaci s bezpečnosťou nie je ľahko prenosný a použiteľný ako dávkové skripty. Môžeme však spojiť dávkový skript s našimi skriptami PowerShell, aby ste mohli vyriešiť tieto problémy. Tu vám ukážeme niektoré z týchto problémových oblastí a ako vytvoriť dávkový skript, ktorý ich obklopíte.
Prečo nemôžem skopírovať súbor .PS1 do iného počítača a spustiť ho?
Pokiaľ nie je cieľový systém predkonfigurovaný tak, aby umožňoval spustenie ľubovoľných skriptov s požadovanými oprávneniami a použitím správnych nastavení, je pravdepodobné, že sa pri pokuse vykonať nejaké problémy.
- Funkcia PowerShell nie je predvolene priradená k rozšíreniu súboru .PS1.
Prvýkrát sme to priviedli do série PowerShell Geek School. Systém Windows priraďuje do programu Poznámkový blok predvolené súbory .PS1 namiesto ich odoslania do interpretátora príkazov PowerShell. To má zabrániť náhodnému spusteniu škodlivých skriptov jednoduchým dvojitým kliknutím. Existujú spôsoby, ako môžete toto správanie zmeniť, ale pravdepodobne to nie je niečo, čo chcete robiť na každom počítači, do ktorého ste so svojimi skriptmi pripojený - najmä ak niektoré z týchto počítačov nie sú vaše vlastné. - PowerShell neumožňuje predvolené spustenie externých skriptov.
Nastavenie ExecutionPolicy v PowerShell zabraňuje vo všetkých verziách systému Windows štandardne vykonávať externé skripty. V niektorých verziách systému Windows predvolená hodnota vôbec neumožňuje vykonanie skriptov. Ukázali sme, ako zmeniť toto nastavenie v časti Ako povoliť vykonávanie skriptov PowerShell v systéme Windows 7. Je to však aj niečo, čo nechcete robiť na žiadnom počítači. - Niektoré skripty PowerShell nebudú fungovať bez oprávnení správcu.
Dokonca aj s účtom na úrovni administrátora, stále musíte prejsť kontrolou používateľských kont (UAC), aby ste vykonali určité činnosti. Nechceme to zakázať, ale je to pekné, keď to môžeme urobiť trochu jednoduchšie. - Niektorí používatelia môžu mať prispôsobené prostredia PowerShell.
Pravdepodobne to nebudete spúšťať často, ale keď to urobíte, môže to skomplikovať spustenie a riešenie problémov s vašimi skriptami. Našťastie sa to môžeme obísť aj bez trvalých zmien.
Krok 1: Dvakrát kliknite na spustenie.
Začnime tým, že sa zaoberáme prvým problémom - združenia súborov .PS1. Nemôžete dvakrát kliknúť na spustenie súborov .PS1, ale môžete spustiť súbor .BAT týmto spôsobom. Takže napíšeme dávkový súbor, aby sme zavolali skriptu PowerShell z príkazového riadku pre nás.
Takže nemusíte prečítať dávkový súbor pre každý skript, alebo zakaždým, keď presunieme skript okolo, použije premennú s vlastným odkazom na vytvorenie cesty súboru pre skript PowerShell. Ak chcete, aby to fungovalo, bude dávkový súbor musieť byť umiestnený do rovnakej zložky ako skript PowerShell a mať rovnaký názov súboru. Ak sa váš skript PowerShell nazýva "MyScript.ps1", budete chcieť pomenovať dávkový súbor "MyScript.bat" a uistiť sa, že je v rovnakom priečinku. Potom vložte tieto riadky do dávkového skriptu:
@ECHO OFF PowerShell.exe -Command "&"% ~ dpn0.ps1 '"PAUSE
Ak by to nebolo pre ostatné bezpečnostné obmedzenia na mieste, to by bolo naozaj všetko, čo potrebujete na spustenie PowerShell skript z dávkového súboru. V skutočnosti je prvý a posledný riadok prevažne len otázkou preferencie - je to druhá linka, ktorá v skutočnosti robí prácu. Tu je rozpis:
@ OFF OFF vypne odpoveď príkazu. To len ponechá ostatné príkazy zobrazené na obrazovke pri bežiacom súbore. Tento riadok je sám skrytý použitím symbolu na (@) pred ním.
PowerShell.exe -Command "&"% ~ dpn0.ps1 "" skutočne spúšťa skript PowerShell. PowerShell.exe je samozrejme možné zavolať z akéhokoľvek CMD okna alebo dávkového súboru na spustenie PowerShell na holú konzolu ako obvykle. Môžete ho použiť aj na spustenie príkazov priamo z dávkového súboru, zahrnutím parametra -Command a príslušných argumentov. Spôsob, akým sa toto používa na zacielenie nášho súboru .PS1, je so špeciálnou premennou% ~ dpn0. Spustí sa dávkový súbor,% ~ dpn0 sa vyhodnotí na písmeno jednotky, cestu k priečinku a názov súboru (bez rozšírenia) dávkového súboru. Keďže dávkový súbor a skript PowerShell budú v rovnakom priečinku a budú mať rovnaké meno,% ~ dpn0.ps1 sa preloží na cestu k súboru celého skriptu PowerShell.
PAUZA jednoducho pozastaví vykonávanie dávky a čaká na vstup používateľa. Toto je všeobecne užitočné mať na konci dávkových súborov, takže máte možnosť skontrolovať ľubovoľný výstup príkazu skôr, než zmizne okno. Keď prechádzame testovaním každého kroku, užitočnosť tohto postupu sa stane čoraz jasnejšou.
Takže základný dávkový súbor je nastavený. Na demonštračné účely sa tento súbor uloží ako "D: \ Script Lab \ MyScript.bat" a v rovnakej zložke je "MyScript.ps1". Pozrime sa, čo sa stane, keď dvakrát klikneme na MyScript.bat.
Je zrejmé, že PowerShell skript nebol spustený, ale to sa dá očakávať - napokon sme sa venovali iba prvému z našich štyroch problémov. Existujú však niektoré dôležité bity ukázané tu:
- Názov okna ukazuje, že dávkový skript úspešne spustil PowerShell.
- Prvý riadok výstupu ukazuje, že sa používa vlastný profil PowerShell. Toto je potenciálny problém č. 4, uvedený vyššie.
- Chybové hlásenie preukazuje obmedzenia ExecutionPolicy. To je náš problém č. 2.
- Podčiarknutá časť chybového hlásenia (ktorá sa robí natívne pomocou výstupu chyby PowerShell) ukazuje, že dávkový skript správne zacielil plánovaný skript PowerShell (D: \ Script Lab \ MyScript.ps1). Takže aspoň vieme, že veľa funguje správne.
Profil je v tomto prípade jednoduchý jednorazový skript používaný na túto demonštráciu na generovanie výstupu vždy, keď je profil aktívny. Môžete si tiež prispôsobiť svoj vlastný profil PowerShell, ak chcete otestovať tieto skripty sami. Jednoducho pridajte nasledujúci riadok do svojho profilového skriptu:
Write-Output 'Vlastný profil PowerShell účinný!'
Implementačná politika na testovacom systéme je nastavená na RemoteSigned. Umožňuje to vykonanie skriptov vytvorených lokálne (podobne ako profilový skript), zatiaľ čo blokujú skripty z vonkajších zdrojov, pokiaľ nie sú podpísané dôveryhodným orgánom. Na demonštračné účely bol použitý nasledujúci príkaz na označenie jazyka MyScript.ps1 ako z externého zdroja:
Add-Content-cesta "D: \ Script Lab \ MyScript.ps1" -Value "[ZoneTransfer] 'nZoneId = 3" -Stream' Zone.Identifier '
To nastavuje alternatívny dátový tok Zone.Identifier na MyScript.ps1, aby systém Windows mohol myslieť, že súbor pochádza z Internetu. Môže sa ľahko obrátiť pomocou nasledujúceho príkazu:
Clear-Content-cesta "D: \ Script Lab \ MyScript.ps1 '-Stream' Zone.Identifier '
Krok 2: Začíname s vykonávacou politikou.
Získanie nastavenia ExecutionPolicy, z CMD alebo dávkového skriptu, je vlastne celkom jednoduché. Jednoducho upravíme druhý riadok skriptu, aby sme pridali ešte jeden parameter do príkazu PowerShell.exe.
PowerShell.exe -ExecutionPolicy Bypass -Command "&"% ~ dpn0.ps1 ""
Parameter -ExecutionPolicy môže byť použitý na úpravu ExecutionPolicy, ktorá sa používa pri spustení novej relácie PowerShell. To nebude trvať dlhšie ako toto zasadnutie, takže môžeme takúto PowerShell spustiť vždy, keď budeme potrebovať bez oslabenia všeobecnej bezpečnostnej pozície systému. Teraz, keď sme to vyriešili, poďme si to ešte raz:
Teraz, keď skript správne vykonal, môžeme vidieť, čo vlastne robí. Dovoľuje nám vedieť, že spúšťame skript ako obmedzený používateľ. Skript je v skutočnosti spustený účtom s oprávneniami správcu, ale kontrola používateľských účtov sa stáva preč. Aj keď podrobnosti o tom, ako skript kontroluje prístup administrátora, presahujú rámec tohto článku, tu je kód, ktorý sa používa na demonštráciu:
ak (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()) IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) Write-Output 'Spustenie ako správca! Write-Output 'Running Limited!' Pozastaviť
Tiež si všimnete, že teraz existujú dve operácie "Pauza" vo výstupu skriptu - jeden z skriptu PowerShell a jeden z dávkového súboru. Dôvod pre to bude zrejmejší v ďalšom kroku.
Krok 3: Získanie prístupu pre správcu.
Ak váš skript nespúšťa žiadne príkazy, ktoré vyžadujú nadmorskú výšku, a ste si celkom istí, že sa nebudete musieť obávať, že sa vám niekto môže dostať do vlastných profilov, môžete zvyšok vynechať. Ak používate niektoré rutiny správcu na úrovni, budete potrebovať tento kúsok.
Bohužiaľ, nie je žiadny spôsob, ako spustiť UAC pre nadmorskú výšku z dávkového súboru alebo CMD relácie. Funkcia PowerShell však umožňuje, aby sme to urobili so štartovacím procesom. Pri použití s argumentmi "-Verb RunAs" vo svojich argumentoch sa program Start-Process pokúsi spustiť aplikáciu s oprávneniami správcu. Ak relácia PowerShell nie je už zvýšená, vyvolá to výzvu nástroja UAC. Ak chcete použiť tento súbor z dávkového súboru na spustenie nášho skriptu, skončíme tým, že vytvoríme dva procesy PowerShell - jeden na spustenie štartovacieho procesu a druhý, spustený štartom procesu, aby ste skript spustili. Druhý riadok dávkového súboru je potrebné zmeniť na toto:
PowerShell.exe -Command "& Štart-proces PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -Súbor" "% ~ dpn0.ps1" "' -Verb RunAs"
Pri spustení dávkového súboru sa zobrazí prvý riadok výstupu z skriptu profilu PowerShell. Potom sa zobrazí výzva nástroja UAC pri pokuse o spustenie programu MyScript.ps1.
Po kliknutí na výzvu UAC sa vytvorí nová verzia PowerShell. Pretože ide o novú inštanciu, samozrejme sa znova zobrazí upozornenie na profilový skript. Potom sa spustí MyScript.ps1 a vidíme, že sme skutočne vo zvýšenej relácii.
A tu je dôvod, prečo tu máme dve prestávky. Ak nie je ten, ktorý sa nachádza v skripte PowerShell, nikdy by sme skript neukázali výstup - okno PowerShell by sa objavilo a zmizlo akonáhle bude skript hotový. A bez pauzy v dávkovom súbore by sme neboli schopní zistiť, či sa na prvom mieste vyskytli nejaké chyby spustiť PowerShell.
Krok 4: Získanie vlastných profilov PowerShell.
Poďme sa zbaviť toho ohavného prispôsobeného profilu, teraz? Tu je to takmer nepríjemné, ale ak používateľský profil PowerShell zmení predvolené nastavenia, premenné alebo funkcie takým spôsobom, aký ste si skript neočakávali, môžu to byť naozaj nepríjemné. Je to oveľa jednoduchšie spustiť skript bez profilu úplne, takže sa nemusíte obávať. Aby sme to urobili, musíme ešte raz zmeniť druhý riadok dávkového súboru:
PowerShell.exe -NoProfile -Command "& Štart-proces PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verb RunAs"
Pridanie parametra -NoProfile na oba inštancie PowerShell spustené skriptom znamená, že skript profilu používateľa bude úplne vynechaný v oboch krokoch a náš skript PowerShell bude spustený v pomerne predvídateľnom predvolenom prostredí. Tu sa môžete dozvedieť, že v žiadnom z plôch, ktoré sa plodili, nie je žiadne upozornenie vlastného profilu.
Ak vo svojom skripte PowerShell nepotrebujete práva správcu a vy ste vynechali krok 3, môžete to urobiť bez druhej inštancie PowerShell a druhý riadok dávkového súboru by mal vyzerať takto:
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "&"% ~ dpn0.ps1 ""
Výstup potom bude vyzerať takto:
(Samozrejme, pre skripty bez administrátora by ste mohli urobiť aj bez pauzy na konci skriptu vo vašom skripte PowerShell, pretože všetko je zachytené v rovnakom okne konzoly a bude sa tam konať pauzou na konci dávkový súbor.)
Dokončené dávkové súbory.
V závislosti od toho, či potrebujete administrátorské oprávnenia pre váš skript PowerShell (a naozaj by ste ich nemali žiadať, ak nemáte), posledný dávkový súbor by mal vyzerať ako jeden z dvoch nižšie uvedených.
Bez prístupu správcu:
@ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "&"% ~ dpn0.ps1 '"PAUSE
S prístupom správcu:
@ECHO OFF PowerShell.exe -NoProfile -Command "& Štart-proces PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -Súbor" "% ~ dpn0.ps1" "-Verb RunAs" PAUSE
Nezabudnite vložiť dávkový súbor do rovnakého priečinka ako skript PowerShell, pre ktorý ho chcete použiť, a dajte mu rovnaký názov. Potom, bez ohľadu na to, aký systém privediete do týchto súborov, budete môcť spustiť váš skript PowerShell bez toho, aby ste museli posúvať s niektorým bezpečnostným nastavením v systéme. Tieto zmeny môžete určite vykonať manuálne zakaždým, ale to vám ušetrí problémy a nebudete sa musieť obávať, že zmeny sa vrátia neskôr.
Referencie:
- Spúšťanie skriptov PowerShell z dávkového súboru - programovací blog Daniel Schroeder
- Kontrola oprávnení administrátora v systéme PowerShell - Hej, skriptovací chlap! Blog