Najbezpečnejší spôsob, ako opraviť chybu „Obmedzená politika vykonávania“ v systéme Windows PowerShell, nie je skopírovať najširší príkaz, ktorý nájdete. Najprv identifikujte, ktorá politika vykonávania je skutočne účinná, a potom zvoľte najužšiu zmenu, ktorá zodpovedá tomu, čo sa snažíte spustiť.
Aktuálna dokumentácia spoločnosti Microsoft tiež zdôrazňuje dôležitosť kontextu verzie. Dokumentácia pre Windows PowerShell 5.1 uvádza Obmedzené (Restricted) ako predvolenú politiku vykonávania pre klientské počítače so systémom Windows. Súčasná dokumentácia pre PowerShell 7.6 definuje Predvolené (Default) ako RemoteSigned na systéme Windows. Ak sú však všetky rozsahy nedefinované (Undefined), Microsoft stále dokumentuje účinnú záložnú hodnotu na klientskych počítačoch so systémom Windows ako Obmedzené. Praktické ponaučenie je jednoduché: neodvozujte svoju politiku z verzie systému Windows ani z tutoriálu. Spustite príkazy politiky na počítači, kde sa vyskytuje chyba.
Táto príručka porovnáva hlavné opravy podľa rozsahu, trvalosti, vplyvu na administrátora a modelu dôvery. Cieľom je spustiť legitímny skript bez toho, aby sa oslabila bezpečnosť systému viac, než je nevyhnutné.
Čo chyba Obmedzené skutočne znamená
Pri politike Obmedzené (Restricted) systém PowerShell povoľuje jednotlivé príkazy, ale neumožňuje spúšťať skriptovacie súbory. To zahŕňa skripty PowerShell a súvisiace konfiguračné alebo skriptovacie súbory modulov. Microsoft opisuje politiku vykonávania ako bezpečnostnú funkciu, ktorá riadi podmienky, za ktorých sa načítavajú skripty a konfiguračné súbory. Nie je to bezpečnostná hranica; Microsoft výslovne uvádza, že používateľ môže stále zadávať príkazy interaktívne. Prečítajte si aktuálnu dokumentáciu about_Execution_Policies pre PowerShell 7.6 a dokumentáciu politiky vykonávania pre Windows PowerShell 5.1.
Bežná chyba hovorí, že súbor .ps1 nemožno načítať, pretože spúšťanie skriptov je zakázané; pred zmenou politiky si zaznamenajte presnú správu.
Tento rozdiel je dôležitý. Politika vykonávania môže pomôcť zabrániť náhodnému spusteniu skriptu, ale nastavenie RemoteSigned alebo Bypass nespraví skript dôveryhodným. Najprv skontrolujte skript a jeho zdroj.
Krok 1: Identifikujte účinnú politiku a všetky rozsahy
Spustite tieto dva príkazy:
Get-ExecutionPolicy
Get-ExecutionPolicy -List
Prvý vráti účinnú politiku pre aktuálnu reláciu. Druhý vypíše politiky aplikované na úrovni MachinePolicy, UserPolicy, Process, CurrentUser a LocalMachine. Microsoft odporúča Get-ExecutionPolicy -List špecificky na zobrazenie politík, ktoré môžu ovplyvniť reláciu. Pozri Get-ExecutionPolicy.
Skontrolujte všetky rozsahy namiesto predpokladu, že hodnota LocalMachine je tá, ktorá ovláda reláciu.
Ak je definovaná hodnota MachinePolicy alebo UserPolicy, zastavte sa pred pokusom vynútiť lokálne obídenie. Tieto hodnoty pochádzajú zo Skupinovej politiky a môžu prepísať nastavenia politiky vykonávania vykonané pomocou PowerShellu. Na spravovanom pracovnom počítači je správnym ďalším krokom zvyčajne dodržiavať proces organizácie alebo kontaktovať IT oddelenie.
Vyberte opravu podľa potreby, nie podľa najkratšieho príkazu
| Možnosť | Trvalosť | Administrátorské práva | Hlavný kompromis | Najvhodnejšie použitie |
Unblock-File pri použití RemoteSigned | Špecifické pre súbor | Zvyčajne bez zvýšenia oprávnení pre váš vlastný súbor | Vy explicitne dôverujete jednému stiahnutému súboru; iné stiahnuté nepodpísané súbory zostávajú podliehajúce pravidlám RemoteSigned | Jeden skontrolovaný skript stiahnutý z internetu |
Process RemoteSigned | Iba aktuálny proces PowerShell | Žiadna zmena LocalMachine | Nízka trvalosť, ale stiahnuté nepodpísané súbory môžu stále vyžadovať odblokovanie | Dočasná vývojová alebo ladiaca relácia |
CurrentUser RemoteSigned | Trvá pre váš používateľský účet | Nevyžaduje zmenu pre všetkých používateľov | Pohodlné pre pravidelné lokálne skriptovanie; širšie ako zmena pre jednu reláciu | Osobný vývojový pracovný počítač |
LocalMachine RemoteSigned | Trvá pre všetkých používateľov | Vyžaduje zvýšenie oprávnení | Širší vplyv na celý počítač | Zdieľaný počítač, kde administrátor zámerne chce rovnakú politiku pre všetkých používateľov |
AllSigned | Závisí od rozsahu | Závisí od rozsahu | Vyžaduje podpisy aj pre lokálne vytvorené skripty; pridáva réžiu certifikátov a procesu podpisovania | Organizácie s procesom podpisovania kódu |
Bypass | Závisí od rozsahu; bežne používané na rozsahu Process | Závisí od rozsahu | Žiadne blokovanie skriptov, varovania ani výzvy zo strany politiky vykonávania | Riadená automatizácia s vlastným modelom dôvery a bezpečnosti, nie bežné trvalé nastavenie |
Krok 2: Používajte administrátorské práva iba pre zmenu na úrovni celého počítača
Nemusíte otvárať zvýšený PowerShell len preto, aby ste zmenili rozsah CurrentUser alebo Process. Microsoft uvádza, že zvýšenie oprávnení je potrebné pri zmene politiky pre lokálny počítač, čo znamená LocalMachine. Toto je užitočný kompromis: ak iba váš používateľský účet potrebuje lokálne skriptovanie, zmena politiky pre každého používateľa pridáva rozsah bez pridania výhody.
Spustiť ako správca je vhodné pre zámerne vykonanú zmenu LocalMachine, ale je zbytočné pre rozsah Process alebo CurrentUser.
Odporúčanie podľa potreby: použite CurrentUser pre vývojársky účet, ktorý pravidelne spúšťa lokálne vytvorené skripty. Vyhradzujte LocalMachine pre administrátora, ktorý zámerne chce, aby rovnaké nastavenie ovplyvnilo všetkých používateľov.
Krok 3: Pre pravidelné lokálne skriptovanie zvážte CurrentUser RemoteSigned
Pre mnoho osobných vývojových počítačov je praktickou trvalou voľbou:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
RemoteSigned umožňuje spúšťať lokálne skripty bez požiadavky na podpis, zatiaľ čo skripty označené ako stiahnuté z internetu vyžadujú dôveryhodný digitálny podpis, pokiaľ súbor explicitne neodblokujete. To zachováva užitočné rozlíšenie medzi kódom, ktorý ste vytvorili lokálne, a kódom získaným z iného zdroja.
Táto ilustrácia ukazuje príkaz RemoteSigned pre celý počítač, pretože rozsah je vynechaný; LocalMachine je predvolený rozsah. Uprednostňujte explicitný rozsah, aby bol vplyv zámerný.
Bežnou chybou je spustenie Set-ExecutionPolicy RemoteSigned bez -Scope. Microsoft dokumentuje LocalMachine ako predvolený rozsah pri nastavovaní politiky vykonávania. Preto je lepšie byť explicitný:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Zmena je účinná okamžite; PowerShell nemusí byť reštartovaný pre zmeny CurrentUser alebo LocalMachine.
Krok 4: Pre dočasnú reláciu uprednostnite politiku s rozsahom Process
Ak ladicie problémy alebo spúšťate dôveryhodný lokálny skript raz, vyhnite sa trvalej zmene používateľa alebo počítača. Užšou možnosťou je:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
Rozsah Process sa vzťahuje iba na aktuálnu reláciu PowerShell. Microsoft uvádza, že je uložený v premennej prostredia $Env:PSExecutionPolicyPreference a je odstránený pri zatvorení procesu.
Ak väčšia aplikácia, inštalátor alebo riadené prostredie automatizácie už má svoj vlastný bezpečnostný model, PowerShell tiež poskytuje Bypass:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Bypass s rozsahom Process zmizne, keď sa proces PowerShell zatvorí, ale tiež odstráni varovania a blokovanie politiky vykonávania pre túto reláciu.
Kompromis: Rozsah Process minimalizuje trvalosť, ale Bypass je širší ako RemoteSigned v rámci tejto relácie. Microsoft opisuje Bypass ako nič neblokujúci a nezobrazujúci žiadne varovania ani výzvy a uvádza, že je určený pre scenáre, kde inú aplikáciu poskytuje bezpečnostný model. Pre bežnú interaktívnu ladiacu reláciu použite najprv Process RemoteSigned, pokiaľ nemáte konkrétny dôvod pre Bypass.
Pre samostatný jednorazový proces Windows PowerShell môžete tiež spustiť:
powershell.exe -ExecutionPolicy RemoteSigned -File .\script.ps1
Pre PowerShell 7 je spustiteľný súbor pwsh.exe. Nastavenie politiky vykonávania z príkazového riadku stále neprepíše politiku vykonávania vynútenú Skupinovou politikou.
Krok 5: Ak RemoteSigned blokuje stiahnutý skript, odblokujte iba tento súbor
RemoteSigned zaobchádza s súbormi označenými ako pochádzajúce z internetu odlišne. Microsoft dokumentuje cmdlet Unblock-File ako odstraňujúci túto značku internetovej zóny, čo umožňuje spustiť skontrolovaný nepodpísaný skript pod pravidlami RemoteSigned.
Najprv skontrolujte skript. Ak dôverujete zdroju a skontrolovali ste obsah, spustite:
Unblock-File -Path .\script.ps1
Môžete tiež použiť zaškrtávacie políčko Odblokovať (Unblock) v dialógovom okne Vlastnosti súboru. Microsoft uvádza, že Unblock-File vykonáva rovnakú základnú operáciu. Pozri Unblock-File.
Odblokovanie jedného skontrolovaného stiahnutého skriptu je užšie ako oslabenie politiky pre každý skript v počítači.
Môžete skontrolovať, či má súbor alternatívny dátový prúd Zone.Identifier pomocou:
Get-Item .\script.ps1 -Stream Zone.Identifier -ErrorAction SilentlyContinue
Microsoft uvádza, že metódy sťahovania neoznačujú všetky súbory rovnakým spôsobom, takže neprítomnosť tohto prúdu nie je dôkazom, že je skript bezpečný.
Krok 6: Použite AllSigned, keď má organizácia proces podpisovania
AllSigned vyžaduje, aby všetky skripty a konfiguračné súbory boli podpísané dôveryhodným vydavateľom, vrátane skriptov vytvorených lokálne. To poskytuje organizácii konzistentný proces dôvery vydavateľa, ale tiež vytvára operačnú réžiu: skripty potrebujú podpisy Authenticode a používatelia musia dôverovať príslušným vydavateľom.
Dokumentácia spoločnosti Microsoft about_Signing vysvetľuje, ako PowerShell kontroluje podpisy skriptov a ako fungujú výzvy na dôveryhodných vydavateľov.
Odporúčanie podľa potreby: AllSigned dáva zmysel, keď vaša organizácia už má certifikáty na podpisovanie kódu, kontrolu publikovania a proces na aktualizáciu podpísaných skriptov. Pre samostatného vývojára píšuceho lokálne utilitné skripty zvyčajne RemoteSigned zahŕňa menej trenia, pričom stále zachováva kontrolu pôvodu z internetu.
Krok 7: Nebojujte so Skupinovou politikou na spravovanom PC
PowerShell vystavuje dva rozsahy politiky, ktoré pochádzajú zo Skupinovej politiky: MachinePolicy a UserPolicy. Dokumentácia Skupinovej politiky Microsoftu uvádza, že nastavenie Zapnúť spúšťanie skriptov môže vynútiť správanie Obmedzené (Restricted), RemoteSigned alebo AllSigned pre spravovaných používateľov a počítače. Nastavenie sa nachádza pod:
Administrative Templates\Windows Components\Windows PowerShell
Pozri about_Group_Policy_Settings.
Ak Get-ExecutionPolicy -List zobrazuje definovanú MachinePolicy alebo UserPolicy, lokálny príkaz Set-ExecutionPolicy vám nemusí poskytnúť očakávané účinné správanie. Praktickým riešením je požiadať administrátora o príslušnú politiku, použiť podpísaný skript, ak je to vyžadované, alebo použiť schválenú metódu nasadenia.
Krok 8: Obnovte nastavenie, ktoré ste skutočne zmenili, a potom overte
Pred zmenou trvalého rozsahu si zaznamenajte jeho existujúcu hodnotu:
Get-ExecutionPolicy -Scope CurrentUser
Get-ExecutionPolicy -Scope LocalMachine
Ak budete neskôr potrebovať odstrániť hodnotu politiky, ktorú ste nastavili, Microsoft dokumentuje nastavenie tohto rozsahu na Undefined:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Undefined
Nespúšťajte naslepo Set-ExecutionPolicy Restricted len preto, že snímka obrazovky ju zobrazuje. Bez rozsahu príkaz cieli na LocalMachine predvolene a „Obmedzené“ nemuselo byť predchádzajúcou hodnotou tohto rozsahu.
Snímka obrazovky ilustruje zmenu na Obmedzené, ale skutočné vrátenie späť by malo obnoviť rozsah a hodnotu, ktoré ste si zaznamenali, namiesto hádania predchádzajúcej konfigurácie.
Nakoniec overte účinnú politiku aj skript:
Get-ExecutionPolicy
Get-ExecutionPolicy -List
.\script.ps1
Úspešné spustenie skriptu potvrdzuje, že bezprostredný príznak je vyriešený; znova skontrolujte zoznam politík, aby ste sa uistili, že ste nezanechali širší rozsah zmenený neúmyselne.
Ktorú opravu by ste si mali vybrať?
| Vaša situácia | Odporúčaný východiskový bod | Prečo |
| Stiahli ste jeden skript zo zdroja, ktorému dôverujete | Ponechajte RemoteSigned a po kontrole použite Unblock-File | Zmení dôveru pre jeden súbor namiesto všetkých skriptov |
| Potrebujete skripty iba v aktuálnej ladiacej relácii | Process RemoteSigned | Zatvorí sa spolu s reláciou a zachová obmedzenia pôvodu z internetu |
| Pravidelne píšete a spúšťate vlastné skripty | CurrentUser RemoteSigned | Trvalé pohodlie pre jedného používateľa bez ovplyvnenia všetkých na PC |
| Spravujete zdieľaný pracovný počítač | Vyhodnoťte LocalMachine RemoteSigned alebo organizačnú politiku | Konzistentné správanie pre všetkých používateľov, ale širší vplyv |
| Vaša firma vyžaduje skripty kontrolované vydavateľom | AllSigned prostredníctvom procesu podpisovania a politiky organizácie | Konzistentná požiadavka na podpis za cenu réžie podpisovania |
| Inštalátor alebo riadený systém automatizácie má svoj vlastný bezpečnostný model | Zvážte Bypass s rozsahom process | Navrhnuté pre riadené hostiteľské scenáre; vyhnite sa tomu, aby sa stalo bežným trvalým predvoleným nastavením |
| Je definovaná MachinePolicy alebo UserPolicy | Dodržujte IT alebo Skupinovú politiku | Zmeny lokálneho rozsahu nie sú správnou autoritou |
Bežné chyby, ktoré vytvoria väčší problém ako pôvodná chyba
- Nastavenie Unrestricted alebo Bypass trvalo len preto, aby ste spustili jeden skript. Toto rozširuje to, čo môže byť vykonané, keď užšia zmena Process, CurrentUser alebo špecifická pre súbor môže problém vyriešiť.
- Spúšťanie každého príkazu ako Správca. Zmeny CurrentUser a Process nevyžadujú zmenu politiky LocalMachine.
- Ignorovanie Skupinovej politiky. Ak je zariadenie spravované, politika môže byť zámerná a lokálna zmena iného rozsahu nenahrádza organizačnú kontrolu.
- Odblokovanie skriptu bez jeho prečítania. Unblock-File odstráni blokovanie pôvodu z internetu; neoveruje kód.
- Predpoklad, že podpísaný skript je automaticky neškodný. Microsoft uvádza, že podpísaný kód môže byť stále škodlivý; podpisy establishing vydavateľa a informácie o integrite, nie záruku bezpečného správania.
- Zabudnutie, ktorý rozsah ste zmenili. Príkaz bez
-Scope môže ovplyvniť LocalMachine, zatiaľ čo zmena Process zmizne pri ukončení.
Záver
Pre väčšinu osobných skriptovacích úloh vo Windows je CurrentUser RemoteSigned rozumnou trvalou voľbou, keď pravidelne spúšťate lokálne vytvorené skripty, zatiaľ čo Unblock-File je užšou voľbou pre jeden skontrolovaný skript stiahnutý z internetu. Pre dočasnú ladiacu reláciu Process RemoteSigned minimalizuje trvalosť. Bypass má legitímnu úlohu v riadenej automatizácii, ale jeho kompromisom je, že blokovanie a varovania politiky vykonávania sú pre tento proces odstránené. Na spravovaných počítačoch by sa Skupinová politika mala považovať za autoritu, a nie za prekážku, ktorú treba obísť.
Najlepšou opravou preto nie je jedna politika pre všetkých. Je to najmenší rozsah a najmenej povolené správanie, ktoré stále podporuje dôveryhodný skript, ktorý potrebujete spustiť.