9Sep

A kötegfájl használata a PowerShell parancsfájlok egyszerűbb futtatásához

click fraud protection

Több okból kifolyólag a biztonsággal kapcsolatos PowerShell szkriptek nem olyan hordozhatóak és használhatók, mint a kötegelt parancsfájlok. Azonban összegyűjthetjük a kötegelt szkriptet PowerShell szkriptjeinkkel, hogy ezeket a problémákat megoldhassuk. Itt megmutatjuk neked néhány ilyen problémás területet, és hogyan készíthetsz egy kötegelt szkriptet, hogy körbevezhesse őket.

Miért nem másolhatom a. PS1 fájlt egy másik számítógépre és futtathatom?

Ha a célrendszer előre konfigurálva van ahhoz, hogy tetszőleges parancsfájlokat futtasson, a szükséges jogosultságokkal és a megfelelő beállításokkal, akkor valószínűleg problémákba ütközik, amikor megpróbálja ezt elvégezni.

  1. A PowerShell alapértelmezés szerint nincs társítva a. PS1 fájlkiterjesztéshez.
    Ezt eredetileg a PowerShell Geek School sorozatában hoztuk létre. A Windows alapértelmezés szerint a. PS1 fájlokat jegyzi be a Jegyzettömbbe, ahelyett, hogy elküldené őket a PowerShell parancsértelmezőhöz. Ezzel megakadályozzuk a rosszindulatú parancsfájlok véletlenszerű végrehajtását egyszerűen rákattintva. Vannak olyan módok, amelyek megváltoztathatják ezt a viselkedést, de valószínűleg nem valami, amit meg akarsz csinálni minden olyan számítógépen, amelyen a szkripteket hordozod - különösen, ha ezek közül a számítógépek közül néhány nem a sajátod.
    instagram viewer
  2. A PowerShell alapértelmezés szerint nem engedélyezi a külső parancsfájl végrehajtását.
    A PowerShell ExecutionPolicy beállítása megakadályozza a külső parancsfájlok alapértelmezés szerinti végrehajtását a Windows összes verziójában. Néhány Windows-verzió esetén az alapértelmezés egyáltalán nem teszi lehetővé a szkript végrehajtását. Megmutattuk, hogyan változtathatjuk meg ezt a beállítást a PowerShell parancsfájlok végrehajtásának engedélyezéséről a Windows 7 operációs rendszeren. Ugyanakkor ez is valami, amit nem akarsz csinálni egyetlen számítógépen sem.
  3. Néhány PowerShell parancsfájl nem működik adminisztrátori jogosultságok nélkül.
    Még adminisztrátori szintű fiókkal is fut, még mindig szüksége van a felhasználói fiókok felügyeletére( UAC) keresztül végrehajtani bizonyos műveleteket. Nem akarjuk kikapcsolni ezt, de még mindig szép, ha könnyebben meg tudjuk oldani.
  4. Egyes felhasználók rendelkezhetnek testre szabott PowerShell környezetekkel.
    Valószínűleg nem fogsz bejutni ehhez gyakran, de ha ezt teszed, akkor kicsit frusztrálhatod a szkriptek futását és hibaelhárítását. Szerencsére ezt állandóan megváltoztathatjuk.

1. lépés: Kattintson duplán a futtatáshoz.

Kezdjük az első probléma megoldásával -. PS1 fájlszövetkezetekkel. Nem lehet duplán kattintani a. PS1 fájlok futtatásához, de ilyen módon végrehajthatja a. BAT fájlt. Szóval írunk egy kötegelt fájlt, hogy felhívjuk a PowerShell parancsfájlt a parancssorból.

Tehát nem kell újraírnunk a kötegelt fájlt minden parancsfájlra, vagy minden egyes forgatókönyvet áthelyezni, akkor egy ön-hivatkozó változót használunk a PowerShell parancsfájl elérési útjának létrehozásához. Ennek elvégzéséhez a kötegelt fájlt ugyanabba a mappába kell helyezni, mint a PowerShell parancsfájl, és ugyanaz a fájlnév. Tehát ha a PowerShell parancsfájl neve "MyScript.ps1", meg szeretné nevezni a "MyScript.bat" kötegfájlt, és győződjön meg róla, hogy ugyanabban a mappában van. Ezután tegye ezeket a sorokat a kötegelt parancsfájlba:

@ECHO KI PowerShell.exe -command "& '% ~ dpn0.ps1'" PAUSE

Ha nem lenne a többi biztonsági korlát, akkor mindenegy PowerShell parancsfájl futtatásához szükséges. Valójában az első és az utolsó sorok elsősorban a preferenciák kérdései - ez a második sor, amely valóban a munkát végzi. Itt van a bontás:

@ECHO OFF kikapcsolja a parancs visszhangját. Ez csak megtartja a többi parancsot a képernyőn történő megjelenítéskor, amikor a kötegelt fájl fut. Ezt a vonalat maga elé rejtette a( @) szimbólum előtt.

PowerShell.exe -command "&'% ~ Dpn0.ps1' "Az ténylegesen futtatja a PowerShell szkriptet. A PowerShell.exe természetesen bármilyen CMD ablakból vagy kötegfájlból is meghívható, hogy elindítsa a PowerShell-et egy szokásos konzolra. A parancsokat a kötegfájllal közvetlenül is végrehajthatja, a Command paraméter és a megfelelő érvek bevitelével. Ennek módját a. PS1 fájl céljára használjuk a speciális% ~ dpn0 változóval. Futtatás egy kötegfájlból, a% ~ dpn0 értékeli a kötegelt betű, a mappa elérési útját és a fájlnevet( kiterjesztés nélkül).Mivel a kötegelt fájl és a PowerShell parancsfájl ugyanabban a mappában lesz, és ugyanaz a név, a% ~ dpn0.ps1 lefordítja a PowerShell parancsfájl teljes elérési útját.

PAUSE csak szünetelteti a kötegelt végrehajtást, és várja a felhasználói bemenetet. Ez általában hasznos a kötegelt fájlok végén, így esélyt kap arra, hogy ellenőrizze az összes parancs kimenetet, mielőtt az ablak eltűnik. Ahogy az egyes lépések tesztelését végezzük, ennek hasznossága nyilvánvalóbbá válik.

Így létrejön az alap kötegfájl. A bemutató célból ez a fájl "D: \ Script Lab \ MyScript.bat" -ként kerül mentésre, és ugyanabban a mappában van egy "MyScript.ps1".Lássuk, mi történik, ha duplán kattintunk a MyScript.bat -ra.

Nyilvánvalóan a PowerShell szkript nem futott, de ez várható - csak négy problémánk közül csak az elsőt kerestük. Itt azonban néhány fontos bit jelenik meg:

  1. Az ablak címe azt mutatja, hogy a kötegelt szkript sikeresen elindította a PowerShell-et.
  2. A kimenet első sorában látható, hogy egyéni PowerShell profilt használ. Ez a 4. esetleges, a fentiekben felsorolt ​​probléma.
  3. A hibaüzenet a végrehajtásvédelmi korlátozásokat mutatja be. Ez a mi probléma # 2.
  4. A hibaüzenet aláhúzott része( amely eredetileg a PowerShell hibakimenetével történik) azt mutatja, hogy a kötegelt szkript megfelelően célzott a tervezett PowerShell parancsfájlra( D: \ Script Lab \ MyScript.ps1).Tehát legalább tudjuk, hogy sok mindent jól működik.

A profil, ebben az esetben egy egyszerű egysoros parancsfájl, amelyet a bemutatóhoz használnak kimenet létrehozásához, amikor a profil aktív. Ezt a saját PowerShell profilt is testreszabhatja, ha saját maga próbálja tesztelni ezeket a parancsfájlokat. Egyszerűen adja hozzá a következő sort a profilszkripthez:

Write-Output "Egyéni PowerShell profil érvényes!"

A tesztrendszeren a ExecutionPolicy beállítás RemoteSigned. Ez lehetővé teszi a helyileg létrehozott parancsfájlok( mint például a profilszkript) végrehajtását, ugyanakkor blokkolja a szkripteket külső forrásokból, hacsak nem egy megbízható hatóság írja alá őket. Támogatási célokból a következő parancsot használta a MyScript.ps1 jelzésének külső forrásként való megjelölésére:

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

"Zone. Identifier" forrása A Zone. Identifier alternatív adatfolyamot állít be a MyScript.ps1 fájlrendszeren, hogy a Windows úgy gondolja, hogy a fájl az internetről származik. A következő paranccsal egyszerűen megfordítható:

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

2. lépés: A ExecutionPolicy elérése.

A ExecutionPolicy beállítása a CMD-től vagy egy kötegelt szkriptből valóban nagyon könnyű.Csak módosítsuk a parancs második sorát, hogy még egy paramétert adjunk hozzá a PowerShell.exe parancshoz.

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

Az -ExecutionPolicy paraméter használható az ExecutionPolicy módosítására, amelyet akkor használnak, amikor új PowerShell munkamenetet hoz létre. Ez nem fog fennmaradni az adott munkameneten túlmenően, így a PowerShellet bármikor futtathatjuk, amikor szükségünk van a rendszer általános biztonsági pozíciójának gyengítése nélkül. Most, hogy rögzítettük, hagyjuk, hogy egy másik megy:

Most, hogy a szkript megfelelően lett végrehajtva, láthatjuk, hogy mit is csinál. Tudatja velünk, hogy a szkriptet korlátozott felhasználónak futtattuk. A szkriptet valójában egy fiók adminisztrátori jogosultságokkal futtatja, de a Felhasználói fiókok felügyelete megkezdődik. Bár a parancsfájl ellenőrzésének módja az adminisztrátori hozzáférésen kívül esik a jelen cikk hatálya alatt, itt a demonstrációs kód:

if( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent() ) IsInRole() [{{Write-Output} 'Rendszergazdaként fut!'} Else{ Write-Output 'Running Limited!'} Szünet

Azt is észre fogod venni, hogy most van kétA "szünet" műveletek a parancsfájl kimenetében - az egyik a PowerShell parancsfájlból és egy a kötegelt fájlból. Ennek oka a következő lépésben nyilvánvalóbb lesz.

3. lépés: Rendszergazdai hozzáférés elérése.

Ha a parancsfájl nem vezet semmilyen parancsot, amely megköveteli a magasságot, és biztos vagy benne, hogy nem kell aggódnia, hogy valaki egyéni profilja megpróbálja az utat, akkor kihagyhatja a többiet. Ha adminisztrátori szintű cmdleteket futtatsz, akkor szükséged lesz erre a darabra.

Sajnos nincs mód arra, hogy az UAC-t a batch fájlban vagy a CMD-munkamenetben emelje fel. A PowerShell azonban lehetővé teszi számunkra a Start-Process használatát. Ha a "-Verb RunAs" argumentummal együtt használják, a Start-Process megpróbálja elindítani egy olyan alkalmazást, amely Administrator jogosultságokkal rendelkezik. Ha a PowerShell munkamenet még nem emelkedett ki, ez egy UAC-promptot indít. A parancsfájl elindításához a kötegfájlból a következő két PowerShell folyamat - a Start-Process és egy másik, a Start-Process által indított - elindítása végett elindul. A kötegelt fájl második sorát módosítani kell erre:

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

Amikor a kötegfájl fut, az első kimeneti sor a PowerShell profilszkriptből származik. Ezután lesz egy UAC prompt, amikor a Start-Process elindítja a MyScript.ps1 indítását.

Az UAC parancssorba való kattintás után új PowerShell példány jelenik meg. Mivel ez egy új példa, természetesen újra meglátjuk a profil script értesítést. Ezután a MyScript.ps1 fut, és látjuk, hogy valóban emelt munkamenetben vagyunk.

És itt is van két szünetünk. Ha nem a PowerShell parancsfájlban található, akkor nem látjuk a parancsfájl kimenetét - a PowerShell ablak csak felbukkan és eltűnik, amint a parancsfájl fut. A kötegelt fájl szüneteltetése nélkül nem láthattuk, hogy előfordultak-e hibák a PowerShell elindításakor.

4. lépés: Egyéni PowerShell profilok elérése.

Most szabaduljunk meg a csúnya egyedi profil-értesítéstől, mi? Ez aligha okoz kellemetlenséget, de ha egy felhasználó PowerShell profilja megváltoztatja az alapértelmezett beállításokat, változókat vagy funkciókat olyan módon, amire a forgatókönyvedre nem számíthatsz, valóban problémásak lehetnek. Sokkal egyszerűbb a szkript futtatása a profil nélkül, így nem kell aggódnia. Ehhez még egyszer meg kell változtatnunk a kötegelt fájl második sorát:

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

A parancsfájl által indított PoweroSllll-n-NoProfile paraméter hozzáadása azt jelenti, hogy a felhasználó profilszkriptjét mindkét lépésben teljesen megkerülik, és PowerShell szkriptünk futegy meglehetősen kiszámítható, alapértelmezett környezet. Itt láthatja, hogy nincs egyetlen profil-értesítés sem az előállított héjban.

Ha nem szükséges Adminisztrátori jogosultság a PowerShell szkriptben, és kihagytad a 3. lépést, akkor a második PowerShell példány nélkül is megteheted, és a batch file második sorának így kell kinéznie:

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

A kimenet így fog kinézni:

( Természetesen a nem-adminisztrátori szkriptekhez a szkript befejezése nélkül teheti meg PowerShell szkriptjétezen a ponton is, mivel mindent ugyanabban a konzolablakban rögzítenek, és ott a batch fájl végén a szünet tartja.)

Befejezett kötegfájlok.

Attól függően, hogy szükség van-e adminisztrátori jogosultságokra a PowerShell parancsfájlhoz( és tényleg nem kéri őket, ha nem), a végső kötegelt fájlnak az alábbi kettő közül kell lennie.

Adminisztrátori hozzáférés nélkül:

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

Adminisztrátori hozzáféréssel:

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

Ne felejtse el a kötegelt fájlt ugyanabba a mappába helyezni, mint a kívánt PowerShell parancsfájlhasználni, és ugyanazt a nevet adni. Akkor, függetlenül attól, hogy milyen rendszert alkalmaztál ezekre a fájlokra, képes lesz futtatni a PowerShell szkriptet, anélkül, hogy a rendszer biztonsági beállításainak bármelyikével meggondolná magát. Minden bizonnyal manuálisan elvégezheted ezeket a változásokat, de ez megóvja a bajodat, és nem kell aggódnia, hogy később visszaállíthatja a változásokat.

Referenciák:

  • PowerShell szkriptek futtatása egy kötegfájllal - Daniel Schroeder programozási blogja
  • Rendszergazdai jogosultságok ellenőrzése a PowerShell-ben - Hé, forgatókönyvíró Guy! Blog