Szkriptek engedélyezése és indítása

Készítsük is el mindjárt első szkriptünket! Olyan fájlt kell készítenünk, amelynek kiterjesztése ps1, ez a PowerShell szkriptek alapértelmezett kiterjesztése, még a 2.0-ás verziónál is. Egyszerűbb esetben még a Notepadre sincs szükség, létrehozhatjuk a fájl közvetlenül a PowerShellből is:

[1] PS C:\> "'Hurrá! Fut az első szkriptünk.'" | Out-File elso.ps1

Hát ennyi. Látható, hogy nincs szükség túl sok cicomára, amit a parancssorba beírhatnánk, az minden további nélkül jó szkriptnek is. Indítsuk is el gyorsan a szkriptet:

[4] PS C:\> C:\elso.ps1

File C:\elso.ps1 cannot be loaded because the execution of scripts is disabled

 on this system. Please see "get-help about_signing" for more details.

At line:1 char:12

+ C:\elso.ps1 <<<<

    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException

    + FullyQualifiedErrorId : RuntimeException

Hoppá! A PowerShell olyan szkriptkörnyezet, amelyben nem engedélyezett a szkriptek futtatása?! Természetesen ez csak a „secure-by-default” jegyében beállított alapértelmezés, a szkriptekkel szemben tanúsított viselkedést a Set-ExecutionPolicy  cmdlet segítségével szabályozhatjuk az alábbi állapotok közül a megfelelő kiválasztásával:

Paraméter

Hatása

Restricted

Nem engedélyezett semmilyen szkript futtatása (alaphelyzet)

AllSigned

Csak elektronikusan aláírt szkriptek futtathatók

RemoteSigned

Külső forrásból letöltött szkripteknek kell aláírtaknak lenniük (hálózat, internet), helyi szkriptek aláírás nélkül is futtathatók

Unrestricted

Korlátozás nélkül futtathatók a szkriptek, az internetről letöltött szkriptek esetén megerősítést kér

Bypass

Korlátozás nélkül futtathatók a szkriptek, megerősítést sem kér

Undefined

Az adott futtatási környezetben beállított végrehajtási házirendet figyelmen kívül hagyja, így a magasabb szinten beállított házirend, vagy (ha ilyen nincs) a Group Policy segítségével beállított házirend jut érvényre

Ahhoz, hogy mi a saját aláírás nélküli szkriptjeinket futtatni tudjuk, a RemoteSigned szintet javaslom beállítani:

PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Megjegyzés

A végrehajtási házirend beállításához helyi rendszergazda jogosultság szükséges, illetve Windows Vista, vagy annál újabb operációs rendszerek esetében ezen kívül a PowerShell alkalmazást is rendszergazda jogkörrel kell futtatni, hogy ez a parancs lefusson. Ha nincs valakinek ilyen jogköre, akkor ennek a házirendnek is beállíthatunk a –Scope paraméterhez egy hatósugarat:

Process: csak az adott PowerShell ablakban állítja be a végrehajtási házirendet, nem igényel rendszergazda jogosultságot

CurrentUser: csak az adott felhasználóra állítja be a végrehajtási házirendet, nem igényel rendszergazda jogosultságot

LocalMachine: alaphelyzet szerinti beállítás, az adott gép minden felhasználójára állítja be a végrehajtási házirendet

Nézzünk erre egy példát:

[65] PS C:\> Set-ExecutionPolicy -ExecutionPolicy restricted -Scope process

 

Execution Policy Change

The execution policy helps protect you from scripts that you do not trust.

Changing the execution policy might expose you to the security risks described

 in the about_Execution_Policies help topic. Do you want to change the

execution policy?

[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): y

[66] PS C:\> . .\munka\converthashtocollection.ps1

File C:\munka\converthashtocollection.ps1 cannot be loaded because the executi

on of scripts is disabled on this system. Please see "get-help about_signing"

for more details.

At line:1 char:2

+ . <<<<  .\munka\converthashtocollection.ps1

    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException

    + FullyQualifiedErrorId : RuntimeException

A fenti példában pont szigorítottam az adott PowerShell ablak futtatási házirendjét, minek hatására egy szkript futtatása hibára futott.

A globális biztonsági beállítást a registry-n keresztül is beállíthatjuk, például a számítógépre:

47 . ábra Execution Policy helye a registry-ben

Vagy beállíthatjuk ezt az értéket központilag is Group Policy segítségével is. Ha szükséges, ehhez letölthető a Microsoft downloads oldaláról az „Administrative templates for Windows PowerShell” adm fájl.

Azt, hogy milyen végrehajtási házirendek hatnak éppen a munkamenetünkre, a Get-ExecutionPolicy  cmdlettel tudjuk lekérdezni. Méghozzá a –List kapcsolóval az összes lehetséges hely fel lesz sorolva, ahonnan kaphatunk ilyen jellegű házirendet:

PS C:\> Get-ExecutionPolicy -List

 

                                  Scope                        ExecutionPolicy

                                  -----                        ---------------

                          MachinePolicy                              Undefined

                             UserPolicy                              Undefined

                                Process                              Undefined

                            CurrentUser                              Undefined

                           LocalMachine                           RemoteSigned

Állítsuk be a megfelelő biztonsági szintet a PowerShell cmdlet segítségével (legalább RemoteSigned) és próbáljuk meg ismét az indítást! (Természetesen csak rendszergazda jogosultságok birtokában tudjuk ezt megtenni.) Az előbb talán túl sokat is gépeltünk a fájl a c: gyökerében van, elég lesz csak ennyi:

[5] PS C:\> elso.ps1

The term 'elso.ps1' is not recognized as the name of a cmdlet, function, scrip

t file, or operable program. Check the spelling of the name, or if a path was

included, verify that the path is correct and try again.

At line:1 char:9

+ elso.ps1 <<<<

    + CategoryInfo          : ObjectNotFound: (elso.ps1:String) [], CommandNo

   tFoundException

    + FullyQualifiedErrorId : CommandNotFoundException

 

 

Suggestion [3,General]: The command elso.ps1 was not found, but does exist in t

he current location. Windows PowerShell doesn't load commands from the current

location by default. If you trust this command, instead type ".\elso.ps1". See

"get-help about_Command_Precedence" for more details.

Hát ez nem elég! Régi jó UNIX / Linux szokás szerint a PowerShell nem próbálja az aktuális mappában megtalálni a megadott futtatható állományt, így teljes útvonalat (relatív vagy abszolút) kell megadnunk. Tehát például az alábbi módon indíthatjuk el végre a korábban létrehozott szkriptet:

[8] PS C:\> .\elso.ps1

Hurrá! Fut az első szkriptünk.

Ha az aktuális mappában nem is, de a PATH környezeti változóban felsorolt mappákban természetesen próbálkozik a PowerShell, ilyen esetben nem szükséges útvonalat megadnunk.

Sajnos még mindig nem vagyunk teljesen készen, mivel ha szkriptünk útvonala szóköz karaktert is tartalmaz, újabb problémába ütközünk. Hozzunk létre egy újabb szkriptet a 'C:\Könyvtár szóközzel\második.ps1' mappában!

[4] PS C:\> "'Hurrá! Fut a 2. szkriptem.'" | Out-File 'C:\Könyvtár szóközzel\má

sodik.ps1'

Rutinosabb versenyző persze nem is próbálkozik az idézőjelek nélküli indítással, ez azonban ebben az esetben kevés, mivel a parancs így nem parancs és nem is útvonal, csak egy közönséges karakterlánc:

[6] PS C:\> 'C:\Könyvtár szóközzel\második.ps1'

C:\Könyvtár szóközzel\második.ps1

Be kell vetnünk a korábban már használt „futtató” karaktert (&) az alábbi módon:

[7] PS C:\> & 'C:\Könyvtár szóközzel\második.ps1'

Hurrá! Fut a 2. szkriptem.

Megjegyzés

Ha a beviteli sor elején kezdünk el olyan elérési utat gépelni, amelyben szóköz karakter van, akkor a TAB billentyű lenyomására a PowerShell a könyvtár nevének kiegészítésekor automatikusan beilleszti a sor elejére a végrehatás operátorát és az aposztrófot.

Végül foglaljuk össze röviden mi is szükséges ahhoz, hogy PowerShell szkripteket futtassunk:

Be kell állítanunk a megfelelő végrehajtási szabályt (execution policy). Alapértelmezés szerint a PowerShell nem futtat le semmiféle szkriptet, akárhogy is adjuk meg az útvonalat.

A szkript indításához adjuk meg annak teljes útvonalát, illetve ha a fájl az aktuális mappában van, használjuk a .\ jelölést. Útvonal nélkül is elindíthatjuk a szkriptet, ha olyan mappában van, amely szerepel a Windows keresési útvonalán (PATH környezeti változó).

Ha az útvonal szóközöket tartalmaz, tegyük idézőjelek közé és írjuk elé a futtató karaktert (&).

A korábbi szokásokkal (cmd, vbs, stb.) ellentétben (természetesen szintén biztonsági okokból) maga a szkriptfájl közvetlenül nem indítható el a shellen kívül, mivel a ps1 kiterjesztésű fájlokat alapértelmezés szerint a notepad.exe nyitja meg. PowerShell 3.0 után megjelent egy új lehetőség szkriptek futtatására. Ha a Windows fájlböngésző ablakában egy szkriptfájlra jobb egérgombbal kattintunk, akkor megjelenik egy új menüpont: „Run with PowerShell”:

48 . ábra Run with PowerShell menü

Ha nem a grafikus felület segítségével, hanem például egy hagyományos logonszkriptből szeretnénk szkriptet futtatni, akkor elsőként a powershell.exe-t kell elindítanunk (keresési útvonalon van). Ennek paraméterként adhatjuk át futtatandó szkriptfájl nevét. A cmd.exe-ből például az alábbi módon indíthatjuk el a fenti szkriptet (a -noexit kapcsoló hatására a powershell.exe nem áll le a szkript lefuttatása után, megfigyelhető, hogy a PowerShellre jellemző promptot kapunk vissza):

C:\>powershell -noexit c:\elso.ps1

Hurrá! Fut az első szkriptünk.

PS C:\>

Próbáljuk meg hasonló módon elindítani a masodik.ps1 szkriptet is! Nyilván itt is kell a futtató karakter:

C:\Users\Administrator>powershell -noexit &"c:\Könyvtár szóközzel\második.ps1"

Windows PowerShell

Copyright (C) 2009 Microsoft Corporation. All rights reserved.

 

[1] PS C:\>

Ugyan látható a promptból, hogy a cmd shell átalakult PowerShellé, de sajnos a szkriptünk így sem futott le. Még egy trükkre van szükség, a cmd.exe elől el kell rejteni a PowerShellnek szóló & jelet egy újabb, külső idézőjelpárral:

C:\Users\Administrator>powershell -noexit "& 'c:\Könyvtár szóközzel\második.ps1

'"

Hurrá! Fut a 2. szkriptem.

[1] PS C:\>

Megjegyzés

Itt most fontos, hogy a külső idézőjel a macskaköröm legyen, a belső pedig az aposztróf, egyéb módokon nem fut le helyesen.

Ha logonszkriptekben szerepeltetjük ezt a parancsot, akkor ne használjuk a –noexit paramétert.



Word To HTML Converter