9Sep
Useista syistä useimmiten turvallisuuteen liittyvät PowerShell-komentosarjat eivät ole yhtä helposti siirrettävissä ja käyttökelpoisia kuin komentosarjat voivat olla. Voimme kuitenkin yhdistää eräkäsikirjoituksen PowerShell-skripteihimme näiden ongelmien ratkaisemiseksi. Tässä näytämme muutamia näistä ongelma-alueista ja miten luodaan eräkäsikirjoitus.
Miksi en voi kopioida. PS1-tiedostoa toiselle tietokoneelle ja käyttää sitä?
Ellei kohdejärjestelmää ole ennalta konfiguroitu sallimaan mielivaltaisten komentosarjojen suorittaminen, vaaditut oikeudet ja oikeat asetukset, on mahdollista, että yrität tehdä tämän ongelmat.
- PowerShell ei ole liitetty. PS1-tiedostopäätteeseen oletuksena.
Toimme tämän aluksi PowerShell Geek School -sarjassa. Windows yhdistää. PS1-tiedostot muistioon oletuksena, sen sijaan, että ne lähetettäisiin PowerShell-komentotulkkeihin. Tämä estää vahingollisten komentojen tekemisen vahingossa kaksoisnapsauttamalla niitä.On olemassa tapoja, joilla voit muuttaa tätä käyttäytymistä, mutta se ei todennäköisesti ole jotain, jota haluat tehdä jokaisella tietokoneella, jota kuljetat komentosarjoissasi - varsinkin jos jotkut näistä tietokoneista eivät ole omia. - PowerShell ei salli ulkoisten komentojen suorittamista oletusarvoisesti.
PowerShellin ExecutionPolicy-asetus estää ulkoisten skriptien suorittamisen oletusarvoisesti kaikissa Windows-versioissa. Joissakin Windows-versioissa oletusarvo ei salli komentojen suorittamista ollenkaan. Näytimme, kuinka voit muuttaa tätä asetusta Windows 7: n PowerShell-komentotiedostojen suorittamisen sallimisesta. Tämä on kuitenkin myös jotain, jota et halua tehdä missään tietokoneessa. - Jotkin PowerShell-komentosarjat eivät toimi ilman järjestelmänvalvojan oikeuksia.
Jopa käynnissä järjestelmänvalvojatason käyttäjätilillä, sinun on silti välitettävä Käyttäjätilien valvonta( UAC) tiettyjen toimintojen suorittamiseksi. Emme halua poistaa tätä käytöstä, mutta se on silti mukavaa, kun voimme helpommin käsitellä sitä. - Jotkin käyttäjät saattavat olla räätälöityjä PowerShell-ympäristöjä.
Luultavasti ei pääse tähän usein, mutta kun teet sen, se voi tehdä komentosarjojen suorittamisen ja vianetsinnän hieman turhauttavaa. Onneksi voimme kiertää tätä tekemättä pysyviä muutoksia.
Vaihe 1: Kaksoisnapsauta suoritusta.
Aloitetaan käsittelemällä ensimmäinen ongelma -. PS1-tiedostoyhdistelmät. Et voi kaksoisnapsauttaa suorittamaan. PS1-tiedostoja, mutta voit suorittaa. BAT-tiedoston tällä tavalla. Joten kirjoitamme erätiedoston soittamalla PowerShell-komentosarjasta komentoriviltä meille.
Joten meidän ei tarvitse kirjoittaa uudelleen komentojonotiedostoa joka kerta, tai aina, kun siirrämme komentosarjan, se käyttää itseään viittaavaa muuttujaa PowerShell-komentosarjan tiedostopolun rakentamiseksi. Tämän työn tekemiseksi erätiedosto on sijoitettava samaan kansioon kuin PowerShell-skripti ja sillä on sama tiedostonimi. Joten jos PowerShell-skripti on nimeltään "MyScript.ps1", sinun on nimettävä erätiedosto "MyScript.bat" ja varmista, että se on samassa kansiossa. Aseta nämä rivit eräkäsikirjaan:
@ECHO OFF PowerShell.exe -yhteys "& '% ~ dpn0.ps1'" PAUSEJos muita suojausrajoituksia ei olisi, se olisi todella kaikkise vaatii PowerShell-komentosarjan suorittamisen erätiedostosta. Itse asiassa ensimmäiset ja viimeiset rivit ovat lähinnä vain etusijalla - se on toinen rivi, joka todella tekee työtä.Tässä on erittely:
@ECHO POIS kytkee komennon pois käytöstä.Tämä vain pitää muiden komentoja näyttämästä näytöllä, kun erätiedosto suoritetaan. Tämä rivi itsessään on piilotettu sen edessä olevan at( @) -merkin avulla.
PowerShell.exe -yhteys "&'% ~ Dpn0.ps1' " tosiasiassa suorittaa PowerShell-komentosarjan. PowerShell.exe voidaan luonnollisesti kutsua mistä tahansa CMD-ikkunasta tai erätiedostosta, jotta PowerShell voidaan käynnistää tavalliseen paljaaseen konsoliin. Voit myös käyttää sitä suorittamaan komentoja suoraan erätiedostosta, mukaan lukien -Command-parametri ja sopivat argumentit. Tapa, jolla tätä käytetään. PS1-tiedoston kohdistamiseen, on erityisellä% ~ dpn0 -muuttujalla. Suorita erätiedostosta,% ~ dpn0 arvioi komentotiedoston, kansion polun ja tiedostonimen( ilman laajennusta).Koska erätiedosto ja PowerShell-komentosarja ovat samassa kansiossa ja niillä on sama nimi,% ~ dpn0.ps1 kääntää PowerShell-komentosarjan koko tiedostopolulle.
PAUSE vain keskeyttää erän suorittamisen ja odottaa käyttäjän syöttöä.Tämä on yleensä hyödyllistä, jotta sinulla on erätiedostojen lopussa niin, että sinulla on mahdollisuus tarkastella komentoja, ennen kuin ikkuna katoaa. Kun käymme läpi kunkin vaiheen testaus, sen hyödyllisyys tulee ilmeisemmäksi.
Joten, perus-erätiedosto on määritetty. Näyttötarkoituksiin tämä tiedosto tallennetaan nimellä "D: \ Script Lab \ MyScript.bat" ja samassa kansassa on "MyScript.ps1".Katsotaan, mitä tapahtuu, kun kaksoisnapsautamme MyScript.bat.
Ilmeisesti PowerShell-komentosarja ei käynnistynyt, mutta se on odotettavissa - olemme käsitelleet vain ensimmäisiä neljää ongelmaa. Tässä on kuitenkin joitain tärkeitä bittejä:
- Ikkunan otsikko osoittaa, että komentosarja käynnisti PowerShellin.
- Ensimmäinen lähtölinja osoittaa, että käytössä on mukautettu PowerShell-profiili. Tämä on mahdollinen ongelma # 4, joka on yllä lueteltu.
- Virheilmoitus osoittaa, että ExecutionPolicy-rajoitukset ovat voimassa. Tämä on meidän ongelmamme # 2.
- Virheilmoituksen alleviivattu osa( joka tehdään luonnollisesti PowerShellin virheilmoituksella) osoittaa, että komentosarja käsitteli oikein tarkoitettua PowerShell-skriptiä( D: \ Script Lab \ MyScript.ps1).Joten ainakin tiedämme, että paljon toimii oikein.
Tässä tapauksessa profiili on yksinkertainen yhden rivin käsikirjoitus, jota käytetään tässä demonstraatiossa tuottaa tuotos aina, kun profiili on aktiivinen. Voit myös muokata oman PowerShell-profiilisi, jos haluat testata näitä skriptejä itse. Lisää vain seuraava rivi profiilikriptille:
Write-Output "Custom PowerShell -profiili on voimassa!"Testijärjestelmän ExecutionPolicy on asetettu RemoteSignediin. Tämä mahdollistaa paikallisesti luotujen komentosarjojen( kuten profiilikirjoituksen) suorittamisen estäen komentosarjoja ulkoisista lähteistä, elleivät ne ole luotetun viranomaisen allekirjoittamia. Demonstraatiotarkoituksiin käytettiin seuraavaa komentoa merkitsemään MyScript.ps1: n ulkoisesta lähteestä:
Add-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Value "[ZoneTransfer]` nZoneId = 3 "-Stream "Zone. Identifier"Tämä asettaa Zone. Identifier vaihtoehtoisen tietovirran MyScript.ps1-tiedostoon, jotta Windows ajattelisi, että tiedosto on peräisin Internetistä.Se voidaan helposti kääntää seuraavalla komennolla:
Clear-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Stream 'Zone. Identifier'Vaihe 2: Getting around ExecutionPolicy.
ExecutionPolicy-asetusten tekeminen CMD: stä tai eräkirjoitusohjelmasta on todella melko helppoa. Muokkaamme komentorivin toista riviä lisäämällä vielä yksi parametri PowerShell.exe-komentoon.
PowerShell.exe -ExecutionPolicy Bypass -komento "& '% dpn0.ps1'"-ExecutionPolicy-parametria voidaan käyttää muokkaamaan ExecutionPolicy-ohjelmaa, jota käytetään, kun haetaan uusi PowerShell-istunto. Tämä ei kestä tätä istuntoa, joten voimme käyttää PowerShellia tällä tavoin aina, kun tarvitsemme heikentämättä järjestelmän yleistä turvallisuusasentoa. Nyt, kun olemme korjattaneet tämän, anna toinen mennä siihen:
Nyt, kun käsikirjoitus on suoritettu kunnolla, voimme nähdä, mitä se todellisuudessa tekee. Se kertoo meille, että käytämme komentosarjaa rajoitetuksi käyttäjäksi. Skriptiä tosiasiassa hallinnoi tiliä, jolla on järjestelmänvalvojan oikeudet, mutta Käyttäjätilien valvonta on alkanut. Vaikka yksityiskohdat siitä, miten komentosarja tarkistaa järjestelmänvalvojan käyttöoikeuden, ovat tämän artikkelin soveltamisalan ulkopuolella, tässä on koodi, jota käytetään esittelyssä:
if( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: GetCurrent() .) IsInRole({ Security. Principal. WindowsBuiltInRole] "Administrator")){ Write-Output "Running as Administrator!"} Else{ Write-Output 'Running Limited!'} KeskeytäHuomaat myös, että nyt on kaksi"Tauko" -toiminnot komentotiedostossa - yksi PowerShell-komentotiedostosta ja yksi erätiedostosta. Tämän syy on selvempi seuraavassa vaiheessa.
Vaihe 3: Pääsy järjestelmänvalvojan käyttöön.
Jos komentosarjassa ei näytetä komentoja, jotka vaativat korkeutta, ja olet melko varma, että sinun ei tarvitse huolehtia siitä, että kenenkään muokatut profiilit tulevat matkalla, voit ohittaa loput tästä.Jos käytät kuitenkin joitain järjestelmänvalvojan tason cmdlettejä, tarvitset tämän kappaleen.
Valitettavasti ei ole mitään keinoa käynnistää UAC-arvoa eräkohtaisesti tai CMD-istunnossa. PowerShellin avulla voimme kuitenkin tehdä tämän Start-Processin avulla. Kun käytetään argumentteja "-Verb RunAs", Start-Process yrittää käynnistää sovelluksen, jolla on järjestelmänvalvojan oikeudet. Jos PowerShell-istuntoa ei ole vielä korotettu, tämä käynnistää UAC-kehotteen. Jotta voisit käyttää tätä komentosarjatiedostosta komentojonon käynnistämiseen, päädyimme kutsumaan kaksi PowerShell -prosessia - yhden käynnistämään Start-Processin ja toisen Start-Processin käynnistämän, käynnistämään komentosarjan. Erätiedoston toista riviä on muutettava tähän:
PowerShell.exe Command "&{ Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "-VerbRunAs} "Kun erätiedosto ajetaan, ensimmäinen lähdön rivi näkyy PowerShell-profiilikirjoituksesta. Tällöin tulee UAC-kehote, kun Start-Process yrittää käynnistää MyScript.ps1.
Kun napsautat UAC-kehotteen läpi, uusi PowerShell-esiintymä kutemaan. Koska tämä on uusi tapaus, tietenkin katsomme uudelleen profiilitiedostoilmoituksen. Sitten MyScript.ps1 toimii ja näemme, että olemme todellakin korotetussa istunnossa.
Ja syy siihen, että meillä on myös kaksi taukoa. Ellei PowerShell-komentosarjalle löydy, emme koskaan nähneet komentojonon tuottoa - PowerShell-ikkuna avautuu ja katoaa heti, kun komentosarja on käynnissä.Ja ilman erätiedostoa, emme pysty näkemään, onko PowerShellin käynnistämisessä tapahtunut virheitä.
Vaihe 4: Suoritetut PowerShell-profiilit.
Let's päästä eroon tästä ikävästä profiiliprofiilista nyt, tuleeko me? Täällä ei ole tuskin haittaa, mutta jos käyttäjän PowerShell-profiili muuttaa oletusasetuksia, muuttujia tai toimintoja tavalla, jota et ehkä ole ennakoinut käsikirjoituksesi kanssa, ne voivat olla todella hankalia. Komentojonoa on paljon yksinkertaisempi ilman profiilia kokonaan, joten sinun ei tarvitse huolehtia tästä.Tätä varten meidän on vain muutettava erätiedoston toinen rivi:
PowerShell.exe -Profiili-komento "&{ {Start-Process PowerShell.exe -ArgumentList" -Profiili -ExecutionPolicy Bypass -File ""% ~ dpn0.ps1 "" '-Verb RunAs} "Parametrin NooProfile-parametrin lisääminen molempiin PowerShell-ohjelman komentosarjan käynnissä oleviin tapauksiin tarkoittaa, että käyttäjän profiilikirjaa ohitetaan täydellisesti molemmissa vaiheissa ja PowerShell-komentosarjamme ajetaanmelko ennakoitavissa oleva oletusympäristö.Täältä näet, ettei kummassakin kumartuessa ole mitään muokattua profiililomaketta.
Jos et tarvitse järjestelmänvalvojan oikeuksia PowerShell-komentosarjoissasi, ja olet ohittanut vaiheen 3, voit tehdä ilman toista PowerShell -esimerkkiä ja erätiedoston toisella rivillä pitäisi näyttää tältä:
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -komento "&" '% dpn0.ps1' "Tulostus näyttää näin:
( Tietenkin ei-ylläpitäjän komentotiedostoille, voit tehdä ilman skriptin keskeytystä PowerShell-komentosarjassamyös tässä vaiheessa, koska kaikki on kaapattu samassa konsoli-ikkunassa ja siellä pidetään siellä tauon jälkeen erätiedoston lopussa.)
Valmis erätiedostoja.
Riippuen siitä, tarvitsetko PowerShell-komentosarjan järjestelmänvalvojan oikeuksia( ja et todellakaan saisi pyytää niitä, jos et), lopullinen erätiedosto pitäisi näyttää yhdeltä seuraavasta.
ilman järjestelmänvalvojan käyttöoikeutta:
@ECHO OFF PowerShell.exe -Profiili -ExecutionPolicy-ohitustyökalu "& '% ~ dpn0.ps1'" PAUSEAdmin-yhteys:
@ECHO OFF PowerShell.exe -NoProfile-Command "&{Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""% ~ dpn0.ps1 ""' -Verb RunAs} "PAUSEMuista laittaa komentotiedosto samaan kansioon kuin haluamasi PowerShell-komentosarjakäyttää sitä ja antaa sille sama nimi. Sitten, riippumatta siitä, mitä järjestelmää otat nämä tiedostot, voit käyttää PowerShell-komentosarjaa ilman, että tarvitset turvautua järjestelmän suojausasetuksiin. Voit tehdä nämä muutokset manuaalisesti joka kerta, mutta tämä säästää sinua vaivaa ja sinun ei tarvitse huolehtia siitä, että muutokset palautetaan myöhemmin.
Viitteet:
- Running PowerShell-komentosarjat erätiedostosta - Daniel Schroederin ohjelmointiblogi
- PowerShellin järjestelmänvalvojan käyttöoikeuksien tarkistaminen - Hei, komentosarjan ohjaaja! Blog