9Sep

Ako používať dávkový súbor, aby sa skripty PowerShell ľahšie spustili

Z viacerých dôvodov väčšinou skript PowerShell súvisiaci s bezpečnosťou nie je tak ľahko prenosný a použiteľný ako dávkové skripty. Môžeme však spojiť dávkový skript s našimi PowerShell skriptami, aby sme 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?

Ak nie je cieľový systém vopred nakonfigurovaný 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 urobíte s problémami.

  1. 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 odosielania 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 zmeniť toto správanie, ale pravdepodobne nie je to niečo, čo chcete robiť na každom počítači, s ktorým máte svoje skripty, a to najmä v prípade, že niektoré z týchto počítačov nie sú vaše vlastné.
  2. 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 štandardne neumožňuje vykonanie skriptov vôbec. Ukázali sme vás, 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.
  3. Niektoré skripty PowerShell nebudú fungovať bez oprávnení správcu.
    Dokonca beží 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 stále pekné, keď môžeme s ňou trochu ľahšie zvládnuť.
  4. Niektorí používatelia môžu mať prispôsobené prostredia PowerShell.
    Pravdepodobne to nebudete často spúšťať, ale ak to urobíte, môže to skomplikovať spustenie a riešenie problémov s vašimi skriptami. Našťastie sa môžeme dostať okolo toho bez toho, aby sme urobili trvalé zmeny.

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 tak urobiť súbor. BAT.Takže napíšeme dávkový súbor, aby sme zavolali skriptu PowerShell z príkazového riadku pre nás.

Preto nemáme prepisovať 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 pre skript PowerShell. Ak chcete, aby to fungovalo, dávkový súbor bude 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 ubezpečiť sa, že je v rovnakom priečinku. Potom vložte tieto riadky do dávkového skriptu:

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

Ak to nebolo pre iné bezpečnostné obmedzenia na mieste, to by bolo naozaj všetkoje potrebné spustiť skript PowerShell z dávkového súboru. V skutočnosti je prvý a posledný riadok prevažne len záležitosťou preferencie - je to druhá linka, ktorá naozaj robí prácu. Tu je rozpis:

@ECHO OFF vypne príkaz echoing. To len ponechá ostatné príkazy zobrazené na obrazovke pri spustení dávkového súboru. 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 môže byť samozrejme volaný z akéhokoľvek CMD okna alebo dávkového súboru na spustenie PowerShell na holú konzolu ako obvykle. Môžete ho tiež použiť 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 táto metóda používa na zacielenie nášho súboru. PS1, je so špeciálnou premennou% ~ dpn0.Spustite z dávkového súboru,% ~ 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

práve 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 zrejmejšou.

Takže je nastavený základný dávkový súbor. Na demonštračné účely je tento súbor uložený ako "D: \ Script Lab \ MyScript.bat" a v rovnakom priečinku je "MyScript.ps1".Pozrime sa, čo sa stane, keď dvakrát klikneme na MyScript.bat.

Skutočne skript PowerShell nebol spustený, ale to sa dá očakávať - ​​napokon sme sa zaoberali prvým z našich štyroch problémov. Existujú však niektoré dôležité bity demonštrované tu:

  1. Názov okna ukazuje, že dávkový skript úspešne spustil PowerShell.
  2. Prvý riadok výstupu ukazuje, že sa používa vlastný profil PowerShell. Toto je potenciálny problém č. 4, uvedený vyššie.
  3. Chybové hlásenie preukazuje obmedzenia ExecutionPolicy. To je náš problém č. 2.
  4. 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 zamýšľaný 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 prispôsobiť svoj vlastný profil PowerShell tak, aby ste tak urobili, ak chcete otestovať tieto skripty sami. Jednoducho pridajte nasledujúci riadok do profilového skriptu:

Write-Output 'Vlastný profil PowerShell účinný!'

Implementačná politika v testovacom systéme je nastavená na RemoteSigned. Umožňuje to vykonanie skriptov vytvorených lokálne( napríklad 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 MyScript.ps1 ako z externého zdroja:

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

Nastaví alternatívny dátový tok Zone. Identifier na MyScript.ps1 tak, aby si systém Windows myslel, že súbor pochádza z Internetu. Môže sa ľahko obrátiť pomocou nasledujúceho príkazu:

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

Krok 2: Získanie ExecutionPolicy.

Získanie nastavenia ExecutionPolicy, z CMD alebo dávkového skriptu, je vlastne celkom jednoduché.Jednoducho upravíme druhý riadok skriptu, aby sme do príkazu PowerShell.exe pridali ešte jeden parameter.

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 pretrvávať ani po tomto zasadnutí, takže môžeme takúto PowerShell bežať, kedykoľvek 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ď bol skript správne vykonaný, 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 prekážkou. Hoci podrobnosti o tom, ako skript kontroluje prístup administrátora, presahuje 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(){ IsNRole( [Security. Principal. WindowsBuiltInRole] "Administrator")){ Write-Output 'Spustenie ako administrátor!'} Else{ Write-Output 'Running Limited!'} Pozastaviť

Tiež si všimnete, Operácie "Pozastaviť" 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 správcu.

Ak váš skript nespúšťa žiadne príkazy, ktoré vyžadujú eleváciu a ste si celkom istí, že sa nebudete musieť starať o to, aby sa niekto iný profil dostal do cesty, môžete vynechať zvyšok tohto. Ak však používate niektoré rutiny správcu na úrovni administrátora, budete potrebovať tento kúsok.

Bohužiaľ, nie je žiadny spôsob, ako spustiť UAC pre výšku z dávkového súboru alebo CMD relácie. Napriek tomu PowerShell nám to umožňuje s procesom Start-Process. 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 ešte nie je zvýšená, vyvolá to výzvu UAC.Ak chcete použiť tento súbor z dávkového súboru na spúšťanie nášho skriptu, skončíme tým, že vytvoríme tri PowerShell procesy - jeden na spustenie štartovacieho procesu a druhý spustený procesom Start-Process na spustenie skriptu. Druhý riadok dávkového súboru je potrebné zmeniť na nasledovné:

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

Keď sa spustí dávkový súbor, prvý riadok výstupu, ktorý uvidíme, je z skriptu profilu PowerShell. Následne sa zobrazí výzva nástroja UAC pri pokuse o spustenie programu MyScript.ps1.

Po kliknutí na výzvu UAC sa vytvorí nová inštancia PowerShell. Pretože ide o novú inštanciu, samozrejme sa znova zobrazí upozornenie profilového skriptu. Potom sa spustí program MyScript.ps1 a uvidíme, že sme skutočne na zvýšenej relácii.

A tu máme tu aj dve prestávky. Ak nie je ten, ktorý sa nachádza v skripte PowerShell, nikdy by sme skript nevidel - výstupné okno PowerShell sa objaví a zmizne hneď po spustení skriptu. A bez pauzy v dávkovom súbore by sme neboli schopní zistiť, či boli nejaké chyby spustené PowerShellom na prvom mieste.

Krok 4: Získanie vlastných profilov PowerShell.

Poďme sa zbaviť toho ohavného vlastného profilu, teraz? Tu je to takmer nepríjemné, ale ak uží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 mohli urobiť, je potrebné ešte raz zmeniť druhú riadku dávkového súboru:

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

Pridanie parametra -NoProfile na oba inštancie PowerShell spustené skriptom znamená, že užívateľský skript profilu bude úplne vynechaný v oboch krokoch a náš PowerShell skript sa spustípomerne predvídateľné predvolené prostredie. Tu môžete vidieť, že v žiadnom z plôch, ktoré sa plodili, nie je žiadne upozornenie na vlastné profily.

Ak v 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 bude potom vyzerať nasledovne:

( Samozrejme pre skripty bez administrátora by ste mohli urobiť bez pauzy v skripte PowerShellv tomto okamihu, pretože všetko je zachytené v rovnakom okne konzoly a tam by sa tu udržiavalo pauza na konci dávkového súboru.)

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.

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 "&{Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""% ~ dpn0.ps1 ""' -Verb RunAs} "PAUSE

Pamätajte, že dávkový súbor umiestnite do rovnakého priečinka ako skript PowerShell, ktorý chcetepoužívať ho a dať 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 sa museli obťažovať všetkými bezpečnostnými nastaveniami systému. Tieto zmeny môžete určite vykonať manuálne zakaždým, ale to vám ušetrí problémy a nebudete sa musieť starať o neskoršie zmeny.

Odkazy:

  • Spúšťanie skriptov PowerShell z dávkového súboru - programovací blog programu Daniel Schroeder
  • Kontrola oprávnení administrátora v PowerShell - Hej, skriptovací Guy! Blog