A Windows PowerShell „Végrehajtási házirend: Korlátozott” hibájának legbiztonságosabb javítása nem az, hogy bemásolod a legszélesebb körű parancsot, amit találsz. Először azonosítsd, melyik végrehajtási házirend a ténylegesen érvényes, majd válaszd ki a legszűkebb körű változtatást, amely megfelel annak, amit futtatni szeretnél.
A Microsoft jelenlegi dokumentációja is hangsúlyozza a verziókontextus fontosságát. A Windows PowerShell 5.1 dokumentációja a Korlátozott (Restricted) értéket sorolja fel alapértelmezett végrehajtási házirendként a Windows kliensszámítógépeken. A jelenlegi PowerShell 7.6 dokumentáció a Alapértelmezett (Default) értéket a Windows rendszeren RemoteSigned-ként definiálja. Ha azonban minden hatókör Undefined (Nem definiált), a Microsoft továbbra is a Korlátozott (Restricted) értéket dokumentálja a Windows klienseken érvényes tartalékértékként. A gyakorlati tanulság egyszerű: ne következtess a házirendre a Windows verziójából vagy egy útmutatóból. Futtasd a házirend-parancsokat azon a gépen, ahol a hiba jelentkezik.
Ez az útmutató összehasonlítja a fő javítási lehetőségeket hatókör, tartósság, adminisztratív hatás és bizalmi modell szerint. A cél az, hogy egy jogos szkriptet futtassunk anélkül, hogy a rendszert a szükségesnél jobban gyengítenénk.
Mit jelent valójában a Korlátozott hiba
A Korlátozott (Restricted) házirend mellett a PowerShell engedélyezi az egyedi parancsokat, de nem teszi lehetővé szkriptfájlok futtatását. Ez magában foglalja a PowerShell szkripteket és a kapcsolódó konfigurációs vagy modul-szkript fájlokat. A Microsoft a végrehajtási házirendet olyan biztonsági funkcióként írja le, amely szabályozza a szkriptek és konfigurációs fájlok betöltésének feltételeit. Ez nem biztonsági határ; a Microsoft kifejezetten megjegyzi, hogy a felhasználó továbbra is gépelhet parancsokat interaktív módon. Olvasd el a jelenlegi about_Execution_Policies dokumentációt a PowerShell 7.6-hoz és a Windows PowerShell 5.1 végrehajtási házirend dokumentációt.
A gyakori hiba azt jelzi, hogy a .ps1 fájl nem tölthető be, mert a szkriptek futtatása le van tiltva; rögzítsd a pontos üzenetet, mielőtt megváltoztatnád a házirendet.
Ez a különbségtétel fontos. A végrehajtási házirend segíthet megakadályozni a véletlen szkriptfuttatást, de a RemoteSigned vagy Bypass beállítása nem teszi megbízhatóvá a szkriptet. Először vizsgáld felül a szkriptet és annak forrását.
1. lépés: azonosítsd az érvényes házirendet és minden hatókört
Futtasd ezt a két parancsot:
Get-ExecutionPolicy
Get-ExecutionPolicy -List
Az első visszaadja az aktuális munkamenet érvényes házirendjét. A második felsorolja a MachinePolicy, UserPolicy, Process, CurrentUser és LocalMachine hatókörökben alkalmazott házirendeket. A Microsoft kifejezetten a Get-ExecutionPolicy -List parancsot ajánlja a munkamenetet befolyásoló házirendek megtekintésére. Lásd: Get-ExecutionPolicy.
Ellenőrizd az összes hatókört ahelyett, hogy feltételeznéd, hogy a LocalMachine érték az, amely irányítja a munkamenetet.
Ha a MachinePolicy vagy a UserPolicy definiált, állj meg, mielőtt helyi kerülő megoldást próbálnál kikényszeríteni. Ezek az értékek a Csoportos házirendből (Group Policy) származnak, és felülírhatják a PowerShell-lel végrehajtott végrehajtási házirend-beállításokat. Egy kezelt munkaszámítógépen a helyes következő lépés általában a szervezet folyamatának követése vagy az IT részleggel való kapcsolatfelvétel.
Válaszd ki a javítást az igények, ne a legrövidebb parancs alapján
| Opció | Tartósság | Adminisztratív jogosultságok | Fő kompromisszum | Legjobb illeszkedés |
Unblock-File a RemoteSigned használata mellett | Fájlspecifikus | Általában nincs szükség emelt szintű jogosultságra a saját fájlodhoz | Kifejezetten megbízol egy letöltött fájlban; más letöltött, aláíratlan fájlok továbbra is a RemoteSigned szabályai alá esnek | Egy felülvizsgált szkript, amelyet az internetről töltöttél le |
Process RemoteSigned | Csak az aktuális PowerShell folyamat | Nincs LocalMachine változtatás | Alacsony tartósság, de a letöltött, aláíratlan fájloknak továbbra is szükségük lehet a blokkolás feloldására | Ideiglenes fejlesztési vagy hibaelhárítási munkamenet |
CurrentUser RemoteSigned | Tartós az Ön felhasználói fiókjához | Nem igényli az összes felhasználó megváltoztatását | Kényelmes a rendszeres helyi szkripteléshez; szélesebb körű, mint egy munkamenet-változtatás | Személyes fejlesztői munkállomás |
LocalMachine RemoteSigned | Tartós az összes felhasználó számára | Emelt szintű jogosultságot igényel | Szélesebb hatás a számítógépen | Megosztott gép, ahol egy rendszergazda szándékosan ugyanazt a házirendet szeretné az összes felhasználó számára |
AllSigned | Függ a hatókörtől | Függ a hatókörtől | Aláírásokat követel meg még a helyileg létrehozott szkriptekhez is; tanúsítványi és aláírási munkafolyamat többletköltséggel jár | Szervezetek kódaláírási folyamattal |
Bypass | Függ a hatókörtől; gyakran Process hatókörben használják | Függ a hatókörtől | Nincs szkriptblokkolás, figyelmeztetés vagy megerősítés a végrehajtási házirendtől | Irányított automatizálás saját bizalmi és biztonsági modellel, nem laza állandó beállítás |
2. lépés: használj adminisztrátori jogosultságot csak gépszintű változtatáshoz
Nem kell emelt szintű PowerShellt nyitnod pusztán a CurrentUser vagy Process hatókör megváltoztatásához. A Microsoft azt állítja, hogy emelt szintű jogosultság szükséges a helyi számítógép házirendjének megváltoztatásakor, ami a LocalMachine-t jelenti. Ez hasznos kompromisszum: ha csak az Ön felhasználói fiókjának van szüksége helyi szkriptelésre, az összes felhasználó házirendjének megváltoztatása hatókört ad hozzá előny nélkül.
A „Futtatás rendszergazdaként” megfelelő egy szándékos LocalMachine változtatáshoz, de szükségtelen a Process vagy CurrentUser hatókörhöz.
Javaslat igény szerint: használj CurrentUser-t egy fejlesztői fiókhoz, amely rendszeresen futtat helyileg készített szkripteket. Tartsd fenn a LocalMachine-t egy olyan rendszergazdának, aki szándékosan ugyanazt a beállítást szeretné az összes felhasználóra kiterjeszteni.
3. lépés: rendszeres helyi szkripteléshez fontold meg a CurrentUser RemoteSigned beállítást
Sok személyes fejlesztői gépen egy gyakorlati tartós választás a következő:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
A RemoteSigned lehetővé teszi a helyi szkriptek futtatását aláírás nélkül, míg az internetről letöltöttnek jelölt szkriptekhez megbízható digitális aláírás szükséges, hacsak nem blokkolod fel kifejezetten a fájlt. Ez megőrzi a hasznos különbségtételt a helyileg létrehozott és más forrásból szerzett kód között.
Ez az ábra egy gépszintű RemoteSigned parancsot mutat, mert a hatókör ki van hagyva; a LocalMachine az alapértelmezett hatókör. Előnyben részesíts egy kifejezett hatókört, hogy a hatás szándékos legyen.
Gyakori hiba a Set-ExecutionPolicy RemoteSigned futtatása -Scope nélkül. A Microsoft a LocalMachine-t dokumentálja alapértelmezett hatókörként a végrehajtási házirend beállításakor. Ezért jobb, ha kifejező vagy:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
A változtatás azonnal érvénybe lép; a PowerShellt nem kell újraindítani a CurrentUser vagy LocalMachine változtatásokhoz.
4. lépés: ideiglenes munkamenethez részesítsd előnyben a Process hatókörű házirendet
Ha hibát keresel vagy egy megbízható helyi szkriptet futtatsz egyszer, kerüld a tartós felhasználói vagy gépi változtatást. Egy szűkebb opció a következő:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
A Process hatókör csak az aktuális PowerShell munkamenetre vonatkozik. A Microsoft azt állítja, hogy ez a $Env:PSExecutionPolicyPreference környezeti változóban tárolódik, és törlődik, amikor a folyamat bezárul.
Ha egy nagyobb alkalmazás, telepítő vagy irányított automatizálási környezet már rendelkezik saját biztonsági modellel, a PowerShell a Bypass opciót is biztosítja:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
A Process hatókörű Bypass eltűnik, amikor a PowerShell folyamat bezárul, de eltávolítja a végrehajtási házirend figyelmeztetéseit és blokkolását is az adott munkamenetre.
Kompromisszum: A Process hatókör minimalizálja a tartósságot, de a Bypass szélesebb körű, mint a RemoteSigned az adott munkameneten belül. A Microsoft a Bypass-t úgy írja le, mint ami semmit nem blokkol, és nem jelenít meg figyelmeztetéseket vagy megerősítéseket, és azt állítja, hogy olyan forgatókönyvekhez szánják, ahol egy másik alkalmazás biztosítja a biztonsági modellt. Egy normál interaktív hibaelhárítási munkamenethez először a Process RemoteSigned-t használd, hacsak nincs konkrét okod a Bypass használatára.
Egy különálló, egyszeri Windows PowerShell folyamathoz is indíthatod:
powershell.exe -ExecutionPolicy RemoteSigned -File .\script.ps1
A PowerShell 7 esetén a futtatható fájl a pwsh.exe. Egy parancssori végrehajtási házirend-beállítás továbbra sem írja felül a Csoportos házirend által kikényszerített végrehajtási házirendet.
5. lépés: ha a RemoteSigned blokkol egy letöltött szkriptet, csak azt a fájlt blokkold fel
A RemoteSigned másképp kezeli az internetről származónak jelölt fájlokat. A Microsoft dokumentálja az Unblock-File parancsmotort, amely eltávolítja az internetzóna jelölést, lehetővé téve egy felülvizsgált, aláíratlan szkript futtatását a RemoteSigned alatt.
Először vizsgáld felül a szkriptet. Ha megbízol a forrásban és felülvizsgáltad a tartalmát, futtasd:
Unblock-File -Path .\script.ps1
Használhatod a fájl Tulajdonságok párbeszédpaneljének Feloldás (Unblock) jelölőnégyzetét is. A Microsoft azt állítja, hogy az Unblock-File ugyanazt az alapvető műveletet hajtja végre. Lásd: Unblock-File.
Egy felülvizsgált, letöltött szkript feloldása szűkebb körű, mint a házirend gyengítése a gépen lévő összes szkriptre.
Ellenőrizheted, hogy egy fájl rendelkezik-e Zone.Identifier alternatív adatfolyammal a következő paranccsal:
Get-Item .\script.ps1 -Stream Zone.Identifier -ErrorAction SilentlyContinue
A Microsoft megjegyzi, hogy a letöltési módszerek nem jelölik meg egyformán a fájlokat, így az adatfolyam hiánya nem bizonyítja, hogy a szkript biztonságos.
6. lépés: használj AllSigned-ot, ha a szervezetnek aláírási munkafolyamata van
Az AllSigned megköveteli, hogy az összes szkript és konfigurációs fájl megbízható kiadó által aláírt legyen, beleértve a helyileg létrehozott szkripteket is. Ez a szervezetnek konzisztens kiadói bizalmi munkafolyamatot biztosít, de működési többletköltséggel is jár: a szkripteknek Authenticode aláírásokra van szükségük, és a felhasználóknak megbízhatónak kell tekinteniük a releváns kiadókat.
A Microsoft about_Signing dokumentációja elmagyarázza, hogyan ellenőrzi a PowerShell a szkriptaláírásokat, és hogyan működnek a megbízható kiadói megerősítések.
Javaslat igény szerint: Az AllSigned akkor értelmes, ha a szervezetnek már vannak kódaláírási tanúsítványai, közzétételi irányítási eszközei és folyamata az aláírt szkriptek frissítésére. Egy magányos fejlesztő számára, aki helyi segédszkripteket ír, a RemoteSigned általában kevesebb súrlódással jár, miközben megőrzi az internetes eredet ellenőrzését.
7. lépés: ne küzdj a Csoportos házirenddel kezelt PC-n
A PowerShell két házirend-hatókört tár fel, amelyek a Csoportos házirendből származnak: MachinePolicy és UserPolicy. A Microsoft Csoportos házirend dokumentációja szerint a Szkriptfuttatás engedélyezése (Turn on Script Execution) beállítás kikényszerítheti a Korlátozott (Restricted), RemoteSigned vagy AllSigned viselkedést kezelt felhasználók és számítógépek esetén. A beállítás itt található:
Administrative Templates\Windows Components\Windows PowerShell
Lásd: about_Group_Policy_Settings.
Ha a Get-ExecutionPolicy -List definiált MachinePolicy-t vagy UserPolicy-t mutat, egy helyi Set-ExecutionPolicy parancs nem feltétlenül adja meg a várt érvényes viselkedést. A gyakorlati megoldás a megfelelő házirend kérése a rendszergazdától, egy aláírt szkript használata, ha szükséges, vagy egy jóváhagyott telepítési módszer alkalmazása.
8. lépés: állítsd vissza a ténylegesen megváltoztatott beállítást, majd ellenőrizd
Mielőtt megváltoztatnál egy tartós hatókört, jegyezd fel a meglévő értékét:
Get-ExecutionPolicy -Scope CurrentUser
Get-ExecutionPolicy -Scope LocalMachine
Ha később el kell távolítanod egy általad beállított házirend-értéket, a Microsoft azt dokumentálja, hogy állítsd az adott hatókört Undefined-re:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Undefined
Ne futtasd vakon a Set-ExecutionPolicy Restricted parancsot csak azért, mert egy képernyőkép ezt mutatja. Hatókör nélkül a parancs alapértelmezés szerint a LocalMachine-t célozza meg, és a „Korlátozott” (Restricted) nem feltétlenül volt az a hatókör előző értéke.
A képernyőkép egy Korlátozott (Restricted) változtatást szemléltet, de egy valódi visszaállításnak azt a hatókört és értéket kell visszaállítania, amelyet feljegyeztél, ahelyett, hogy tippelnéd az előző konfigurációt.
Végül ellenőrizd az érvényes házirendet és a szkriptet is:
Get-ExecutionPolicy
Get-ExecutionPolicy -List
.\script.ps1
A sikeres szkriptfuttatás megerősíti, hogy a közvetlen tünet megoldódott; ellenőrizd újra a házirendlistát, hogy meggyőződj róla, nem hagytad-e véletlenül szélesebb hatókört megváltoztatva.
Melyik javítást kell választanod?
| Az Ön helyzete | Javasolt kiindulópont | Miért |
| Letöltöttél egy szkriptet egy megbízható forrásból | Tartsd a RemoteSigned-ot, és használj Unblock-File-t felülvizsgálat után | Egy fájl bizalmát változtatja meg, nem az összes szkriptét |
| Csak az aktuális hibaelhárítási munkamenetben van szükséged szkriptekre | Process RemoteSigned | A munkamenettel együtt zárul, és fenntartja az internetes eredet korlátozásait |
| Rendszeresen írsz és futtatsz saját szkripteket | CurrentUser RemoteSigned | Tartós kényelem egy felhasználó számára, anélkül, hogy az összes PC-n lévő felhasználót érintené |
| Megosztott munkállomást adminisztrálsz | Értékeld a LocalMachine RemoteSigned vagy a szervezeti házirendet | Konzisztens viselkedés az összes felhasználó számára, de szélesebb hatás |
| A céged kiadó által irányított szkripteket követel meg | AllSigned a szervezet aláírási és házirend-folyamatán keresztül | Konzisztens aláírási követelmény az aláírási többletköltség árán |
| Egy telepítő vagy irányított automatizálási rendszer saját biztonsági modellel rendelkezik | Fontold meg a processz-hatókörű Bypass-t | Irányított gazdaforgatókönyvekhez tervezve; kerüld, hogy laza állandó alapértelmezett beállítás legyen |
| MachinePolicy vagy UserPolicy definiált | Kövesd az IT vagy a Csoportos házirendet | A helyi hatókör-változtatások nem a megfelelő hatóság |
Gyakori hibák, amelyek nagyobb problémát okoznak, mint az eredeti hiba
- Unrestricted vagy Bypass állandó beállítása csak egy szkript futtatásához. Ez szélesíti azt, ami futtatható, amikor egy szűkebb Process, CurrentUser vagy fájlspecifikus változtatás megoldaná a problémát.
- Minden parancs futtatása Rendszergazdaként. A CurrentUser és Process változtatásokhoz nem szükséges LocalMachine házirend-változtatás.
- A Csoportos házirend figyelmen kívül hagyása. Ha az eszköz kezelt, a házirend szándékos lehet, és egy másik hatókör helyi megváltoztatása nem helyettesíti a szervezeti irányítást.
- Szkript feloldása olvasás nélkül. Az Unblock-File eltávolítja az internetes eredet blokkolását; nem validálja a kódot.
- Feltételezni, hogy egy aláírt szkript automatikusan ártalmatlan. A Microsoft megjegyzi, hogy az aláírt kód továbbra is lehet rosszindulatú; az aláírások kiadói és integritási információt állapítanak meg, nem biztonságos viselkedés garanciáját.
- Megfeledkezni arról, melyik hatókört változtattad meg. Egy
-Scope nélküli parancs érintheti a LocalMachine-t, míg egy Process változtatás eltűnik kilépéskor.
Összegzés
A legtöbb személyes Windows szkripteléshez a CurrentUser RemoteSigned ésszerű tartós választás, ha rendszeresen futtatsz helyileg készített szkripteket, míg az Unblock-File a szűkebb választás egy felülvizsgált, internetről letöltött szkript esetén. Egy ideiglenes hibaelhárítási munkamenethez a Process RemoteSigned minimalizálja a tartósságot. A Bypass-nak jogos szerepe van az irányított automatizálásban, de a kompromisszum az, hogy a végrehajtási házirend blokkolása és figyelmeztetései eltávolításra kerülnek az adott folyamatra. Kezelt számítógépeken a Csoportos házirendet tekintendő hatóságnak, nem pedig egy akadálynak, amelyet meg kell kerülni.
A legjobb javítás tehát nem egyetlen házirend mindenkinek. Az a legkisebb hatókör és a legkevésbé engedékeny viselkedés, amely még mindig támogatja a megbízható szkriptet, amelyet futtatnod kell.