9Sep

Kako uporabljati paketno datoteko, da naredite PowerShell skripte lažje zagnati

Iz več razlogov, večinoma zaradi varnosti, skripte PowerShell niso tako enostavno prenosljive in uporabne, ker so lahko batch skripte. Vendar pa lahko z našimi skripti PowerShell združimo paketni skript, da bomo lahko odpravili te težave. Tukaj vam bomo pokazali nekaj teh težavnih področij in kako ustvariti paketno skripto, da bi jih dobili okoli.

Zakaj ne morem kopirati moje datoteke. PS1 v drug računalnik in zagnati?

Razen če je ciljni sistem že vnaprej nastavljen tako, da omogoča izvajanje samovoljnih skript, z zahtevanimi pravicami in z uporabo pravilnih nastavitev, imate verjetnost, da boste pri poskusu tega izvedli nekatere težave.

  1. PowerShell po privzetku ni povezan z razširitvijo. PS1.
    To smo prinesli sprva v seriji PowerShell Geek School. Windows povezuje datoteke. PS1 z računalnikom v beležnico, namesto da jih pošlje v ukazni tolmač PowerShell. To je preprečiti nenamerno izvedbo zlonamernih skriptov, tako da jih preprosto dvokliknete. Obstajajo načini, kako lahko spremenite to vedenje, vendar to verjetno ni nekaj, kar želite narediti na vsakem računalniku, na katerem imate svoje skripte, še posebej, če nekateri od teh računalnikov niso vaši.
  2. PowerShell ne dovoljuje zunanjega izvajanja skriptov privzeto.
    Nastavitev ExecutionPolicy v programu PowerShell preprečuje izvajanje zunanjih skriptov privzeto v vseh različicah sistema Windows. V nekaterih različicah sistema Windows privzeto ne dovoljuje izvajanja skriptov. Pokazali smo, kako spremenite to nastavitev v razdelku Kako dovoliti izvedbo PowerShell skriptov v operacijskem sistemu Windows 7. Vendar pa je to tudi nekaj, kar ne želite storiti na kateremkoli računalniku.
  3. Nekateri skripti PowerShell ne bodo delovali brez skrbniških dovoljenj.
    Tudi pri računu s skrbniškim nivojem se morate še vedno potruditi skozi nadzor uporabniških računov( UAC) za izvajanje določenih dejanj. Tega ne želimo onemogočiti, vendar je še vedno prijetno, če se z njo lahko malo lažje spopademo.
  4. Nekateri uporabniki imajo lahko prilagojena okolja PowerShell.
    Verjetno ne boste pogosto naleteli na to, toda ko boste to naredili, lahko vaše skripte zaženete in odpravite težave, ki so malo frustrirajoče. Na srečo lahko o tem obremenjujemo brez kakršnih koli trajnih sprememb.

1. korak: Dvokliknite za zagon.

Začnimo z obravnavanjem prve težave -. PS1 združevanja datotek. Za zagon datotek. PS1 ne morete dvokliknite, vendar lahko datoteko. BAT izvedete tako. Torej bomo napisali paketno datoteko, da pokličemo skripto PowerShell iz ukazne vrstice za nas.

Zato nam ni treba ponovno napisati batch datoteke za vsak skript ali vsakič, ko premaknemo scenarij okoli, bo uporabil spremenljivko za samorefekcijo, da bi zgradili pot do datoteke za scenarij PowerShell.Če želite to narediti, bo batch datoteka morala biti postavljena v isto mapo kot vaš PowerShell skript in imeti isto ime datoteke. Torej, če se vaš PowerShell skript imenuje »MyScript.ps1«, boste želeli poimenovati svojo paketno datoteko »MyScript.bat« in se prepričajte, da je v isti mapi. Nato postavite te vrstice v paketni scenarij:

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

Če ni bilo drugih varnostnih omejitev, bi to bilo respotrebuje za zagon skripta PowerShell iz batch datoteke. Dejansko je prva in zadnja vrstica v glavnem samo prednostna izbira - to je druga vrstica, ki dejansko opravlja delo. Tukaj je razčlenitev:

@ECHO OFF izklopi ukaz odziva. To preprosto ohranja vaše druge ukaze, da se prikažejo na zaslonu, ko se izvaja batch datoteka. Ta vrstica je sama skrita z uporabo simbola( @) pred njim.

PowerShell.exe -Command "&'% ~ Dpn0.ps1' " dejansko zažene PowerShell skript. PowerShell.exe se seveda lahko pokliče iz kateregakoli CMD okna ali batch datoteke, da zažene PowerShell na konzolo kot običajno. Uporabite ga lahko tudi za zaganjanje ukazov naravnost iz batch datoteke, tako da vključite parameter -Command in ustrezne argumente. Način, kako se to uporablja za ciljanje naše datoteke. PS1, je s posebno spremenljivko% dpn0.Zaženite s paketno datoteko,% ~ dpn0 oceni na črko pogona, pot mape in ime datoteke( brez razširitve) batch datoteke. Ker batch datoteka in PowerShell skripta sta v isti mapi in imata enako ime, bo% ~ dpn0.ps1 prevedel v celotno pot do datoteke v skripti PowerShell.

PAUSE samo zaustavi izvajanje serije in čaka na vnos uporabnika. To je na splošno koristno imeti na koncu vaših paketnih datotek, tako da boste imeli možnost pregledati vse ukazne ukaze, preden se okno izgine. Ko bomo preizkusili vsak korak, bo uporabnost tega postala bolj očitna.

Torej, osnovna batch datoteka je nastavljena. Za predstavitvene namene se ta datoteka shrani kot "D: \ Script Lab \ MyScript.bat" in v isti mapi je "MyScript.ps1".Poglejmo, kaj se zgodi, ko dvokliknite MyScript.bat.

Očitno se scenarij PowerShell ne zažene, vendar je to pričakovati - na prvi pogled smo obravnavali le prvo od štirih težav. Vendar pa obstaja nekaj pomembnih bitov, ki so prikazani tukaj:

  1. Naslov okna kaže, da je paketni paket uspešno zagnal PowerShell.
  2. Prva vrstica izhoda kaže, da je v uporabi uporabniški profil PowerShell. To je potencialni problem # 4, naveden zgoraj.
  3. Sporočilo o napaki prikazuje veljavne omejitve ExecutionPolicy. To je naš problem # 2.
  4. Podčrtani del sporočila o napaki( ki ga narekuje izhod iz napake PowerShell) prikazuje, da je paketni paket pravilno usmerjen v načrtovani PowerShell skript( D: \ Script Lab \ MyScript.ps1).Tako vsaj vemo, da veliko dela pravilno.

Profil je v tem primeru preprost enolični skript, ki se uporablja za to predstavitev, da generira izhod, kadar je aktiven profil. Lahko tudi prilagodite lasten profil PowerShell, če želite sami preskusiti te skripte. Preprosto dodajte naslednjo vrstico v svoj profil:

Write-Output 'Custom PowerShell profil je v veljavi!'

ExecutionPolicy v preskusnem sistemu je nastavljen na RemoteSigned. To omogoča izvajanje skriptov, ustvarjenih na lokalni ravni( na primer skripta profila), medtem ko blokira skripte iz zunanjih virov, razen če jih podpiše zaupanja vreden organ. Za predstavitvene namene je bil uporabljen naslednji ukaz, da zastavite MyScript.ps1 kot iz zunanjega vira:

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

To določa, da Zone. Identifier alternativni tok podatkov na MyScript.ps1, da bo Windows mislil, da je datoteka prišla iz interneta. To je mogoče enostavno obrniti z naslednjim ukazom:

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

2. korak: Približevanje ExecutionPolicy.

Pridobivanje okoli nastavitve ExecutionPolicy, iz CMD ali serijskega skripta, je pravzaprav zelo enostavno. Samo drugo vrstico skripta spremenimo, da dodamo še en parameter v ukaz PowerShell.exe.

PowerShell.exe -IzvršitevPolicy Bypass -Command "&"% ~ dpn0.ps1 ""

Parameter -ExecutionPolicy lahko uporabite za spreminjanje ExecutionPolicy, ki se uporablja, ko se sproži nova seja PowerShell. To ne bo trajalo dlje od te seje, tako da lahko tako uporabimo PowerShell, kadar koli potrebujemo, ne da bi oslabili splošno varnostno držo sistema. Zdaj, ko smo to popravili, pojdimo na drugo:

Zdaj, ko je skript pravilno izveden, lahko vidimo, kaj to dejansko počne. Sporoči nam, da vodimo scenarij kot omejen uporabnik. Skripta dejansko vodi račun s skrbniškimi dovoljenji, nadzor nad uporabniškim računom pa je na poti.Čeprav podrobnosti o tem, kako skript preverja dostop do skrbnika, presegajo obseg tega članka, tukaj je koda, ki se uporablja za demonstracijo:

if( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent() ) IsInRole( [Security. Principal. WindowsBuiltInRole] "Administrator")){ Write-Output "Running as Administrator!"} Else{ Write-Output "Running Limited!"} Pause

Opazili boste tudi, Operacije "Pause" pri izhodu skripte - eno iz scenarija PowerShell in eno iz batch datoteke. Razlog za to bo bolj očiten v naslednjem koraku.

Korak 3: Pridobitev skrbniškega dostopa.

Če vaš skript ne izvaja nobenih ukazov, ki zahtevajo višino, in ste prepričani, da vam ne bo treba skrbeti, da bi se kdor koli osebni profili približali poti, lahko preskočite preostanek tega.Če imate kode cmdletov na ravni skrbnika, boste potrebovali ta del.

Na žalost ni nobenega načina, kako sprožiti UAC za povišanje iz serijske datoteke ali seje CMD.Vendar PowerShell nam omogoča, da to naredimo s postopkom Start-Process. Ko se uporablja za "-Verb RunAs" v svojih argumentih, bo Start-Process poskušal zagnati aplikacijo s skrbniškimi dovoljenji.Če seja PowerShell še ni povišana, bo to sprožilo poziv UAC.Če želite to uporabiti iz batch datoteke za zagon našega skripta, bomo na koncu ustvarili dva procesa PowerShell - enega, ki bo sprožil Start-Process in drugi, ki ga je začel Start-Process, da bi zagnali skript. Druga vrstica batch datoteke je treba spremeniti v to:

PowerShell.exe -Komanda "&( Start-Process PowerShell.exe -ArgumentList-IzvedbaPolicy Bypass -File" "% ~ dpn0.ps1" "-VerbRunAs} "

Ko je batch datoteka zagnana, bo prva vrstica izhoda, ki jo vidimo, iz scenarija profila PowerShell. Nato bo, ko Start-Process poskuša zagnati MyScript.ps1, prikazan poziv UAC.

Ko kliknete na poziv UAC, se bo pojavil nov primer PowerShell. Ker je to nov primer, bomo ponovno videli obvestilo o skriptu profila. Nato se zažene MyScript.ps1 in vidimo, da smo dejansko v povišani seji.

In tukaj je tudi razlog, da imamo tudi dve premori.Če ne za tisto iz scenarija PowerShell, nikoli ne bi videli izpisa skripte - okno PowerShell bi se samo pojavilo in izginilo, takoj ko se skript izvaja. In brez prekinitve v datoteki serije, ne bi mogli videti, ali je prišlo do napak pri zagonu PowerShell-a.

4. korak: Pridobivanje okroglih profilov PowerShell.

Odpustimo se tega grdega profila po meri, kajne? Tukaj je komaj celo neprijetna, če pa uporabniški profil PowerShell spremeni privzete nastavitve, spremenljivke ali funkcije na načine, ki jih morda niste predvideli s svojim scenarijem, so lahko res težko. To je veliko preprostejše, če želite zagnati svoj skript brez profila, zato vam ni treba skrbeti.Če želite to narediti, moramo samo še enkrat spremeniti drugo vrstico batch datoteke:

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

Dodajanje parametra -NoProfile obema primeroma PowerShell-a, ki jih sproži skript, pomeni, da bo uporabniški skriptni profil v obeh korakih popolnoma preusmerjen, v našem primeru pa bo zagnan naš skript PowerShelldokaj predvidljivo, privzeto okolje. Tukaj vidite, da v nobenem od nabranih lupin ni nobenega obvestila profila po meri.

Če v svojem scenariju PowerShell ne potrebujete skrbniških pravic in ste preskočili 3. korak, lahko to storite brez drugega primerka PowerShell, druga vrstica vaše paketne datoteke pa bi morala biti taka:

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

Rezultat bo potem videti takole:

( Seveda, za skripte, ki niso administratorji, lahko naredite brez prekinitve skripta v vašem PowerShell skriptutudi v tem trenutku, ker je vse zajeto v istem konzolnem oknu in bi bilo tam zadržano s pavzo na koncu datoteke serije.)

Dokončane serijske datoteke.

Odvisno od tega, ali potrebujete dovoljenja skrbnika za vaš PowerShell skript( in jih res ne bi smeli zahtevati, če tega ne storite), mora biti zadnja paketna datoteka videti en od spodnjih dveh.

Brez skrbniškega dostopa:

@ECHO OFF PowerShell.exe -NoProfile-IzvedbaPolicy Bypass -Sommand "&"% ~ dpn0.ps1 "" PAUSE

S skrbniškim dostopom:

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

Ne pozabite postaviti batch datotek v isto mapo kot scenarij PowerShell, ki ga želiteda ga uporabite in ji dajte isto ime. Nato, ne glede na sistem, s katerim boste vzeli te datoteke, boste lahko zagnali svoj PowerShell skript, ne da bi se morali potruditi z nobeno od varnostnih nastavitev v sistemu. Vsekakor lahko te spremembe ročno opravite ročno, toda to vam prihrani te težave in vam ne bo treba skrbeti, da boste kasneje znova vračali spremembe.

Reference:

  • Izvajaj skripte PowerShell iz paketne datoteke - Blogger za programiranje Daniel Schroeder
  • Preverjanje skrbniških dovoljenj v programu PowerShell - Hej, skriptni fant! Blog