9Sep

Kuidas PowerShelli skriptide tegemiseks lihtsamini käivitada partiifaili?

Mitmetel põhjustel ei ole PowerShelli skriptid, mis on enamasti turvalisusega seotud, nii hõlpsasti kaasaskantavad kui ka kasutatavad, kuna need võivad olla partitscentsid. Kuid me võime komplekteerida partitsioonskripti meie PowerShelli skriptidega, et neid probleeme lahendada. Siin näitab teile mõni neist probleemsetest piirkondadest ja kuidas luua partitscriti, et neid ümber käia.

Miks ma ei saa lihtsalt kopeerida oma. PS1-faili mõnda teise arvutisse ja seda käitada?

Kui sihtimissüsteem pole eelnevalt konfigureeritud võimaldama suvaliste skriptide käitamist, nõutavate õigustega ja õigete seadete kasutamisega, on tõenäoline, et proovite seda teha.

  1. PowerShell ei ole vaikimisi seotud faililaiendiga. PS1.
    Esitasime selle algselt meie PowerShelli Geeki koolide sarjas. Windows seostab. PS1-failid Notepadiga vaikimisi, selle asemel et saata need PowerShelli käsuviibisse. Selle eesmärk on vältida pahatahtlike skriptide juhuslikku täitmist, lihtsalt neid topeltklõpsates. On olemas viise, kuidas seda käitumist muuta, kuid see pole tõenäoliselt midagi, mida soovite teha igal arvutil, kuhu te skripte võtate, eriti kui mõni neist arvutidest pole teie enda jaoks.
  2. PowerShell ei võimalda vaikimisi välist skripti täitmist.
    PowerShellis olev ExecutionPolicy seadistus takistab väliste skriptide täitmist vaikimisi kõikides Windowsi versioonides. Mõnes Windowsi versioonis ei luba vaikimisi skripti täitmine üldse. Näitasime, kuidas seda sätet muuta, et lubada PowerShelli skriptide sooritamist Windows 7-s. Kuid see on ka midagi, mida te ei soovi ainult ühes arvutis teha.
  3. Mõned PowerShell-skriptid ei tööta ilma administraatori õigustega.
    Isegi administraatori tasemel kontoga töötades peate teatud toimingute tegemiseks ikkagi läbi kasutajakontode kontrolli( UAC).Me ei soovi seda keelata, kuid see on ikka kena, kui suudame seda natuke lihtsamini lahendada.
  4. Mõnel kasutajal on PowerShelli keskkond kohandatud.
    Tõenäoliselt ei taba see sageli seda sageli, kuid kui sa seda teevad, võib see käivitada ja skriptide tõrkeotsingut natuke petta.Õnneks võime selle ümber minna ka muutmata.

1. samm: topeltklõpsake käivitamiseks.

Alustame esimese probleemiga tegelemisel -. PS1-failide ühendused. Te ei saa topeltklõpsata. PS1-failide käivitamiseks, kuid saate sellisel viisil faili. BAT käivitada. Niisiis, me kirjutame partiifaili, et helistada PowerShelli skripti meie käsurealt.

. Seega ei pea me iga skripti jaoks partiifaili uuesti kirjutama või iga kord, kui liigutame skripti ümber, hakkab kasutama PowerShelli skripti faili asukoha loomiseks isereguleeruvat muutujat. Selle töö tegemiseks tuleb partiifail paigutada PowerShelli skriptiga samasse kausta ja sama failinimega. Nii et kui PowerShelli skript on nimega "MyScript.ps1", peate oma partipilti nimetama "MyScript.bat" ja veenduge, et see on samas kaustas. Seejärel pane need read partitsioonskripti:

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

Kui see ei oleks teiste turbepiirangute asemel, oleks see tõesti kõikkulub PowerFrame skripti käivitamiseks partiifailist. Tegelikult on esimene ja viimane rida peamiselt ainult eelistuse küsimus - see on teine ​​rida, mis tõesti teeb tööd. Siin on jaotus:

@ECHO OFF lülitab käskluse kajastamise välja. See lihtsalt hoiab teie teisi käske ekraanile kuvamise ajal, kui partii töötab. See joon on ise peidetud selle ees oleva sümboli( @) abil.

PowerShell.exe -Command "&'% ~ Dpn0.ps1' ' käivitab PowerShelli skripti. Võimalik, et PowerShell.exe käivitatakse kõikidest CMD aknast või partitsioonifailidest, et käivitada PowerShell tavapärasele tühjale konsoolile. Võite seda kasutada ka käskude käivitamiseks otse partiifailist, lisades -Commandi parameetri ja asjakohased argumendid. Seda, kuidas seda kasutatakse meie. PS1-faili sihtimiseks, on spetsiaalne% ~ dpn0 muutuja. Käivitamine partiifailist% ~ dpn0 hinnatakse partiifaili draivitäht, kausta tee ja faili nimi( ilma laiendita).Kuna partifail ja PowerShelli skript on samas kaustas ja neil on sama nimi, %~ dpn0.ps1 tõlgitakse PowerShelli skripti täielikule failile.

PAUSE lihtsalt peatab partii täitmise ja ootab kasutaja sisendit. See on üldiselt kasulik, kui olete oma partiifailide lõpus, nii et teil on võimalus enne käsu väljumist kaotada käsu väljundi. Kui me läbime iga sammu katsetamise, muutub selle kasulikkus veelgi ilmsemaks.

Seega on põhipartiifail seadistatud. Demonstratsiooni eesmärgil salvestatakse see fail "D: \ Script Lab \ MyScript.bat" ja samas kaustas on "MyScript.ps1".Vaatame, mis juhtub, kui me topeltklõpsame MyScript.bat.

Ilmselt PowerShelli skript ei käivitu, kuid seda tuleb oodata - lõpuks oleme käsitlenud ainult nelja esimest probleemi. Siiski on siin mõned olulised bittid näidatud:

  1. Akna pealkiri näitab, et partitsükkel käivitas PowerShelli edukalt.
  2. Esimene väljundrida näitab, et kasutatakse kohandatud PowerShelli profiili. See on potentsiaalne probleem nr 4, mis on loetletud eespool.
  3. Veateade näitab ExecutionPolicy piiranguid. See on meie probleem nr 2.
  4. Veateate allservas olev osa( mida teeb PowerShelli veaväljundina tehtud algupärane) näitab, et partitscript käivitas kavandatud PowerShelli skripti( D: \ Script Lab \ MyScript.ps1) õigesti. Nii et me vähemalt teame, et palju töötab korralikult.

Antud juhul on profiil lihtne demonstratsiooniks kasutatav ühe liini skript väljundi genereerimiseks alati, kui profiil on aktiivne. Seda saab teha ka oma PowerShelli profiili kohandamiseks, kui soovite neid skripte ise katsetada. Lihtsalt lisage oma profiili skriptile järgmine rida:

kirjutusväljund 'Kasutaja PowerShelli profiil jõustub!'

Siin on katsesüsteemis ExecutionPolicy seatud RemoteSigned. See lubab kohapeal loodud skripte( nagu profiiliskript) kasutada, kuid blokeerivad skripte välistest allikatest, kui neid pole usaldusväärse asutuse poolt allkirjastatud. Demonstratsioonide eesmärgil kasutati MyScript.ps1 märgistamisel välise allika all järgmist käsku:

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

See määrab MyScript.ps1 jaoks alternatiivse andmevoo Zone. Identifier, nii et Windows arvab, et fail pärineb Internetist. Seda saab hõlpsasti ümber pöörata järgmise käsuga:

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

2. samm: käivitamine ExecutionPolicy.

Objekti ExecutionPolicy käivitamine CMD-st või partitsüklist on tegelikult päris lihtne. Me lihtsalt redigeerime skripti teist rida, et lisada PowerShell.exe käsule veel üks parameeter.

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

Parameetrit -ExecutionPolicy saab kasutada ExecutionPolicy'i muutmiseks, mida kasutatakse uue PowerShelli seansi genereerimisel. See ei kesta ka pärast selle seanssi, seega võime PowerShelli käivitada niimoodi, kui me vajame, ilma et nõrgendaks süsteemi üldist julgeolekupositsiooni. Nüüd, kui oleme seda fikseerinud, laskume veel minna:

Nüüd, kui skript on korralikult üles ehitatud, näeme, mida see tegelikult teeb. See annab meile teada, et skript käitame piiratud kasutajatena. Skripti juhib tegelikult administraatori õigustega konto, kuid kasutajakonto kontroll jõuab sisse. Kuigi üksikasjad selle kohta, kuidas skript kontrollib administraatori juurdepääsu, ei kuulu käesoleva artikli kohaldamisalasse, on siin demonstratsiooniks kasutatav kood:

kui( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent() IsInRole( [Security. Principal. WindowsBuiltInRole] "Administrator")){ Kirjuta-väljund käivitub kui administraator!} Else{ Write-Output 'Running Limited!'} Pause

Samuti võite märkida, et seal on kaksSkriiniväljundi "Pause" toimingud - üks PowerShelli skriptist ja üks partiifailist. Selle põhjuseks on järgmine etapp.

3. samm: administraatori juurdepääsu saamine.

Kui teie skript ei käivitu suvalist käsku, mis vajab kõrgust, ja olete üsna kindel, et te ei pea muretsema kellegi kohandatud profiilide pärast, võite ülejäänud osa sellest vahele jätta. Kui kasutate mõnda administraatori tasemel cmdletti, vajate seda tüki.

Kahjuks pole mingit võimalust UAC-i tõusuks käivitada pakkfaili või CMD seansi jooksul. Kuid PowerShell lubab meil seda teha Start-protsessiga. Kui seda kasutatakse argumentidega "-Verb RunAs", siis hakkab Start-Process käivitama rakenduse koos administraatori õigustega. Kui PowerShelli seanss ei ole juba kõrgendatud, käivitab see UAC-i kiire. Selle skripti käivitamiseks partiifaili kasutamiseks võime lõpuks kummutada kaks PowerShelli protsessi - üks käivitada Start-Process ja teine ​​käivitada Start-Process, et skript käivitada. Partiifaili teine ​​rida tuleb muuta järgmiselt:

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

Kui partiifail käivitatakse, näeme väljundi esimest rida PowerShelli profiiliskriptist. Siis ilmub UAC-i kiire, kui Start-Process üritab käivitada MyScript.ps1.

Pärast UAC-i kiirelt klõpsamist ilmub uus PowerShelli eksemplar. Kuna see on uus asi, näeme me muidugi profiili skripti märguannet. Seejärel käivitatakse MyScript.ps1 ja me näeme, et oleme tõesti kõrgendatud seansis.

Ja seal on ka põhjus, et meil on ka kaks pausid siin. Kui mitte PowerShelli skripti puhul, siis me ei näe kunagi skripti väljundit - PowerShelli aken hakkab lihtsalt pop-up ja kaob kohe, kui skript töötab. Ja ilma pakettaknadeta pausi, ei oleks meil võimalik esmalt näha PowerShelli käivitamisel mingeid vigu.

4. samm: kohandatud PowerShelli profiilid.

Let's vabaneda sellest vastik kohandatud profiili teade nüüd, kas me? Siin on see peaaegu isegi ebameeldiv, kuid kui kasutaja PowerShelli profiil muudab vaikimisi seadeid, muutujaid või funktsioone viisil, mida te ei pruugi oma skriptiga ennustada, võivad need olla tõeliselt tülikad. Lihtsam on skripti käitamine ilma profiilita täielikult, nii et te ei pea seda muretsema. Selleks peame lihtsalt partiifaili teist rida veel kord muutma:

PowerShell.exe -NoProfile -Command "& & Start;% ~ dpn0.ps1 "" '-Verb RunAs} "

Parameeter -NoProfile lisamine skripti käivitatud mõlema PowerShelli eksemplari korral tähendab, et kasutaja profiiliskript on mõlemas etapis täielikult mööda ja meie PowerShell-skript käivitataksesuhteliselt prognoositav vaikimisi loodud keskkond. Siin näete, et kummagi keretatud kestadelt pole kohandatud profiiliteavet.

Kui te ei vaja PowerShelli skripti administraatori õigusi ja olete vahele jätnud 3. sammu, võite teha ilma teise PowerShelli eksemplari ning teie partifaili teine ​​rida peaks välja nägema:

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

Väljund näeb välja selliselt:

( Muidugi, mitte-administraatori skriptidel võite ilma PowerShelli skriptiga töötada ilma sulgemisetaka selles osas, sest kõik on salvestatud samas konsooliaknas ja seda hoitakse seeläbi paarist partii faili lõpus.)

Lõpetatud partiifailid.

Sõltuvalt sellest, kas teie PowerShelli skripti jaoks on vaja administraatori õigusi( ja te ei tohiks neid päringuid taotleda, kui te seda ei tee), peaks viimane partitsioonifail olema alltoodud kahest allpool.

Ilma administraatori juurdepääsuta:

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

Juurdepääs administraatorile:

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

Ärge unustage panna partitsioonifaili samas kaustas PowerShelli skripti, mida sooviteseda kasutada ja andma sama nime. Siis, olenemata sellest, millises süsteemis neid faile kasutate, saate oma PowerShelli skripti käivitada, ilma et peaksite üheski süsteemis turvaseadistustest loobuma. Saate kindlasti neid muudatusi igal ajal käsitsi teha, kuid see säästab sind, et probleeme ja te ei pea muretsema muutuste tagasipööramise pärast hiljem.

Viited:

  • PowerShelli skriptid käivitatakse partifailist - Daniel Schroeder'i programmeerimiskeel
  • PowerShellis administraatoriõiguste kontrollimine - Hei, skriptikujutt! Blog