9Sep
Iz nekoliko razloga, uglavnom sigurnosne, PowerShell skripte nisu tako lako prenosive i upotrebljive kao što mogu biti skice. Međutim, možemo složiti skupnu skriptu pomoću skripti PowerShell kako bismo riješili te probleme. 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 pokretanje proizvoljnih skripti, s potrebnim povlasticama i korištenjem odgovarajućih postavki, vjerojatno ćete se riješiti nekih problema kada pokušate to učiniti.
- PowerShell nije pridružen proširenju. PS1 datoteke prema zadanim postavkama.
U početku smo to 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. - PowerShell ne dopušta izvršavanje vanjske skripte prema zadanim postavkama.
Postavka ExecutionPolicy u PowerShellu 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. - Neke PowerShell skripte neće raditi bez administratorskih dopuštenja.
Čak i trčanje s računom na razini administratora, i dalje trebate dobiti kontrolu korisničkih računa( UAC) za obavljanje određenih radnji. Ne želimo to onemogućiti, ali još uvijek je lijepo kad se možemo lakše nositi s tim. - Neki korisnici možda su prilagodili PowerShell okruženja.
Vjerojatno se nećete upustiti u ovo često, 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 adresiranjem prvog problema -. PS1 pridruživanja 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.
Dakle, ne moramo ponovno napisati batch datoteku za svaku skriptu, ili svaki put kada premjestimo skriptu, koristit će se samoobvezujuća varijabla za izgradnju putanje 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 Command "& '% dpn0.ps1'" PAUSEAko ne bi postojala druga sigurnosna ograničenja, to bi stvarno bilo svepotrebno je pokrenuti PowerShell skriptu iz batch datoteke. Zapravo, prva i zadnja crta uglavnom su samo prednost - to je druga linija koja stvarno radi posao. Evo sloma:
@ECHO OFF 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.
PAUSE samo zaustavlja izvršavanje serije i čeka ulaz korisnika. Ovo je opće korisno imati na kraju svojih 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.
Dakle osnovna je batch datoteka postavljena. 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 neki važni bitovi:
- Naslov prozora pokazuje da je skupno skriptirano uspješno pokrenuto PowerShell.
- Prva linija izlaza pokazuje da je u uporabi prilagođeni PowerShell profil. Ovo je potencijalni problem # 4, gore naveden.
- Poruka o pogrešci pokazuje izvršna ograničenja izvršenja. To je naš problem # 2.Podcrtani dio poruke o pogrešci( što se nativno radi pomoću izlaza pogreške PowerShell-a) pokazuje da je skupa batch ispravno ciljala predodređenu PowerShell skriptu( 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:
Write-Output 'Profil Custom PowerShell na snazi!'ExecutionPolicy na testnom sustavu postavljen je 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 demonstracijske svrhe, upotrijebljena je sljedeća naredba za označavanje MyScript.ps1 kao vanjskog izvora:
Dodatak - Put 'D: \ Script Lab \ MyScript.ps1' -Value "[ZoneTransfer]` nZoneId = 3 "-Stream 'Zone. Identifier'Ovo postavlja Zone. Identifier alternativni tok podataka na MyScript.ps1 tako da će Windows misliti da je datoteka došla s Interneta. To se lako može preokrenuti sljedećom naredbom:
Clear-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Stream 'Zone. Identifier'Korak 2: Uzimajući okolo ExecutionPolicy.
Uzimajući postavku ExecutionPolicy, od CMD ili skupne skripte, zapravo je prilično jednostavna. 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 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š jedan pristup:
Sada kada je skripta ispravno izvršena, možemo vidjeti što 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 su detalji o tome kako skripta provjerava pristup administratora izvan opsega ovog članka, ovdje je kod koji se koristi za demonstraciju:
ako( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent()} IsInRole({ Security. Principal. WindowsBuiltInRole] "Administrator")){ Write-Output 'Trčanje kao administrator!'} Else{ Write-Output 'Running Limited!'} PauzirajTakođer ćete primijetiti da postoje dva"Pause" operacije u skripti izlaz - jedan iz PowerShell skripte, i jedan iz batch datoteka. 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 se nećete morati brinuti o prilagođenom profilu koji ste dobili na putu, možete preskočiti ostatak. Ipak, ako koristite neke cmdletove na razini administratora, trebat će vam taj komad.
Nažalost, nema načina pokretanja UAC-a za eleviranje unutar batch datoteka 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 naše skripte, završit ćemo mrijesta dva procesa PowerShell-a - jedan koji će otpuštati Start-Process i drugi, pokrenuti Start-Process, za pokretanje skripte. Druga linija batch datoteke mora biti promijenjena na ovo:
PowerShell.exe Command &{ Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File ""% ~ dpn0.ps1 "" -VerbRunAs} "Kada se batch datoteka pokrene, prva linija izlaza koju vidimo je iz skripte profila PowerShell. Zatim će se pojaviti upit UAC kada Start-Process pokuša pokrenuti MyScript.ps1.
Nakon što kliknete UAC promptu, 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 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 PowerShell profila.
Dajmo se riješiti ove neugodne obavijesti o prilagođenom profilu, 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 sa svojom skriptom, oni mogu biti jako 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 drugu liniju batch datoteke:
PowerShell.exe -NoProfile-Command "i{ Start-Process PowerShell.exe -ArgumentList" -NoProfile -ExecutionPolicy Bypass -File "% ~ dpn0.ps1 "" "-Verb RunAs}"Dodavanje parametra -NoProfile u oba slučaja PowerShella pokrenute skripta znači da će se korisnička skripta za profila potpuno zaobilaziti u oba koraka, a PowerShell skripta će se izvoditiprilično predvidljiva, zadana okolina. Ovdje možete vidjeti da ne postoji prilagođena obavijest o profilu u bilo kojem od rasporedenih ljuski.
Ako ne trebate administratorska prava u PowerShell skripti, a preskočite 3. korak, možete to učiniti bez instalacije drugog PowerShell a drugi redak vaše batch datoteke treba izgledati ovako:
PowerShell.exe -NoProfile -ExecutionPolicy Bypass-Command "i"% dpn0.ps1 "Izlaz će izgledati ovako:
( Naravno, za ne-administratorske skripte, možete napraviti bez pauza završetka skripte u PowerShell skriptiu ovom trenutku previše jer je sve zarobljeno u istom prozoru konzole i tamo će se održati pauza na kraju batch datoteke svejedno.)
Dovršene batch datoteka.
Ovisno o tome trebate li administratorske dozvole za vašu PowerShell skriptu( i zaista 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" i "% dpn0.ps1 '" PAUSESa administratorskim pristupom:
@ECHO OFF PowerShell.exe -NoProfile-Command "&{Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""% ~ dpn0.ps1 "" "-Verb RunAs}" PAUSENe zaboravite staviti batch datoteku u istu mapu kao i PowerShell skriptu koju želiteda ga upotrebljavaju i daju isto ime. Zatim, bez obzira na sustav kojim poduzimate te datoteke, moći ćete pokrenuti PowerShell skriptu bez da se prilijepljujete 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 administratorskih dozvola u PowerShell-u - Hej, scenaristička tip! Blog