9Sep

Kaip naudoti paketinį failą, kad "PowerShell" scenarijus būtų lengviau paleisti

Dėl keleto priežasčių, dažniausiai su saugumu susiję "PowerShell" scenarijai nėra tokie lengvai perkeliami ir gali būti naudojami kaip partijos scenarijai. Tačiau mes galime susieti paketinį scenarijų su "PowerShell" scenarijais, kad galėtume išspręsti šias problemas.Čia parodysime keletą iš šių probleminių sričių ir kaip sukurti paketinį scenarijų, kad juos apeitumėte.

Kodėl negaliu tiesiog kopijuoti savo. PS1 failo kitame kompiuteryje ir paleisti jį?

Jei tikslinė sistema nebuvo iš anksto sukonfigūruota, kad būtų galima paleisti savavališkus scenarijus, su reikalingomis privilegijomis ir naudojant tinkamus nustatymus, tikėtina, kad jūs bandysite susidurti su kai kuriomis problemomis.

  1. "PowerShell" pagal nutylėjimą nėra susietas su. PS1 failo plėtiniu.
    Iš pradžių mes tai išvedėme "PowerShell Geek School" serijoje."Windows" susieja. PS1 failus su "Notepad" pagal numatytuosius nustatymus, o ne siunčia juos "PowerShell" komandų interpretuotojui. Tai yra išvengti netyčinio kenkėjiškų scenarijų vykdymo tiesiog juos dukart spustelėdami. Yra būdų, kaip galite pakeisti šią elgseną, bet tikriausiai tai nėra kažkas, ko norite atlikti kiekviename kompiuteryje, kuriame jūs naudojate savo scenarijus, ypač kai kai kurie iš šių kompiuterių nėra jūsų.
  2. PowerShell neleidžia vykdyti išorinio scenarijaus pagal nutylėjimą.
    "ExecutionPolicy" nustatymas "PowerShell" neleidžia pagal numatytuosius nustatymus vykdyti išorinius scenarijus visose "Windows" versijose. Kai kuriose "Windows" versijose pagal nutylėjimą neleidžiama vykdyti scenarijaus. Mes parodėme, kaip pakeisti šį nustatymą "Kaip įgalinti" PowerShell "scenarijų vykdymą sistemoje" Windows 7 ". Tačiau tai taip pat yra tai, ko nenorite daryti tik bet kuriame kompiuteryje.
  3. Kai kurie "PowerShell" scenarijai neveiks be administratoriaus leidimų.
    Netgi dirbant su administratoriaus lygio paskyra, norint atlikti tam tikrus veiksmus vis tiek reikia per "User Account Control"( UAC).Mes nenorime jį išjungti, bet vis dar malonu, kai galime padaryti tai lengviau spręsti.
  4. Kai kuriems vartotojams gali būti pritaikyta "PowerShell" aplinka.
    Jūs, tikriausiai, dažnai nepateksite į tai, bet, kai tai padarysite, jis gali veikti ir trikčių šalinimas jūsų scenarijus šiek tiek varginantis. Laimei, mes galime išspręsti šią problemą be jokių nuolatinių pakeitimų.

1 žingsnis: dukart spustelėkite paleisti.

Pradėkime nuo pirmosios problemos -. PS1 failų asociacijų.Negalite dukart spustelėti paleisti. PS1 failus, tačiau tokiu būdu galite paleisti. BAT failą.Taigi, mes parašysime paketinį failą, norėdami paskambinti PowerShell scenarijų iš mūsų komandinės eilutės.

Taigi, mums nereikia iš naujo parašyti paketinio failo kiekvienam scenarijui, arba kiekvieną kartą, kai mes perkelti scenarijų, jis naudos savireguliavimo kintamąjį, kuris sukuria failo kelią "PowerShell" scenarijui. Norėdami atlikti šį darbą, serijinis failas turės būti dedamas į tą patį aplanką, kuriame yra jūsų "PowerShell" scenarijus, ir turi tą patį failo vardą.Taigi, jei jūsų "PowerShell" scenarijus vadinamas "MyScript.ps1", turėsite pavadinti savo paketinį failą "MyScript.bat" ir įsitikinti, kad jis yra toje pačioje aplanke. Tada įterpkite šias eilutes partijos scenarijuje:

@ECHO OFF PowerShell.exe -Command "&% ~ dpn0.ps1" PAUZĖ

Jei nebūtų kitų saugumo apribojimų, tai tikrai būtų viskasreikia paleisti "PowerShell" scenarijų iš paketinio failo. Tiesą sakant, pirmoji ir paskutinė eilutės iš esmės yra tik pirmumo reikalas - tai antroji eilutė, kuri iš tikrųjų daro darbą.Štai suskaidymas:

@ECHO OFF išjungia komandos atkartojimą.Tai tik palaiko kitas komandas, rodomas ekrane, kai paleidžiamas paketinis failas.Ši linija savaime paslėpta naudojant simbolį( @) prieš jį.

PowerShell.exe -Command "&'% ~ Dpn0.ps1' ' iš tikrųjų paleidžia PowerShell scenarijų.Žinoma, "PowerShell.exe" gali būti iškviestas iš bet kurio CMD lango ar paketinio failo, kad "PowerShell" būtų paleistas kaip nemalonus konsolės. Taip pat galite jį naudoti komandoms paleisti iš partijos failo, įtraukdami parametrą -Command ir atitinkamus argumentus. Tai, kaip jis naudojamas mūsų. PS1 failui pasiekti, yra specialus% ~ dpn0 kintamasis. Vykdoma iš paketinio failo,% ~ dpn0 vertinamas kaip partijos disko raidė, aplanko kelias ir failo vardas( be pratęsimo).Kadangi serijinis failas ir PowerShell scenarijus bus toje pačioje aplanke ir turi tą patį pavadinimą,% ~ dpn0.ps1 bus išverstas į visą "PowerShell" scenarijaus failo kelią.

PAUSE tiesiog sustabdo partijos vykdymą ir laukia vartotojo įvesties. Tai dažniausiai naudinga turėti paketų rinkmenų pabaigoje, kad prieš paleidžiant langą būtų galimybė peržiūrėti bet kokią komandinę išeitį.Kai atliksime kiekvieno žingsnio bandymus, tai bus akivaizdi.

Taigi, nustatytas pagrindinis serijinis failas. Demonstravimo tikslais šis failas yra įrašomas kaip "D: \ Script Lab \ MyScript.bat" ir toje pačioje aplanke yra "MyScript.ps1".Pažiūrėkime, kas atsitinka, kai dukart spustelėkite MyScript.bat.

Akivaizdu, kad "PowerShell" scenarijus neveikė, bet to reikia tikėtis - vis dėlto tik pirmąją iš keturių problemų sprendėme. Tačiau čia yra keletas svarbių bitų:

  1. Lango pavadinimas rodo, kad partijos scenarijus sėkmingai paleidžia PowerShell.
  2. Pirmoji išvesties eilutė rodo, kad naudojamas tinkintas "PowerShell" profilis. Tai potenciali problema Nr. 4, išvardyta aukščiau.
  3. Klaidos pranešimas demonstruoja galiojančius "ExecutionPolicy" apribojimus. Tai mūsų problema Nr. 2.
  4. Pabraukta klaidos pranešimo dalis( tai daroma iš "PowerShell" klaidos išvesties) rodo, kad partijos scenarijus buvo tinkamai nukreiptas į numatomą PowerShell scenarijų( D: \ Script Lab \ MyScript.ps1).Taigi, mes bent jau žinome, kad daugelis dirba tinkamai.

Šiuo atveju profilis yra paprastas vieno langelio scenarijus, naudojamas šiam demonstravimui generuoti produkciją, kai profilis yra aktyvus. Taip pat galite pritaikyti savo "PowerShell" profilį, jei norite patys išbandyti šiuos scenarijus. Savo profilio scenarijų tiesiog pridėkite šią eilutę:

Write-Out "Galioja" Custom PowerShell profilis "!

Tyrimo sistemoje "ExecutionPolicy" čia nustatyta "RemoteSigned".Tai leidžia vykdyti vietoje sukurtus scenarijus( pvz., Profilio scenarijų), tuo tarpu blokuoja scenarijus iš išorinių šaltinių, nebent jie yra pasirašyti patikimos institucijos. Demonstravimo tikslais ši komanda buvo naudojama MyScript.ps1 kaip išorinio šaltinio žymėjimui:

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

Tai nustato alternatyviojo srauto "Zone. Identifier" srautą "MyScript.ps1", kad "Windows" manė, kad failas buvo gautas iš interneto. Tai gali būti lengvai pakeista tokia komanda:

Clear-Content -Path 'D: \ Scenarijaus laboratorija \ MyScript.ps1'-Stream'as Zone. Identifier'

2 veiksmas: "Getting around ExecutionPolicy".

"ExecutionPolicy" nustatymas iš CMD ar partijos scenarijų iš tiesų yra labai lengvas. Mes tiesiog pakeisime antrą scenarijaus eilutę, norėdami pridėti dar vieną parametrą komandai PowerShell.exe.

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

Parametras -ExecutionPolicy gali būti naudojamas modifikuoti ExecutionPolicy, kuris naudojamas, kai jūs kuriate naują" PowerShell "seansą.Tai nepasileidžia per tą seansą, taigi galime paleisti "PowerShell" tokiu būdu, kai mums reikia, be susilpninti bendrosios sistemos saugumo. Dabar, kai tai ištaisėme, leiskite dar kartą eiti į jį:

Dabar, kai scenarijus yra tinkamai įvykdytas, mes galime pamatyti, ką iš tikrųjų daro. Tai leido mums žinoti, kad mes naudojame scenarijų kaip riboto naudotojo. Scenarijus iš tikrųjų yra valdomas paskyros su administratoriaus leidimais, bet vartotojo abonemento valdymas tampa įmanomas. Nors išsami informacija apie tai, kaip scenarijus patikrina prieigą prie administratoriaus, yra šio straipsnio taikymo sritis, čia yra naudojamas demonstravimui naudojamas kodas:

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

Taip pat pastebėsite,"Pauzės" operacijos iš scenarijaus išvesties - viena iš "PowerShell" scenarijaus ir viena iš paketinio failo. To priežastis bus aiškesnė kitame žingsnyje.

3 žingsnis. Prieiga prie administratoriaus.

Jei jūsų scenarijus nenaudoja jokių komandų, kurioms reikia aukščio, ir jūs gana įsitikinsite, kad jums nereikės nerimauti dėl to, kad kiti asmeniniai profiliai pasiektų kelią, galite praleisti likusią dalį.Jei naudojate kai kurias administratoriaus lygio cmdlet, jums reikės šio kūrinio.

Deja, jokiu būdu negalima sukelti UAC pakilimo iš paketinio failo ar CMD sesijos. Tačiau "PowerShell" tai leidžia mums tai padaryti "Start-Process".Kai jo argumentai naudojami su "-Verb RunAs", "Start-Process" bandys paleisti programą su administratoriaus leidimais. Jei "PowerShell" sesija dar nėra padidinta, tai suaktyvins UAC raginimą.Jei norite naudoti šį scenarijų paleidimo partijos rinkmeną, mes baigsime dviejų "PowerShell" procesų neršimą - vieną paleidžiant "Start-Process", o kitą - "Start-Process", paleidžiantį scenarijų.Antroji serijinio failo eilutė turi būti pakeista taip:

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

Kai vykdomas paketinis failas, pirmoji produkcijos eilutė, kurią matysime, yra iš PowerShell profilio scenarijaus. Tada UAC greitis bus, kai "Start-Process" bandys paleisti "MyScript.ps1".

Paspaudus UAC raginimą atsiras naujas "PowerShell" egzempliorius.Žinoma, tai yra naujas pavyzdys, mes vėl pamatysime pranešimą apie profilio scenarijų.Tada MyScript.ps1 paleidžiamas, ir mes matome, kad mes iš tiesų yra padidėjusi sesija.

Ir tai yra priežastis, dėl kurios mes taip pat turime dvi pauzes. Jei ne, tai scenarijaus "PowerShell" scenarijaus niekada nematysime scenarijaus išvesties - "PowerShell" langas tiesiog pasirodys ir išnyks, kai tik veiks scenarijus. Ir be paketinio failo pauzės mes negalėsime pamatyti, ar buvo klaidų, pirmiausia paleidžiant "PowerShell".

4 veiksmas: "Custom PowerShell" profilių paieška.

Leiskite atsikratyti šio bjauraus užsakymo profilis dabar, ar mes?Čia tai vargu ar yra net nemalonus dalykas, tačiau jei vartotojo "PowerShell" profilis pakeičia numatytuosius nustatymus, kintamuosius ar funkcijas taip, kaip jūs negalėjote numatyti savo scenarijaus, jie gali būti labai varginantis. Tai daug paprasčiau paleisti scenarijų be profilio, todėl nereikia jaudintis. Norėdami tai padaryti, mes turime dar kartą pakeisti antrąją serijinio failo eilutę:

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

Parametro -NoProfile pridėti prie abiejų scenarijaus paleidžiamų "PowerShell" atvejų reiškia, kad naudotojo profilio scenarijus bus visiškai apeinamas abiem etapais, o mūsų PowerShell scenarijus bus paleistasgana prognozuojama, numatytoji aplinka.Čia galite matyti, kad nė viename iš sukurtų lukštų nėra specialaus profilio pranešimo.

Jei jums nereikia administratoriaus teisių savo PowerShell scenarijuje ir praleidote 3 žingsnį, galite atlikti be antrojo "PowerShell" egzemplioriaus, o antroji jūsų paketinio failo eilutė turėtų atrodyti taip:

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

Išvestis bus tokia:

( Žinoma, ne "Administratoriaus" scenarijams galėtumėte be scenarijaus galiojimo pabaigos užbaigti savo "PowerShell" scenarijųšiuo metu taip pat, nes viskas yra užfiksuota toje pačioje konsolės lange ir bet kuriuo atveju laikoma pauze serijinio failo pabaigoje.)

Baigti partijos failai.

Atsižvelgiant į tai, ar jūsų "PowerShell" scenarijų reikia administratoriaus teisių( ir jūs neturėtumėte jų prašyti, jei neturite), galutinis serijinis failas turėtų atrodyti kaip vienas iš toliau pateiktų.

be administratoriaus prieigos:

@ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "&% ~ dpn0.ps1" PAUSA

Su administratoriaus prieiga:

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

Nepamirškite įdėti paketinį failą tame pačiame aplanke kaip norimas PowerShell scenarijusnaudoti jį ir suteikti tą patį pavadinimą.Tada, nesvarbu, kokią sistemą naudosite šiems failams, galėsite paleisti savo "PowerShell" scenarijų, nenaudodami jokių saugumo nustatymų sistemoje. Jūs galėtumėte nekeisti šių pakeitimų rankiniu būdu kiekvieną kartą, tačiau tai sutaupys jums šios bėdos, ir jums nereikės jaudintis dėl pakeitimų grąžinimo vėliau.

Nuorodos:

  • "PowerShell" scenarijų paleidimas iš paketinio failo - "Daniel Schroeder" programavimo dienoraštis
  • "PowerShell" administratoriaus teisių leidimų tikrinimas - Ei, scenarijus vaikinas! Dienoraštis