Turvallisin tapa korjata “Execution Policy Restricted” -virhe Windows PowerShellissa ei ole kopioida laajinta mahdollista komentoa. Tunnista ensin, mikä suoritusperiaate on todellisuudessa voimassa, ja valitse sitten kapein muutos, joka sopii siihen, mitä yrität suorittaa.
Microsoftin nykyinen dokumentointi korostaa myös versioyhteyden tärkeyttä. Windows PowerShell 5.1 -dokumentaatio luettelee Restricted-periaatteen oletussuoritusperiaatteeksi Windows-asiakastietokoneilla. Nykyinen PowerShell 7.6 -dokumentaatio määrittelee Default-arvon olevan RemoteSigned Windowsissa. Jos kaikki laajuudet ovat Undefined, Microsoft kuitenkin dokumentoi Windows-asiakkaiden tehokkaaksi varajärjestelmäksi edelleen Restricted. Käytännön opetus on yksinkertainen: älä päättele periaatettasi Windows-versiostasi tai oppaasta. Suorita periaatekomennot koneella, jossa virhe esiintyy.
Tämä opas vertaa keskeisiä korjauksia laajuuden, pysyvyyden, hallinnollisen vaikutuksen ja luottamusmallin perusteella. Tavoitteena on saada laillinen skripti toimimaan heikentämättä järjestelmää enempää kuin on välttämätöntä.
Mitä Restricted-virhe todellisuudessa tarkoittaa
Restricted-periaatteen alla PowerShell sallii yksittäiset komennot, mutta ei salli skriptitiedostojen suorittamista. Tämä sisältää PowerShell-skriptit ja niihin liittyvät määritystiedostot tai moduuliskriptitiedostot. Microsoft kuvaa suoritusperiaatetta turvaominaisuudeksi, joka ohjaa ehtoja, joilla skriptit ja määritystiedostot ladataan. Se ei ole turvallisuusraja; Microsoft huomauttaa nimenomaisesti, että käyttäjä voi edelleen kirjoittaa komentoja interaktiivisesti. Lue nykyinen about_Execution_Policies -dokumentaatio PowerShell 7.6:lle ja Windows PowerShell 5.1 -suoritusperiaatedokumentointi.
Yleinen virhe ilmoittaa, että .ps1-tiedostoa ei voi ladata, koska skriptien suorittaminen on poistettu käytöstä; tallenna tarkka viesti ennen periaatteen muuttamista.
Tuo ero on merkittävä. Suoritusperiaate voi auttaa estämään tahattoman skriptien suorittamisen, mutta RemoteSigned tai Bypass -asetus ei tee skriptistä luotettavaa. Tarkista skripti ja sen lähde ensin.
Vaihe 1: tunnistava tehokas periaate ja jokainen laajuus
Suorita nämä kaksi komentoa:
Get-ExecutionPolicy
Get-ExecutionPolicy -List
Ensimmäinen palauttaa nykyisen istunnon tehokkaan periaatteen. Toinen luettelee periaatteet, jotka on sovellettu MachinePolicy, UserPolicy, Process, CurrentUser ja LocalMachine -laajuuksissa. Microsoft suosittelee nimenomaisesti Get-ExecutionPolicy -List -komentoa nähdäksesi periaatteet, jotka voivat vaikuttaa istuntoon. Katso Get-ExecutionPolicy.
Tarkista kaikki laajuudet sen sijaan, että olettaisit LocalMachine-arvon olevan se, joka ohjaa istuntoa.
Jos MachinePolicy tai UserPolicy on määritelty, lopeta ennen paikallisen kiertotien pakottamista. Nämä arvot tulevat ryhmäkäytännöstä ja voivat ohittaa PowerShellilla tehdyt suoritusperiaateasetukset. Hallinnoidulla työasemalla oikea seuraava askel on yleensä noudattaa organisaation prosessia tai ottaa yhteyttä IT-tukeen.
Valitse korjaus tarpeen, ei lyhimmän komennon perusteella
| Vaihtoehto | Pysyvyys | Hallinnointioikeudet | Pääasiallinen kompromissi | Paras käyttötarkoitus |
Unblock-File käytettäessä RemoteSignedia | Tiedostokohtainen | Yleensä ei vaadi korotusta omalle tiedostolle | Luotat nimenomaisesti yhteen ladattuun tiedostoon; muut ladatut allekirjoittamattomat tiedostot ovat edelleen RemoteSignedin alaisia | Yksi tarkistettu skripti, joka on ladattu internetistä |
Process RemoteSigned | Vain nykyinen PowerShell-prosessi | Ei LocalMachine-muutosta | Alhainen pysyvyys, mutta ladatut allekirjoittamattomat tiedostot voivat silti vaatia eston poistoa | Väliaikainen kehitys- tai vianetsintäistunto |
CurrentUser RemoteSigned | Pysyy voimassa käyttäjätililläsi | Ei vaadi kaikkien käyttäjien muuttamista | Kätevää säännölliseen paikalliseen skriptaukseen; laajempi kuin yhden istunnon muutos | Henkilökohtainen kehitystyöasema |
LocalMachine RemoteSigned | Pysyy voimassa kaikille käyttäjille | Vaatii korotuksen | Laajempi vaikutus tietokoneella | Jaettu kone, jossa järjestelmänvalvoja haluaa tietoisesti saman periaatteen kaikille käyttäjille |
AllSigned | Riippuu laajuudesta | Riippuu laajuudesta | Vaatii allekirjoituksia myös paikallisesti luoduille skripteille; lisää sertifikaatti- ja allekirjoitusprosessin kuormaa | Organisaatiot, joilla on koodin allekirjoitusprosessi |
Bypass | Riippuu laajuudesta; käytetään yleisesti Process-laajuudessa | Riippuu laajuudesta | Ei skriptien estoja, varoituksia tai kehotteita suoritusperiaatteelta | Ohjattu automaatio, jolla on oma luottamus- ja turvallisuusmalli, ei huolimaton pysyvä asetus |
Vaihe 2: käytä järjestelmänvalvojan oikeuksia vain koneen laajuisiin muutoksiin
Et tarvitse korotettua PowerShellia pelkästään CurrentUser- tai Process-laajuuden muuttamiseen. Microsoftin mukaan korotus vaaditaan, kun muutetaan periaatetta paikalliselle tietokoneelle, eli LocalMachine. Tämä on hyödyllinen kompromissi: jos vain sinun käyttäjätilisi tarvitsee paikallista skriptauksen, kaikkien käyttäjien periaatteen muuttaminen laajentaa vaikutusaluetta tuomatta lisähyötyä.
Suorita järjestelmänvalvojana on sopivaa tietoiselle LocalMachine-muutokselle, mutta se on tarpeetonta Process- tai CurrentUser-laajuudelle.
Suositus tarpeen mukaan: käytä CurrentUser-laajuutta kehittäjätilille, joka suorittaa säännöllisesti paikallisesti laadittuja skriptejä. Varaa LocalMachine järjestelmänvalvojalle, joka tietoisesti haluaa saman asetuksen vaikuttavan kaikkiin käyttäjiin.
Vaihe 3: harkitse CurrentUser RemoteSignedia säännölliseen paikalliseen skriptaukseen
Monilla henkilökohtaisilla kehityskoneilla käytännöllinen pysyvä valinta on:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
RemoteSigned sallii paikallisten skriptien suorittamisen ilman allekirjoitusta, kun taas skriptit, jotka on merkitty ladatuiksi internetistä, vaativat luotettavan digitaalisen allekirjoituksen, ellet nimenomaisesti poista tiedoston estoa. Tämä säilyttää hyödyllisen eron paikallisesti luomasi koodin ja muusta lähteestä hankitun koodin välillä.
Tämä kuva esittää koneen laajuista RemoteSigned-komentoa, koska laajuus on jätetty pois; LocalMachine on oletuslaajuus. Suosi nimenomaista laajuutta, jotta vaikutus on tietoinen.
Yleinen virhe on suorittaa Set-ExecutionPolicy RemoteSigned ilman -Scope-parametria. Microsoft dokumentoi LocalMachine-laajuuden oletuslaajuudeksi asetettaessa suoritusperiaatetta. Siksi nimenomaisuus on parempi:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Muutos on voimassa välittömästi; PowerShellia ei tarvitse käynnistää uudelleen CurrentUser- tai LocalMachine-muutosten jälkeen.
Vaihe 4: väliaikaiseen istuntoon, suosii Process-laajuuden periaatetta
Jos etsit vikaa tai suoritat luotettavan paikallisen skriptin kerran, vältä pysyvää käyttäjä- tai konekohtaista muutosta. Kapeampi vaihtoehto on:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
Process-laajuus koskee vain nykyistä PowerShell-istuntoa. Microsoftin mukaan se tallennetaan $Env:PSExecutionPolicyPreference-ympäristömuuttujaan ja poistetaan prosessin sulkeutuessa.
Jos suurella sovelluksella, asennusohjelmalla tai ohjatulla automaatioympäristöllä on jo oma turvallisuusmallinsa, PowerShell tarjoaa myös Bypass:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Process-laajuuden Bypass katoaa, kun PowerShell-prosessi sulkeutuu, mutta se poistaa myös suoritusperiaatteen varoitukset ja estot kyseisessä istunnossa.
Kompromissi: Process-laajuus minimoi pysyvyyden, mutta Bypass on laajempi kuin RemoteSigned kyseisessä istunnossa. Microsoft kuvaa Bypassin estävän mitään eikä näyttävän varoituksia tai kehotteita, ja sanoo sen olevan tarkoitettu tilanteisiin, joissa toinen sovellus tarjoaa turvallisuusmallin. Tavalliseen interaktiiviseen vianetsintäistuntoon käytä ensin Process RemoteSigned, ellet ole erityistä syytä käyttää Bypassia.
Erillistä kertaluonteista Windows PowerShell -prosessia varten voit myös käynnistää:
powershell.exe -ExecutionPolicy RemoteSigned -File .\script.ps1
PowerShell 7:ssä suoritettavan tiedoston nimi on pwsh.exe. Komentorivisuoritusperiaateasetus ei silti ohita ryhmäkäytännön pakottamaa suoritusperiaatetta.
Vaihe 5: jos RemoteSigned estää ladatun skriptin, poista vain kyseisen tiedoston esto
RemoteSigned käsittelee internetistä peräisin oleviksi merkittyjä tiedostoja eri tavalla. Microsoft dokumentoi Unblock-File-komentokehotteen poistavan tuon internetvyöhykemerkin, mikä mahdollistaa tarkistetun allekirjoittamattoman skriptin suorittamisen RemoteSignedin alla.
Tarkista skripti ensin. Jos luotat lähteeseen ja olet tarkistanut sisällön, suorita:
Unblock-File -Path .\script.ps1
Voit myös käyttää Unblock-valintaruutua tiedoston Ominaisuudet-valintaikkunassa. Microsoft ilmoittaa, että Unblock-File suorittaa saman perustoiminnon. Katso Unblock-File.
Yhden tarkistetun ladatun skriptin eston poistaminen on kapeampaa kuin periaatteen heikentäminen kaikille koneen skripteille.
Voit tarkistaa, onko tiedostossa Zone.Identifier-vaihtoehtoinen tietovirta, komennolla:
Get-Item .\script.ps1 -Stream Zone.Identifier -ErrorAction SilentlyContinue
Microsoft huomauttaa, että lataustavat eivät merkitse tiedostoja samalla tavalla, joten kyseisen virran puuttuminen ei ole todiste skriptin turvallisuudesta.
Vaihe 6: käytä AllSignedia, kun organisaatiolla on allekirjoitusprosessi
AllSigned vaatii, että kaikki skriptit ja määritystiedostot ovat luotettavan julkaisijan allekirjoittamia, mukaan lukien paikallisesti luodut skriptit. Tämä antaa organisaatiolle johdonmukaisen julkaisijaluottamusprosessin, mutta se luo myös operatiivista kuormaa: skriptit tarvitsevat Authenticode-allekirjoituksia ja käyttäjien on luotettava asiaankuuluviin julkaisijoihin.
Microsoftin about_Signing-dokumentointi selittää, kuinka PowerShell tarkistaa skriptien allekirjoitukset ja kuinka luotettavan julkaisijan kehotteet toimivat.
Suositus tarpeen mukaan: AllSigned on järkevää, kun organisaatiollasi on jo koodin allekirjoitussertifikaatteja, julkaisukontrollia ja prosessi allekirjoitettujen skriptien päivittämiseen. Yksittäiselle kehittäjälle, joka kirjoittaa paikallisia apuskriptejä, RemoteSigned aiheuttaa yleensä vähemmän kitkaa säilyttäen silti internetperäisyystarkistuksen.
Vaihe 7: älä taistele ryhmäkäytäntöä vastaan hallinnoidulla tietokoneella
PowerShell paljastaa kaksi ryhmäkäytännöstä tulevaa periaatelaajuutta: MachinePolicy ja UserPolicy. Microsoftin ryhmäkäytäntödokumentointi sanoo, että Turn on Script Execution -asetus voi pakottaa Restricted-, RemoteSigned- tai AllSigned-käyttäytymisen hallinnoiduille käyttäjille ja tietokoneille. Asetus on kohdassa:
Administrative Templates\Windows Components\Windows PowerShell
Katso about_Group_Policy_Settings.
Jos Get-ExecutionPolicy -List näyttää määritellyn MachinePolicy- tai UserPolicy-arvon, paikallinen Set-ExecutionPolicy-komento ei välttämättä tuota odottamaasi tehokasta käyttäytymistä. Käytännöllinen ratkaisu on pyytää asianmukaista periaatetta järjestelmänvalvojalta, käyttää allekirjoitettua skriptiä, jos vaaditaan, tai käyttää hyväksyttyä käyttöönottomenetelmää.
Vaihe 8: palauta todellisuudessa muuttamasi asetus ja varmista se
Ennen pysyvän laajuuden muuttamista, tallenna sen olemassa oleva arvo:
Get-ExecutionPolicy -Scope CurrentUser
Get-ExecutionPolicy -Scope LocalMachine
Jos sinun myöhemmin tarvitsee poistaa asettamasi periaatearvo, Microsoft dokumentoi kyseisen laajuuden asettamisen arvoon Undefined:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Undefined
Älä sokeasti suorita Set-ExecutionPolicy Restricted vain siksi, että kuvakaappaus näyttää sen. Ilman laajuutta komento kohdistuu oletuksena LocalMachineen, ja “Restricted” ei välttämättä ollut kyseisen laajuuden aiempi arvo.
Kuvakaappaus havainnollistaa Restricted-muutosta, mutta todellisen palautuksen tulisi palauttaa tallentamasi laajuus ja arvo sen sijaan, että arvaisit aiemman kokoonpanon.
Lopuksi varmista sekä tehokas periaate että skripti:
Get-ExecutionPolicy
Get-ExecutionPolicy -List
.\script.ps1
Onnistunut skriptin suoritus vahvistaa, että välitön oire on korjattu; tarkista periaatelista uudelleen varmistaaksesi, ettet jättänyt laajempaa laajuutta tahattomasti muutetuksi.
Millaisen korjauksen sinun tulisi valita?
| Tilanteesi | Suositeltu lähtökohta | Miksi |
| Latasit yhden skriptin luotettavasta lähteestä | Pidä RemoteSigned ja käytä Unblock-File tarkistuksen jälkeen | Muuttaa luottamusta yhteen tiedostoon sen sijaan, että se koskisi kaikkia skriptejä |
| Tarvitset skriptejä vain nykyisessä vianetsintäistunnossa | Process RemoteSigned | Sulkeutuu istunnon mukana ja säilyttää internetperäisyysrajoitukset |
| Kirjoitat ja suoritat säännöllisesti omia skriptejäsi | CurrentUser RemoteSigned | Pysyvä kätevyys yhdelle käyttäjälle vaikuttamatta kaikkiin tietokoneen käyttäjiin |
| Hallinnoit jaettua työasemaa | Arvioi LocalMachine RemoteSigned tai organisaation periaate | Johdonmukainen käyttäytyminen kaikille käyttäjille, mutta laajempi vaikutus |
| Yrityksesi vaatii julkaisijan hallinnoimia skriptejä | AllSigned organisaation allekirjoitus- ja periaateprosessin kautta | Johdonmukainen allekirjoitusvaatimus allekirjoituksen kuormaa vastaan |
| Asennusohjelmalla tai ohjatulla automaatiojärjestelmällä on oma turvallisuusmallinsa | Harkitse prosessikohtaista Bypass-asetusta | Suunniteltu ohjattuihin isäntätilanteisiin; vältä tekemästä siitä huomatonta pysyvää oletusta |
| MachinePolicy tai UserPolicy on määritelty | Noudata IT:tä tai ryhmäkäytäntöä | Paikalliset laajuusmuutokset eivät ole oikea auktoriteetti |
Yleiset virheet, jotka luovat alkuperäistä virhettä suuremman ongelman
- Aseta Unrestricted tai Bypass pysyvästi vain yhden skriptin saamiseksi toimimaan. Tämä laajentaa sitä, mitä voidaan suorittaa, kun kapeampi Process-, CurrentUser- tai tiedostokohtainen muutos saattaisi ratkaista ongelman.
- Suorita jokainen komento järjestelmänvalvojana. CurrentUser- ja Process-muutokset eivät vaadi LocalMachine-periaatemuutosta.
- Ohita ryhmäkäytäntö. Jos laite on hallinnoitu, periaate voi olla tarkoituksellinen, eikä paikallinen toisen laajuuden muuttaminen korvaa organisaation kontrollia.
- Poista skriptin esto lukematta sitä. Unblock-File poistaa internetperäisyyseston; se ei validoi koodia.
- Oleta allekirjoitetun skriptin olevan automaattisesti vaaraton. Microsoft huomauttaa, että allekirjoitettu koodi voi silti olla haitallista; allekirjoitukset perustavat julkaisija- ja eheyystietoja, eivät takuuta turvallisesta käyttäytymisestä.
- Unohda, mikä laajuus muutettiin. Komento ilman
-Scope-parametria voi vaikuttaa LocalMachineen, kun taas Process-muutos katoaa poistuttaessa.
Yhteenveto
Useimmille henkilökohtaisille Windows-skriptauksille CurrentUser RemoteSigned on kohtuullinen pysyvä valinta, kun suoritat säännöllisesti paikallisesti luotuja skriptejä, kun taas Unblock-File on kapeampi valinta yhdelle internetistä ladatulle tarkistetulle skriptille. Väliaikaiseen vianetsintäistuntoon Process RemoteSigned minimoi pysyvyyden. Bypass:lla on laillinen rooli ohjatussa automaatiossa, mutta sen kompromissi on, että suoritusperiaatteen esto ja varoitukset poistetaan kyseiseltä prosessilta. Hallinnoiduilla tietokoneilla ryhmäkäytäntöä tulisi kohdella auktoriteettina eikä esteenä, jonka kiertää.
Paras korjaus ei siis ole yksi periaate kaikille. Se on pienin laajuus ja vähiten salliva käyttäytyminen, joka silti tukee luotettua skriptiä, jota sinun tarvitsee suorittaa.