Kotisivu » miten » Erätiedoston käyttäminen PowerShell-komentosarjojen helpottamiseksi

    Erätiedoston käyttäminen PowerShell-komentosarjojen helpottamiseksi

    Useista syistä, lähinnä tietoturvaan liittyvistä, PowerShell-skriptit eivät ole yhtä helposti kannettavia ja käyttökelpoisia eräskripteinä. Voimme kuitenkin yhdistää erän käsikirjoituksen PowerShell-skripteihimme, jotta voimme käsitellä näitä ongelmia. Täällä näytämme sinulle muutamia näistä ongelmista ja miten rakentaa eräskriptiä niiden ympärille.

    Miksi en voi vain kopioida .PS1-tiedostoa toiseen tietokoneeseen ja käyttää sitä?

    Ellei kohdejärjestelmää ole ennalta määritetty sallimaan mielivaltaisten komentosarjojen suorittamista, ja vaaditut oikeudet, ja käyttämällä oikeita asetuksia, olet todennäköisesti joutumassa ongelmiin, kun yrität tehdä tämän.

    1. PowerShell ei ole oletusarvoisesti liitetty .PS1-tiedostotunnisteeseen.
      Esittimme tämän aluksi PowerShell Geek School -sarjassa. Windows yhdistää .PS1-tiedostot Notepadiin oletusarvoisesti sen sijaan, että ne lähetettäisiin PowerShell-komentojen tulkkiin. Näin estetään vahingossa tapahtuvien komentosarjojen tahaton suorittaminen yksinkertaisesti kaksoisnapsauttamalla niitä. On olemassa tapoja, joilla voit muuttaa tätä käyttäytymistä, mutta se ei luultavasti ole sellainen, mitä haluat tehdä jokaisessa tietokoneessa, jossa skriptejä on, etenkin jos jotkin näistä tietokoneista eivät ole omia.
    2. PowerShell ei salli ulkoisen komentosarjan suorittamista oletusarvoisesti.
      PowerShellin ExecutionPolicy-asetus estää ulkoisten komentosarjojen suorittamisen oletuksena kaikissa Windows-versioissa. Joissakin Windows-versioissa oletus ei salli komentosarjan suorittamista ollenkaan. Näytimme, miten voit muuttaa tätä asetusta kohdassa PowerShell-komentosarjojen suorittamisen salliminen Windows 7 -käyttöjärjestelmässä..
    3. Jotkut PowerShell-skriptit eivät toimi ilman järjestelmänvalvojan oikeuksia.
      Jopa silloin, kun käytät järjestelmänvalvojatason tiliä, sinun täytyy silti käydä läpi User Account Control (UAC), jotta voit suorittaa tiettyjä toimintoja. Emme halua poistaa tätä käytöstä, mutta se on silti mukavaa, kun voimme tehdä siitä hieman helpompaa käsitellä.
    4. Joillakin käyttäjillä voi olla mukautettuja PowerShell-ympäristöjä.
      Et todennäköisesti pääse tähän usein, mutta kun teet sen, se voi tehdä skripteistäsi hieman hämmentävää. Onneksi voimme kiertää tämän ilman pysyviä muutoksia.

    Vaihe 1: Kaksoisnapsauta.

    Aloitetaan käsittelemällä ensimmäinen ongelma - .PS1-tiedostoyhdistelmät. Et voi kaksoisnapsauttaa .PS1-tiedostoja, mutta voit suorittaa .BAT-tiedoston tällä tavalla. Niinpä kirjoitamme erätiedoston, jotta voimme kutsua PowerShell-komentosarjan komentoriviltä meille.

    Joten meidän ei tarvitse kirjoittaa uudelleen jokaisen komentosarjan erätiedostoa, tai joka kerta, kun siirrämme komentosarjaa, se käyttää itsesuuntaavaa muuttujaa rakentaaksesi PowerShell-komentosarjan tiedoston polun. Jotta tämä työ tehtäisiin, erätiedosto on sijoitettava samaan kansioon kuin PowerShell-skripti ja niillä on sama tiedostonimi. Jos PowerShell-skriptiä kutsutaan nimellä "MyScript.ps1", sinun kannattaa nimetä erätiedosto "MyScript.bat" ja varmista, että se on samassa kansiossa. Aseta sitten nämä rivit eräskriptiin:

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

    Jos se ei olisi ollut muiden turvallisuusrajoitteiden takia, se olisi todella tarpeellinen PowerShell-komentosarjan suorittamiseksi erätiedostosta. Itse asiassa ensimmäinen ja viimeinen rivi ovat lähinnä vain etusijalla - se on toinen rivi, joka todella tekee työn. Tässä erittely:

    @ECHO OFF katkaisee komennon kaiun. Tämä pitää vain muut komennot näytössä, kun erätiedosto on käynnissä. Tämä viiva on piilotettu sen edessä olevan symbolin (@) avulla.

    PowerShell.exe -Command “& '% ~ dpn0.ps1'” todella käyttää PowerShell-komentosarjaa. PowerShell.exe voidaan tietysti kutsua mistä tahansa CMD-ikkunasta tai erätiedostosta käynnistämään PowerShell tavalliseen tapaan paljaalle konsolille. Voit käyttää sitä myös komentojen suorittamiseen suoraan erätiedostosta sisällyttämällä -Command-parametrin ja sopivat argumentit. Tapa, jolla sitä käytetään .PS1-tiedoston kohdentamiseen, on erityinen% ~ dpn0 -muuttaja. Suorita erätiedostosta,% ~ dpn0 arvioi taajuusmuuttajan kirjaimen, kansion polun ja tiedoston nimen (ilman laajennusta). Koska erätiedosto ja PowerShell-skripti ovat samassa kansiossa ja niillä on sama nimi,% ~ dpn0.ps1 kääntää PowerShell-komentosarjan koko tiedoston polun.

    TAUKO vain keskeyttää erän suorittamisen ja odottaa käyttäjän syöttämistä. Tämä on yleensä hyödyllistä erätiedostojen lopussa, joten sinulla on mahdollisuus tarkastella mitä tahansa komennon ulostuloa ennen kuin ikkuna katoaa. Kun käymme läpi jokaisen vaiheen testauksen, tämän hyödyllisyys tulee ilmeisemmäksi.

    Niinpä perusasetustiedosto on asetettu. Esittelyä varten tämä tiedosto tallennetaan nimellä "D: Komentolaboratorio MyScript.bat" ja samassa kansiossa on "MyScript.ps1". Katsotaan, mitä tapahtuu, kun kaksoisnapsautamme MyScript.bat-tiedostoa.

    On selvää, että PowerShell-skripti ei käynnistynyt, mutta se on odotettavissa - olemme käsitelleet vain ensimmäistä neljästä ongelmastamme. Tässä on kuitenkin joitakin tärkeitä bittejä:

    1. Ikkunan otsikko osoittaa, että eräskripti käynnisti PowerShellin.
    2. Ensimmäinen lähdön rivi osoittaa, että mukautettu PowerShell-profiili on käytössä. Tämä on edellä mainittu ongelma # 4.
    3. Virhesanoma osoittaa voimassa olevat rajoitukset. Tämä on ongelma # 2.
    4. Virheilmoituksen alleviivattu osa (joka tehdään luonnollisesti PowerShellin virhesignaalin avulla) osoittaa, että eräskripti on kohdistettu oikein suunnitellulle PowerShell-komentosarjalle (D: komentosarja LabScript.ps1). Joten ainakin tiedämme, että paljon toimii oikein.

    Tällöin profiili on yksinkertainen yhden rivin komentosarja, jota käytetään tässä esittelyssä tuotoksen tuottamiseksi aina, kun profiili on aktiivinen. Voit myös mukauttaa omaa PowerShell-profiiliasi, jos haluat testata näitä skriptejä itse. Lisää vain seuraava rivi profiilisi skriptiin:

    Kirjoitustulostus "Mukautettu PowerShell-profiili käytössä!"

    Tässä testijärjestelmän ExecutionPolicy-asetukseksi on asetettu RemoteSigned. Tämä sallii paikallisesti luotujen komentosarjojen suorittamisen (kuten profiilikomentosarjan), mutta sallii ulkopuolisten lähteiden skriptit, ellei luotettu viranomainen ole allekirjoittanut niitä. Esittelyä varten seuraavaa komentoa käytettiin MyScript.ps1: n merkitsemiseksi ulkoisesta lähteestä:

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

    Tämä asettaa Zone.Identifier-vaihtoehtoisen datavirran MyScript.ps1: hen niin, että Windows ajattelee, että tiedosto tuli Internetistä. Se voidaan kääntää helposti seuraavalla komennolla:

    Clear-Content -Path D: Komentolaboratorio MyScript.ps1 '-Stream' Zone.Identifier '

    Vaihe 2: ToteuttaminenPolitiikka.

    ExecutionPolicy-asetusten liikkuminen CMD: stä tai eräskriptistä on todella helppoa. Muutamme vain toisen komentosarjan rivin lisäämällä yhden parametrin PowerShell.exe-komentoon.

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

    -ExecutionPolicy-parametria voidaan käyttää muokkaamaan ExecutionPolicy-ohjelmaa, jota käytetään, kun synnytät uuden PowerShell-istunnon. Tämä ei jatku tämän istunnon jälkeen, joten voimme suorittaa PowerShellin näin aina, kun tarvitsemme heikentämättä järjestelmän yleistä turvallisuusasentoa. Nyt, kun olemme vahvistaneet sen, otamme toisen mennä siihen:

    Nyt kun komentosarja on suoritettu oikein, voimme nähdä, mitä se todella tekee. Tiedämme, että käytämme komentosarjaa rajoitetuksi käyttäjäksi. Skriptiä itse asiassa hallinnoi tili, jossa on järjestelmänvalvojan oikeudet, mutta käyttäjätilien valvonta on käynnissä. Vaikka yksityiskohtaiset tiedot siitä, miten komentosarja tarkistaa järjestelmänvalvojan pääsyn, eivät kuulu tämän artikkelin soveltamisalaan, tässä on esittelyssä käytetty koodi:

    jos (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()) IsInRole ([Security.Principal.WindowsBuiltInRole] "Järjestelmänvalvoja")) Kirjoita-lähtö "Suorita järjestelmänvalvojana!" muu Write-Output 'Running Limited!

    Huomaa myös, että skriptilähdössä on nyt kaksi "tauko" -toimintoa - yksi PowerShell-komentosarjasta ja toinen erätiedostosta. Syynä tähän on selvempi seuraavassa vaiheessa.

    Vaihe 3: Järjestelmänvalvojan pääsyn saaminen.

    Jos skripti ei käytä komentoja, jotka edellyttävät korkeutta, ja olet varma, että sinun ei tarvitse huolehtia kenenkään mukautetuista profiileista, voit ohittaa loput. Jos käytössäsi on kuitenkin joitakin järjestelmänvalvojatason cmdlet-tiedostoja, tarvitset tämän kappaleen.

    Valitettavasti ei ole mahdollista käynnistää UAC: ää korkeudelle erätiedostosta tai CMD-istunnosta. PowerShellin avulla voimme kuitenkin tehdä tämän Start-Processin avulla. Käynnistysprosessi yrittää käynnistää sovelluksen, jossa on järjestelmänvalvojan oikeudet, kun sitä käytetään argumenteissaan. Jos PowerShell-istunto ei ole jo kohonnut, tämä käynnistää UAC-kehotteen. Jotta voisit käyttää tätä erätiedostosta komentosarjan käynnistämiseen, päädymme lopulta kahteen PowerShell-prosessiin, joista yksi käynnistää Start-Processin ja toinen käynnistää Start-Process-ohjelman skriptin suorittamiseksi. Erätiedoston toinen rivi on muutettava tähän:

    PowerShell.exe-komento "& Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verb RunAs"

    Kun erätiedosto on suoritettu, ensimmäinen lähdön rivi, jota näemme, on PowerShell-profiilin komentosarjasta. Sitten tulee UAC-kehote, kun Start-Process yrittää käynnistää MyScript.ps1: n.

    UAC-kehotteen napsauttamisen jälkeen uusi PowerShell-esimerkki kutee. Koska kyseessä on uusi esimerkki, näemme tietenkin profiilin komentosarjan ilmoituksen. Sitten MyScript.ps1 toimii ja näemme, että olemme todella koholla.

    Ja siellä on myös kaksi taukoa täällä. Jos ei PowerShell-komentosarjassa, emme koskaan näkisi komentosarjan lähdön - PowerShell-ikkuna ilmestyy ja katoaa heti, kun komentosarja on suoritettu. Ja ilman erätiedoston taukoa emme pystyisi näkemään, oliko PowerShellin käynnistämisessä virheitä..

    Vaihe 4: Mukautettujen PowerShell-profiilien liikkuminen.

    Let's päästä eroon tästä ikävästä profiilisilmoituksesta nyt, onko meidän? Täällä on tuskin edes häiritsevää, mutta jos käyttäjän PowerShell-profiili muuttaa oletusasetuksia, muuttujia tai toimintoja, joita et ehkä ole ennakoinut käsikirjoituksesi kanssa, ne voivat olla todella hankalia. On paljon helpompaa käyttää komentosarjaa ilman profiilia kokonaan, joten sinun ei tarvitse huolehtia tästä. Tätä varten meidän on vain muutettava erätiedoston toinen rivi vielä kerran:

    PowerShell.exe -NoProfile-komento "& Käynnistä prosessin PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -kuva"% ~ dpn0.ps1 ""' -Verb RunAs "

    -NoProfile-parametrin lisääminen molempiin komentosarjan käynnistämiin PowerShell-tapauksiin tarkoittaa, että käyttäjän profiilikomento ohitetaan kokonaan molemmissa vaiheissa, ja PowerShell-komentosarja toimii melko ennustettavissa olevassa oletusympäristössä. Täällä voit nähdä, että kummassakaan kuolleista kuorista ei ole ilmoitusta.

    Jos et tarvitse järjestelmänvalvojan oikeuksia PowerShell-komentosarjassa, ja olet ohittanut vaiheen 3, voit tehdä toisen PowerShell-esimerkin ilman, että erätiedoston toinen rivi näyttää tältä:

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

    Tulos näyttää näin:

    (Tietysti ei-pääkäyttäjän komentosarjojen tapauksessa voisit tehdä myös ilman lopetusta lopetettua PowerShell-komentosarjaasi tässä vaiheessa, koska kaikki on otettu samaan konsoliikkunaan ja sitä pidetään siellä tauon jälkeen erätiedosto.)

    Valmiit erätiedostot.

    Riippuen siitä, tarvitsetko järjestelmänvalvojan käyttöoikeudet PowerShell-skriptiin (ja sinun ei pidä pyytää niitä, jos et tee sitä), lopullinen erätiedosto näyttää siltä kuin yksi seuraavista kahdesta.

    Ilman Admin-käyttöoikeutta:

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

    Admin-käyttöoikeudet:

    @ECHO OFF PowerShell.exe -NoProfile -Command "& Käynnistysprosessin PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File"% ~ dpn0.ps1 ""' -Verb RunAs "PAUSE

    Muista laittaa erätiedosto samaan kansioon kuin PowerShell-skripti, jota haluat käyttää, ja anna sille sama nimi. Sitten, riippumatta siitä, mitä järjestelmää käytät, voit käyttää PowerShell-komentosarjaasi ilman, että sinun tarvitsee mykistää mitään järjestelmän suojausasetuksista. Voit varmasti tehdä muutoksia manuaalisesti joka kerta, mutta tämä säästää ongelmat ja sinun ei tarvitse huolehtia muutosten palauttamisesta myöhemmin.


    Viitteet:

    • PowerShell-komentosarjojen suorittaminen erätiedostosta - Daniel Schroederin ohjelmointi-blogi
    • Järjestelmänvalvojan käyttöoikeuksien tarkistaminen PowerShellissa - Hei, komentosarjoja! blogi