If-Koubou

Eräs-tiedoston käyttäminen PowerShell-komentojonojen tekemiseen helpommin suoritettavaksi

Eräs-tiedoston käyttäminen PowerShell-komentojonojen tekemiseen helpommin suoritettavaksi (Miten)

Useista syistä, lähinnä turvallisuuteen liittyvistä PowerShell-komentosarjoista ei ole yhtä helposti kannettavaa ja käyttökelpoista 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 komentojonojen suorittaminen, vaaditut käyttöoikeudet ja oikeat asetukset, on mahdollista, että yrität tehdä tämän ongelmat.

  1. PowerShell ei ole liitetty .PS1-tiedostopäätteeseen oletuksena.
    Tuomasimme 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 omaa.
  2. PowerShell ei salli ulkoisten komentojen suorittamista oletuksena.
    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.
  3. Jotkut PowerShell-komentosarjat eivät toimi ilman järjestelmänvalvojan oikeuksia.
    Jopa käynnissä olevan järjestelmänvalvojatason tilin kanssa, sinun on silti ajettava käyttäjän tilien valvonnassa (UAC) tiettyjen toimintojen suorittamiseen. Emme halua poistaa tätä käytöstä, mutta se on silti mukavaa, kun voimme helpommin käsitellä sitä.
  4. Joillakin käyttäjillä saattaa olla räätälöityjä PowerShell-ympäristöjä.
    Sinun ei todennäköisesti tule käsiksi tähän usein, mutta kun teet sen, se voi tehdä komentosarjojen suorittamisen ja vianmäärityksen 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 rakentamiseen. 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ä batch-tiedosto "MyScript.bat" ja varmista, että se on samassa kansiossa. Aseta sitten nämä rivit komentojonoon:

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

Jos muita suojausrajoituksia ei olisi, olisi totta, että voisimme suorittaa PowerShell-komentosarjan 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:

@ ECO POIS sammuu komento kaiku. 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 -komento "&"% ~ dpn0.ps1 '" itse asiassa suoritetaan PowerShell-skripti. 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 kansioon ja niillä on sama nimi,% ~ dpn0.ps1 kääntää PowerShell-komentosarjan koko tiedostopolulle.

TAUKO vain keskeyttää erän suorituksen 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 perusasioiden 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.

Tietenkin PowerShell-skripti ei ole käynnissä, mutta se on odotettavissa - olemme käsitelleet vain ensimmäisiä neljää ongelmaa. Tässä on kuitenkin joitain tärkeitä bittejä:

  1. Ikkunan otsikko osoittaa, että komentosarja käynnisti PowerShellin.
  2. Ensimmäinen lähtölinja osoittaa, että käytössä on oma PowerShell-profiili. Tämä on mahdollinen ongelma # 4, joka on yllä lueteltu.
  3. Virheilmoitus osoittaa ExecutionPolicy-rajoitukset voimassa. Tämä on meidän ongelmamme # 2.
  4. 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.

Profiili on tässä tapauksessa yksinkertainen yhden rivin käsikirjoitus, jota käytetään tässä esittelyssä tuottamaan 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-asetukseksi asetetaan RemoteSigned. Tämä mahdollistaa paikallisesti luotujen komentosarjojen (kuten profiilikirjoituksen) suorittamisen estäen komentosarjoja ulkoisista lähteistä, elleivät ne ole luotetun viranomaisen allekirjoittamia. Näyttötarkoituksiin 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 varajäsenen datavirran MyScript.ps1: lle, 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: SuorittaminenPolicy.

ExecutionPolicy-asetusten muuttaminen 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 vahvistaneet tämän, anna toinen mennä siihen:

Nyt, kun käsikirjoitus on suoritettu oikein, voimme nähdä, mitä se itse asiassa 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ä:

jos (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "Järjestelmänvalvoja")) Write-Output "Running as Administrator! Write-Output 'Running Limited!' Pysäytä

Huomaat myös, että komentosarjatiedostossa on nyt kaksi "keskeytys" -toimintoa - yksi PowerShell-komentosarjasta ja yksi erätiedostosta. Tämän syy on selvempi seuraavassa vaiheessa.

Vaihe 3: Järjestelmänvalvojan käyttöoikeudet.

Jos komentosarjassa ei ole käynnissä 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äkohtaisen tiedoston tai CMD-istunnon sisällä. 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 -komento "ja Käynnistä-prosessi PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verb RunAs"

Kun erätiedosto on suoritettu, ensimmäinen lähdevalikoima, jonka näemme, on 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ä kutistuu. 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.

Päästäkäämme eroon tästä ikävästä profiiliprofiilista nyt, vai mitä? 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 toista riviä vielä kerran:

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

Parametrin NooProfile-parametrin lisääminen molempiin PowerShell-sovelluksiin, jotka käynnistää komentosarja, tarkoittaa, että käyttäjän profiilin komentosarja ohitetaan täydellisesti molemmissa vaiheissa ja PowerShell-komentosarja toimii melko ennustettavissa olevassa oletusympäristössä. Täältä näet, ettei kummassakin kumartuessa ole mitään muokattua profiililomaketta.

Jos PowerShell-komentosarjasta ei tarvita järjestelmänvalvojan oikeuksia, 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 '"

Tuloste näyttää näin:

(Tietenkin, ei-ylläpitäjä-komentosarjoissa, voit tehdä myös ilman script -työkalun keskeytystä PowerShell-komentosarjassa tässä vaiheessa, koska kaikki on kaapattu samassa konsoli-ikkunassa ja siellä pidetään siellä tauon lopussa erätiedosto joka tapauksessa.)

Valmistuneet erätiedostot.

Riippuen siitä, tarvitsetko PowerShell-komentosarjan järjestelmänvalvojan oikeuksia (ja et todellakaan saisi pyytää niitä, jos et), lopullisen komentotiedoston pitäisi näyttää yhdeltä seuraavasta.

Ilman järjestelmänvalvojan käyttöoikeutta:

@Heo POIS PowerShell.exe -Profiili -ExecutionPolicy-ohituksen -Komento "&"% ~ dpn0.ps1 '"PAUSE

Järjestelmänvalvojan käyttöoikeus:

@Eco OFF "PowerShell.exe -Profiili-komento" & Start-Prosessi PowerShell.exe -ArgumentList "-Profiili -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "-Verb RunAs" PAUSE

Muista asettaa erätiedosto samaan kansioon kuin PowerShell-komentosarja, jota haluat käyttää, ja anna sille sama nimi. Sitten, riippumatta siitä, mitä järjestelmää otat nämä tiedostot, voit käyttää PowerShell-komentosarjaa ilman, että tarvitset mitään systeemien suojausasetuksia. 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 ohjelmointikirja
  • PowerShellin järjestelmänvalvojan käyttöoikeuksien tarkistaminen - Hei, komentosarja! blogi