If-Koubou

Kako koristiti skupno datoteku kako bi PowerShell skripte lakše pokrenuti

Kako koristiti skupno datoteku kako bi PowerShell skripte lakše pokrenuti (Kako da)

Iz nekoliko razloga, uglavnom sigurnosno povezane, PowerShell skripte nisu tako lako prenosive i upotrebljive kao što mogu biti skice. Međutim, možemo složiti skupnu skriptu s našim PowerShell skriptama radi rješavanja ovih problema. Ovdje ćemo vam pokazati neka od tih problema i kako izraditi skupnu skriptu da biste ih dobili oko njih.

Zašto ne mogu samo kopirati .PS1 datoteku na drugo računalo i pokrenuti ga?

Ako ciljani sustav nije unaprijed konfiguriran tako da omogući izvršavanje proizvoljnih skripti, s potrebnim povlasticama i korištenjem odgovarajućih postavki, vjerojatno ćete se riješiti nekih problema kada pokušate to učiniti.

  1. Po defaultu PowerShell nije pridružen .PS1 datoteci.
    To smo u početku donijeli u seriji PowerShell Geek School. Windows povezuje .PS1 datoteke prema Notepadu, umjesto da ih šalje na naredbeni tumač PowerShell. To sprječava slučajno izvođenje zlonamjernih skripti jednostavnim dvostrukim klikom na njih. Postoji načina na koje možete promijeniti ovo ponašanje, ali to vjerojatno nije nešto što želite učiniti na svakom računalu na kojem šaljete skripte - pogotovo ako neka od tih računala nisu vaša.
  2. PowerShell ne dopušta izvršavanje vanjske skripte prema zadanim postavkama.
    Postavka ExecutionPolicy u programu PowerShell sprječava izvršavanje vanjskih skripti prema zadanim postavkama u svim verzijama sustava Windows. U nekim verzijama sustava Windows zadana ne dopušta izvršavanje skripte. Pokazali smo vam kako promijeniti tu postavku u odjeljku Kako omogućiti izvršavanje PowerShell skripti na sustavu Windows 7. Međutim, to je i nešto što ne želite raditi na bilo kojem računalu.
  3. Neke PowerShell skripte neće raditi bez dozvola administratora.
    Čak i ako se pokrećete s računom na razini administratora, još uvijek trebate proći kontrolu korisničkih računa (UAC) za obavljanje određenih radnji. Ne želimo to onesposobiti, ali još uvijek je lijepo kad se možemo lakše nositi s tim.
  4. Neki korisnici možda su prilagodili okruženja programa PowerShell.
    Vjerojatno se to često nećete truditi, ali kada to učinite, trčanje i rješavanje problema skripti bit će frustrirajuće. Na sreću, možemo se okrenuti bez ikakvih trajnih promjena.

Korak 1: Dvaput kliknite za pokretanje.

Počnimo rješavanjem prvog problema - .ps1 udruženja datoteka. Ne možete dvaput kliknuti za pokretanje .PS1 datoteka, ali možete izvršiti .BAT datoteku na taj način. Stoga ćemo napisati batch datoteku za poziv PowerShell skripte iz naredbenog retka za nas.

Stoga ne moramo ponovno napisati batch datoteku za svaku skriptu, ili svaki put kad premjestimo skriptu, upotrebljavat će se samoobvezujuća varijabla za izradu putanja datoteke za PowerShell skriptu. Da biste to učinili, batch datoteka mora biti postavljena u istu mapu kao i PowerShell skripta i imati isti naziv datoteke. Dakle, ako se vaša PowerShell skripta zove "MyScript.ps1", trebate nazvati batch datoteku "MyScript.bat" i provjerite je li u istoj mapi. Zatim stavite ove retke u skupnu skriptu:

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

Ako ne bi postojala druga sigurnosna ograničenja, bilo bi sve što je potrebno da bi pokrenuli PowerShell skriptu iz batch datoteke. Zapravo, prva i zadnja crta uglavnom su samo prednost - to je druga linija koja stvarno radi posao. Evo sloma:

@Heko isključeno isključuje naredbeni odjek. To samo drži vaše druge naredbe od prikazivanja na zaslonu kada se batch datoteka izvodi. Ova linija je skrivena pomoću simbola (@) ispred njega.

PowerShell.exe Command "&"% dpn0.ps1 '" zapravo pokreće PowerShell skriptu. PowerShell.exe naravno može biti pozvan iz bilo kojeg CMD prozora ili batch datoteke za pokretanje PowerShell na golom konzole kao i obično. Također ga možete koristiti za pokretanje naredbi izravno iz batch datoteke, uključujući parametar-Command i odgovarajuće argumente. Način na koji se to koristi za ciljanje naše .PS1 datoteke je s posebnom% ~ dpn0 varijable. Trčanje iz batch datoteke,% ~ dpn0 procjenjuje na slovo pogona, put mape i naziv datoteke (bez proširenja) batch datoteke. Budući da se batch datoteka i PowerShell skripta nalaze u istoj mapi i imaju isto ime,% ~ dpn0.ps1 će se prevesti na punu stazu datoteke PowerShell skripte.

PAUZA samo zaustavlja izvršavanje serije i čeka korisnički unos. To je opće korisno imati na kraju vaših batch datoteka, tako da imate priliku pregledati bilo koju naredbu izlaz prije nestanka prozora. Dok prolazimo kroz testiranje svakog koraka, korisnost ovog postupka postat će očitija.

Stoga je postavljena osnovna batch datoteka. Za demonstraciju ovu datoteku spremaju se kao "D: \ Script Lab \ MyScript.bat" i u istoj mapi nalazi se "MyScript.ps1". Pogledajmo što se događa kada dvaput kliknemo MyScript.bat.

Očito PowerShell skripta nije pokrenuta, ali to se može očekivati ​​- ipak smo se riješili samo prvom od naših četiri problema. Međutim, ovdje su prikazani važni bitovi:

  1. Naslov prozora pokazuje da je skupa skripta uspješno pokrenula PowerShell.
  2. Prva linija izlaza pokazuje da je u uporabi prilagođeni PowerShell profil. Ovo je potencijalni problem # 4, gore naveden.
  3. Poruka o pogrešci pokazuje izvršna ograničenja izvršenja. To je naš problem # 2.
  4. Podcrtani dio poruke o pogrešci (koji se vrši nativno pomoću izlaza pogreške PowerShellta) pokazuje da je skupa batch ispravno ciljala namijenjenu skriptu PowerShell (D: \ Script Lab \ MyScript.ps1). Tako da barem znamo da puno funkcionira ispravno.

Profil je, u ovom slučaju, jednostavna jednorinačna skripta koja se koristi za ovu demonstraciju za generiranje izlaza kad god je profil aktivan. Da biste to učinili možete i prilagoditi vlastiti PowerShell profil, ako želite testirati te skripte. Jednostavno dodajte sljedeću liniju u svoju skriptu profila:

Izravan ispis "Profil Custom PowerShell na snazi!"

ExecutionPolicy na testnom sustavu ovdje je postavljen na RemoteSigned. To omogućuje izvršavanje lokalno izrađenih skripti (poput skripte profila), dok blokira skripte iz vanjskih izvora, osim ako ih potpisuje pouzdano tijelo. Za demonstracije upotrijebljena je sljedeća naredba za označavanje MyScript.ps1 kao vanjskog izvora:

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

To određuje Zone.Identifier zamjenski tok podataka na MyScript.ps1 tako da će Windows misliti da je datoteka došla s Interneta. Može se jednostavno preokrenuti sljedećom naredbom:

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

Korak 2: Uspostavljanje izvršne politike.

Dobivanje postavke ExecutionPolicy, iz CMD-a ili skupne skripte, zapravo je prilično jednostavno. Izmijenimo drugu liniju skripte da bismo dodali još jedan parametar PowerShell.exe naredbi.

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

Parametar -ExecutionPolicy može se koristiti za izmjenu ExecutionPolicy-a koji se koristi kada stvorite novu PowerShell sesiju. To neće trajati dalje od te sesije, tako da možemo pokrenuti PowerShell ovako kad god je to potrebno, a da ne oslabi opće sigurnosno držanje sustava. Sada kada smo to riješili, imamo još jednu:

Sada kada je skripta ispravno izvršena, možemo vidjeti što zapravo radi. Obavješćuje nas da pokrenemo skriptu kao Ograničeni korisnik. Zapis se zapravo pokreće računom s dozvolama administratora, ali kontrola korisničkih računa je na putu. Iako pojedinosti o tome kako skripta provjerava pristup administratora izvan opsega ovog članka, ovdje je kôd koji se koristi za demonstraciju:

ako je (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()) IsInRole (Security.Principal.WindowsBuiltInRole] "Administrator")) Write-Output "Trčanje kao administrator!" else Write-Output 'Running Limited!' Pauziraj

Također ćete primijetiti da u izlaznoj skripta postoji dva operacija "pauziranja" - jedan iz skripte PowerShell i jedan iz batch datoteke. Razlog za to će biti jasniji u sljedećem koraku.

Korak 3: Dobivanje pristupa administratoru.

Ako vaša skripta ne pokreće nijednu naredbu koja zahtijeva nadmorsku visinu, a prilično je siguran da nećete morati brinuti o prilagođenom profilu nekog tko je na putu, možete preskočiti ostatak toga. Ipak, ako koristite neke cmdletove na razini administratora, trebat će vam taj komad.

Nažalost, ne postoji način za pokretanje UAC-a za eleviranje unutar batch datoteke ili CMD sesije. Međutim, PowerShell nam omogućuje da to učinimo s Start-Processom. Kada se u argumentima koristi s "-Verb RunAs", Start-Process će pokušati pokrenuti aplikaciju s dozvolama administratora. Ako sesija PowerShell nije već povišena, to će pokrenuti UAC prompt. Da bismo to mogli koristiti iz batch datoteke za pokretanje skripte, završit ćemo mrijesta dva procesa PowerShell-a - jedan koji će otpuštati Start-Process i drugi, pokrenuti od strane Start-Processa, za pokretanje skripte. Druga linija batch datoteke mora biti promijenjena na ovo:

PowerShell.exe-Command "i Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "" -Verb RunAs "

Kada se batch datoteka pokrene, prva linija izlaza vidjet ćemo iz skripte profila PowerShell. Zatim će se pojaviti upit UAC kada Start-Process pokuša pokrenuti MyScript.ps1.

Nakon što kliknete UAC naredbu, nova instanca PowerShell će se pojaviti. Budući da je to nova instanca, naravno, ponovo ćemo vidjeti obavijest o skriptu profila. Zatim se pokreće program MyScript.ps1 i vidimo da smo zaista u povišenoj sesiji.

I tu je i razlog da ovdje imamo i dvije pauze. Ako ne i za onu u PowerShell skripti, nikad nećemo vidjeti izlaz skripte - prozor PowerShell samo bi se pojavio i nestao čim skript bude pokrenut. I bez stanke u batch datoteci, ne bismo mogli vidjeti je li došlo do pogrešaka u pokretanju PowerShell-a na prvom mjestu.

Korak 4: Dobivanje prilagođenih profila PowerShell.

Dajmo se riješiti tog neugodnog običajnog profila, zar ne? Ovdje je teško čak i smetnja, ali ako korisnikov PowerShell profil promijeni zadane postavke, varijable ili funkcije na načine na koje niste mogli predvidjeti pomoću svoje skripte, oni mogu biti zaista uznemirujući. Mnogo je jednostavnije pokrenuti skriptu bez profila, tako da ne morate brinuti o tome. Da biste to učinili, trebamo još jednom promijeniti drugi redak batch datoteke:

PowerShell.exe -NoProfile-Command "i Start-proces PowerShell.exe -ArgumentList '-NoProfil -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "-Verb RunAs"

Dodavanjem parametra -NoProfile na oba slučaja PowerShella koji su pokrenuli skripta znači da će se korisnička skripta za profila potpuno zaobići u oba koraka, a skripta PowerShell će se izvoditi u prilično predvidljivom, zadanom okruženju. Ovdje možete vidjeti da ne postoji prilagođena obavijest o profilu u bilo kojem od rasporedenih ljuski.

Ako u Skripti PowerShell ne trebate administratorska prava, a preskočili ste korak 3, možete to učiniti bez instalacije drugog PowerShell a drugi redak vaše batch datoteke trebao bi izgledati ovako:

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

Izlaz će izgledati ovako:

(Naravno, za skripte koje nisu administrator, u toj ćete fazi moći obaviti i pauzu krajnje skripte u PowerShell skripti jer je sve uhvaćeno u istom prozoru konzole i održat će se pauza na kraju svejedno batch datoteka.)

Dovršene serije datoteka.

Ovisno o tome trebate li administratorske dozvole za vašu PowerShell skriptu (a vi ih ne biste trebali zatražiti ako to ne učinite), konačna batch datoteka trebala bi izgledati kao jedno od dva ispod.

Bez administratorskog pristupa:

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

S pristupom administratoru:

@ ECO OFF PowerShell.exe -NoProfile-Command "i Start-Process PowerShell.exe -ArgumentList" -NoProfil -ExecutionPolicy Bypass -File ""% ~ dpn0.ps1 "" -Verb RunAs "PAUSE

Ne zaboravite staviti serijsku datoteku u istu mapu kao i PowerShell skriptu za koju ga želite koristiti i dati ga isto ime. Zatim, bez obzira na sustav kojim poduzimate te datoteke, moći ćete pokrenuti PowerShell skriptu bez potrebe da se prkose s nekom od sigurnosnih postavki sustava. Te promjene svakako možete ručno izvršiti svaki put, ali to vam štedi problem i nećete morati brinuti o tome da kasnije vratite promjene.

Reference:

  • Pokretanje skripti PowerShell iz batch datoteke - Daniel Schroederov programski blog
  • Provjera dopuštenja administratora u sustavu PowerShell - Hej, scenaristička tip! Blog