lt.phhsnews.com


lt.phhsnews.com / Kaip naudoti paketinį failą, kad "PowerShell" scenarijus būtų lengviau paleisti

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


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

Kodėl negaliu tiesiog kopijuoti savo .PS1 failo į kitą kompiuterį ir jį paleisti?

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 bandysite tai padaryti.

  1. PowerShell yra pagal nutylėjimą nesiejamas 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č jei kai kurie iš šių kompiuterių nėra jūsų.
  2. "PowerShell" neleidžia išorinių pagal nutylėjimą vykdomas scenarijus. "PowerShell" nustatymas "ExecutionPolicy" neleidžia numatytai vykdyti išorinių scenarijų visose "Windows" versijose. Kai kuriose "Windows" versijose pagal nutylėjimą neleidžiama vykdyti scenarijaus. Mes parodėme, kaip pakeisti šį nustatymą, kaip leisti "PowerShell" scenarijus paleisti "Windows 7". Tačiau tai taip pat yra tai, ko nenorite daryti tik bet kuriame kompiuteryje.
  3. Kai kurie "PowerShell" scenarijai neveiks be " Administratoriaus leidimai. Netgi dirbant su administratoriaus lygio paskyra, norint atlikti tam tikrus veiksmus vis tiek reikia per "User Account Control" (UAC). Mes nenorime, kad tai būtų išjungta, bet vis tiek malonu, kai mes galime šiek tiek lengviau spręsti.
  4. Kai kurie vartotojai gali turėti pritaikytą "PowerShell" aplinką.
    Tikėtina, kad jūs dažnai nepateksite į tai, bet kai jūs tai atliksite, galėsite veikti ir trikčių šalinimas jūsų scenarijus šiek tiek varginantis. Laimei, mes galime išspręsti šią problemą be jokių nuolatinių pakeitimų.

1 veiksmas: 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 užrašysime partijos rinkmeną, kad galėtume paskambinti PowerShell scenarijų iš mūsų komandinėje eilutėje.

Taigi mums nereikia iš naujo parašyti paketinio failo kiekvienam scenarijui arba kiekvieną kartą, kai mes perkelti scenarijų aplink. "PowerShell" scenarijaus failo kelias bus naudojamas savarankiško kintamojo kintamojo kintamojo. 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ėtumėte 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' 'PAUSE

Jei nebūtų taikomi kiti saugumo apribojimai, tai būtų tikrai yra viskas, ko reikia norint 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 komandų atkartojimą. Tai tik palaiko kitas komandas, rodomas ekrane, kai paleidžiamas paketinis failas. Ši eilutė savaime yra paslėpta priešais esantį simbolį (@).

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 paketinis 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 akivaizdu.

Taigi, nustatytas pagrindinis rinkmenų rinkinys. 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 spragtelėjame MyScript.bat.

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

  1. Lango pavadinimas rodo, kad partijos scenarijus sėkmingai paleidė PowerShell.
  2. Pirmoji išvesties eilutė rodo, kad naudojamas tinkintas "PowerShell" profilis. Tai yra potenciali problema Nr. 4, išvardyta aukščiau.
  3. Klaidos pranešime parodomi "ExecutionPolicy" apribojimai. Tai yra mūsų problema Nr. 2.
  4. Pabraukta klaidos pranešimo dalis (tai atliekama 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 daug 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 scenarijui tiesiog pridėkite šią eilutę:

Rašymas-išdavimas "Galiojantis" PowerShell profilis "!

" ExecutionPolicy "bandymo sistemoje čia yra" 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 šiai komandai buvo naudojamas MyScript.ps1 kaip išorinio šaltinio žymėjimas:

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

Tai nustato "Zone.Identifier" alternatyvių duomenų 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 "Zone.Identifier"

2 žingsnis: apvažiavimas "ExecutionPolicy". aplink "ExecutionPolicy" nustatymą, iš CMD arba partijos scenarijų, iš tikrųjų yra gana paprasta. Mes tiesiog pakeisime antrą scenarijaus eilutę, kad galėtume pridėti dar vieną parametrą į komandą PowerShell.exe.

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

Parametras -ExecutionPolicy gali naudokite, kad pakeistumėte "ExecutionPolicy", kuri naudojama iškilus naujam "PowerShell" seanso. Tai nepasileidžia per tą seansą, taigi galime paleisti "PowerShell" tokiu būdu, kai mums reikia, be susilpninti bendrosios sistemos saugumo. Dabar, kai mes tai ištaisėme, leiskite dar kartą eiti į jį:

Dabar, kai scenarijus 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 tikrina administratoriaus prieigą, nepatenka į šio straipsnio taikymo sritį, čia yra naudojamas demonstravimui naudojamas kodas:

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

Taip pat pastebėsite, kad dabar veikia du "Pauzės" veiksmai iš scenarijaus išvesties - vienas iš "PowerShell" scenarijų ir vienas iš paketinio failo. Kitas veiksmas bus akivaizdesnis kitame žingsnyje.

3 žingsnis. Administratoriaus prieigos suteikimas.

Jei jūsų scenarijus nerodo jokių komandų, kurioms reikia pakilimo, ir jūs tikrai tikėtumėte, kad neturėsite nerimauti dėl to, kad visi besinaudojantys profiliai tampa keliami, galite praleisti likusią dalį. Jei naudojate kai kurias administratoriaus lygio cmdlet, jums reikės šio kūrinio.

Deja, nėra jokio būdo sukelti UAC pakilimui 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" " - Verb RunAs} "

Kai paleidžiamas paketinis failas, pirmoji išvesties 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 čia yra priežastis, dėl kurių 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 paketo failo pauzės mes negalėsime pamatyti, ar iš pradžių buvo paleidžiamos "PowerShell" klaidos.

4 žingsnis. "PowerShell" profilių paieška.

Išlaisvinkime tą bjauriai užsakymą profilis dabar, 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 keisti antrą paketinio failo eilutę dar kartą:

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

" -NoProfile "parametro pridėjimas abiejuose scenarijaus paleidžiamuose" PowerShell "variantuose reiškia, kad naudotojo profilio scenarijus bus visiškai apeinamas abiejuose etapuose ir" PowerShell "scenarijų bus vykdoma gana nuspėjama, numatytoji aplinka. Čia galite matyti, kad nė viename iš sukurtų kriauklių nėra nestandartinio profilio pranešimo.

Jei PowerShell scenarijų jums nereikia administratoriaus teisių ir praleidote 3 žingsnį, galite atlikti be antrojo "PowerShell" instancijos ir antroji jūsų serijos failo eilutė turėtų atrodyti taip:

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

Išvestis bus tokia:

( Žinoma, jei esate ne Administratoriaus scenarijų, tai galėtumėte atlikti be scenarijaus pabaigos scenarijų savo PowerShell scenarijuje, nes viskas yra užfiksuota toje pačioje konsolės lange ir ten laikoma pauze pabaigoje Bet kuriuo atveju paketinis failas.)

Užbaigti serijiniai failai.

Atsižvelgiant į tai, ar jūsų "PowerShell" scenarijaus administratoriaus leidimai jums reikalingi (ir jūs neturėtumėte jų prašyti, jei ne), galutinis serijinis failas turėtų atrodyti kaip vienas iš dviejų žemiau.

Be administratoriaus prieigos:

@ECHO OFF PowerShell.exe -NoProfile -ExecutionPoli cy Bypass -Command "& '% ~ dpn0.ps1' 'PAUZĖ

Su administratoriaus prieiga:

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

Nepamirškite įdėti serijos failą tame pačiame aplanke kaip ir "PowerShell" scenarijų, kurį norite jį naudoti, ir suteikite jam 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 kiekvieną kartą atlikti šiuos pakeitimus rankiniu būdu, 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 leidimų tikrinimas - Ei, scenarijus vaikinas! Dienoraštis

  • Kaip atnaujinti turinį App Store, išvalydami talpyklą

    Kaip atnaujinti turinį App Store, išvalydami talpyklą

    Ar nustatote, kad "App Store" nematote naujų programų ar kad programos naujos nebus net tada, kai įdiegsite naujinius? Štai paprastas sprendimas. Nors "App Store" nėra tinklalapis, jis neapsaugo duomenų, kad būtų įkelta greičiau, kaip ir tinklalapis. "App Store" talpyklos išvalymas gali padėti įsitikinti, kad "App Store" programoje yra naujausios, naujausios programos ir naujiniai.

    (how-to)

    Kaip planuoti savo

    Kaip planuoti savo "Ecobee" eiti atostogų režimu

    Jei netrukus atostogojote atostogauti ir nenorite būti varginami pakeisti termostatą, kai bandote nugalėti "Ecobee" iš tikrųjų leidžia planuoti termostatą iš anksto išeiti į "lauko" režimą. "Ecobee" atostogų nustatymas iš esmės yra tik "išjungtas" režimas, kuris sumažina temperatūros nustatymus, kad jūsų šildymas arba oro kondicionierius neveikia taip dažnai, kai esate ne namie.

    (how-to)