Jak włączyć wykonywanie skryptów PowerShell?

260

Podczas próby wykonania skryptu programu PowerShell pojawia się ten błąd:

Nie można załadować pliku C: \ Common \ Scripts \ hello.ps1, ponieważ wykonywanie skryptów jest wyłączone w tym systemie. Aby uzyskać więcej informacji, zobacz „Get-help about_signing”.
W wierszu: 1 znak: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Pavel Chuchuva
źródło

Odpowiedzi:

399
  1. Uruchom program Windows PowerShell z opcją „Uruchom jako administrator”. Tylko członkowie grupy Administratorzy na komputerze mogą zmieniać zasady wykonywania.

  2. Włącz uruchamianie niepodpisanych skryptów, wprowadzając:

    set-executionpolicy remotesigned
    

Umożliwi to uruchamianie niepodpisanych skryptów pisanych na komputerze lokalnym i podpisywanych skryptów z Internetu.

Zobacz także Uruchamianie skryptów w Microsoft TechNet Library.

Pavel Chuchuva
źródło
3
Czy to zmieni zasady na stałe, czy też muszę to robić przy każdym ponownym uruchomieniu komputera?
Ray
1
@Ray Spowoduje to trwałą zmianę zasad.
Pavel Chuchuva
1
@ Promień Zobacz dokumentację . Domyślnie ustawia to dla LocalMachine. Aby ustawić dla innych zakresów ( CurrentUserlub Process), podaj -Scopejawnie.
jpmc26
@PavelChuchuva, czy powinienem dodać tę linię na górze mojego skryptu, co miałeś na myśli
FabioSpaghetti
@FabioSpaghetti Nie musisz nic dodawać do swoich skryptów. Wystarczy wykonać to polecenie raz, wykonując następujące czynności.
Pavel Chuchuva
74

Domyślne zasady wykonywania są ustawione jako ograniczone, możesz je zobaczyć, wpisując:

Get-ExecutionPolicy

Wpisz następujące polecenie, aby przejść do trybu nieograniczonego:

Set-ExecutionPolicy unrestricted

Mam nadzieję że to pomoże

William Hilsum
źródło
13
Wymaganie podpisywania ma sens, jeśli użytkownik spodziewa się, że użytkownik skopiuje i wklei złośliwe skrypty z Internetu. Jeśli zakładasz, że użytkownik nie jest głupi, to „remotesigned” nie dodaje żadnych zabezpieczeń i utrudnia życie.
Guss,
@Guss: Podczas testowania tego stwierdziłem, że RemoteSigned nie wymaga już podpisywania generowanych lokalnie plików .ps1 i traktuje kontrolę źródła git jako źródło lokalne.
Joshua
@Joshua - tak, dokładnie o to mi chodzi. Jeśli RemoteSignednie blokuje kopiowania i wklejania, nie blokuje gita lub innych metod pobierania innych niż IE, to po co to jest dobre? Powiedz to ze mną: „absolutnie nic!”. Myślę, że wymaganie podpisywania skryptów przy użyciu certyfikatu do podpisywania kodu za 100 USD jest bezużyteczne, głupie i neguje wszystkie zalety dobrego języka skryptowego dla systemu Windows. To powiedziawszy, jeśli sposobem na to, aby użytkownicy zrozumieli, co robią, aby korzystać ze skryptów PS, być może będziemy zbyt sth ... Nahhhh, to nigdy nie zadziała ;-)
Guss
@Guss: Mam już dobry język skryptowy w systemie Windows. Cygwin działa świetnie w systemie Windows 10; jak dosłownie o wiele lepiej niż w jakiejkolwiek wcześniejszej wersji systemu Windows. Chcę tylko pisać skrypty, które ktoś już napisał.
Joshua
61

Na mojej maszynie, której używam do tworzenia skryptów, użyję-nieograniczonego jak wyżej. Jednak podczas wdrażania moich skryptów na komputerze użytkownika końcowego po prostu wywołam PowerShell za pomocą przełącznika -executionpolicy:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1
MDMoore313
źródło
2
Możesz połączyć tę sztuczkę z poliglotą w pliku .CMD. Zobacz stackoverflow.com/a/8597794/5314
Jay Bazuzi
Miły! Wdrażam
MDMoore313 15.01.2013
1
Ta sztuczka pozwoliła mi uruchomić skrypt PowerShell z Git Bash (bash MINGW32)
Kamil Szot
16

Możemy uzyskać status bieżącej ExecutionPolicy za pomocą poniższego polecenia:

Get-ExecutionPolicy;

Domyślnie jest ograniczony . Aby umożliwić wykonywanie skryptów PowerShell, musimy ustawić ExecutionPolicy na Bypass lub Unrestricted .

Możemy ustawić zasady dla bieżącego użytkownika jako Bypasslub Unrestrictedza pomocą dowolnego z poniższych poleceń PowerShell:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;

Nieograniczone zasady ładują wszystkie pliki konfiguracyjne i uruchamiają wszystkie skrypty. Jeśli uruchomisz niepodpisany skrypt pobrany z Internetu, przed uruchomieniem zostaniesz zapytany o pozwolenie.

Natomiast w polityce Bypass nic nie jest blokowane, a podczas wykonywania skryptu nie ma żadnych ostrzeżeń ani monitów. Bypass ExecutionPolicy jest bardziej zrelaksowany niż nieograniczony.

Pratik Patil
źródło
5

W zależności od wersji i konfiguracji systemu Windows może pojawić się następujące ostrzeżenie, nawet w Unrestrictedtrybie:

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this
script can potentially harm your computer. If you trust this script, use the 
Unblock-File cmdlet to allow the script to run without this warning message. 
Do you want to run?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D")

Rozwiązaniem jest użycie zasady „obejścia”, włączonej za pomocą następującego polecenia:

Set-ExecutionPolicy Bypass

Z dokumentacji :

Bypass: Nic nie jest zablokowane i nie ma ostrzeżeń ani podpowiedzi.

Jest to oczywiście niepewne, proszę zrozumieć związane z tym ryzyko.

Benoit Blanchon
źródło
był to jedyny sposób, w jaki udało mi się uruchomić mój skrypt w środowisku WINE z PowerShell 2.0. Dziękuję Ci.
Wyatt8740,
@ Wyatt8740: Ponieważ wine przedstawia wszystkie dyski jako dyski sieciowe.
Joshua
@Joshua Nie miałem pojęcia. czy możesz podać mi źródło tego oświadczenia? próbowałem zwykłego google, ale najwyraźniej źle wyglądam.
Wyatt8740
@ Wyatt8740: Źródło: Wspólne okno dialogowe OpenFileName wina. Spójrz na ikony dysku.
Joshua
@Joshua Miałem na myśli źródło kodu źródłowego; ikony są prawdopodobnie dowolne. Ale nie pomyślałem o tym; To chyba dobre miejsce na rozpoczęcie (edycja: nie wygląda na to, że tu są .)
Wyatt8740,
2

Klucz reg z:
Edytor rejestru systemu Windows w wersji 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell] „EnableScripts” = dword: 00000001 „ExecutionPolicy” = „Bypass”

i:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Unrestricted"

rzeczywiście działa.

Giesbert Schipper
źródło
1

Z jakiegoś powodu polecenie cmdlet programu PowerShell nie umożliwiło globalnego wykonania lokalnego, tylko w kontekście lokalnego użytkownika. Na przykład, gdybym próbował uruchomić skrypt Powershell z wnętrza wiersza poleceń CygWin, który działa w swoim własnym kontekście użytkownika, nie uruchomiłby się, dając błąd „nie podpisano cyfrowo”. Odpowiedzią było przejście do Edytora lokalnych zasad grupy -> Lokalne zasady komputera -> Szablony administracyjne -> Składniki systemu Windows -> Windows PowerShell i kliknij dwukrotnie „Włącz wykonywanie skryptu”. To pozwala mi zmienić to na „Włączone”, a następnie zasadę wykonywania „Zezwalaj na skrypty lokalne i zdalnie podpisane skrypty” i niech działa globalnie niezależnie od kontekstu użytkownika.

Eric Green
źródło
0

Przyjęta odpowiedź jest poprawna, ale modyfikacja zasad jest dostępna tylko dla aktualnie działającej instancji Powershell, co oznacza, że ​​po zamknięciu instancji Powershell. Zasady zostaną zresetowane. Jeśli użytkownik ponownie otworzy inne wystąpienie programu PowerShell, zastosowane zostaną domyślne zasady, które sąRestricted

Dla mnie muszę używać konsoli VisualStudio Code i g ++ z cygwin do budowania różnych rzeczy. Konsola używa Powershell, przy domyślnych zasadach nic nie można zrobić. Jednym rozwiązaniem jest zmiana zasad przy każdym uruchomieniu konsoli w konsoli VisualStudio Code, być może skrypt zmiany zasad.

Jestem leniwy, więc innym rozwiązaniem jest uruchomienie Powershell w trybie administratora, podobnie do tego, co robi zaakceptowana odpowiedź. ale z dodatkowym parametrem, który zmienia wartości w tabeli rejestru. Po zakończeniu. Inne wystąpienia programu PowerShell RemoteSigneddomyślnie używają zasad.

set-executionpolicy remotesigned -Scope CurrentUser

r0ng
źródło
0

Ustawienie zasady (poprawnie) jest najlepszym wyborem, ale w moich systemach zarządzanych nie mam możliwości jej zmiany.

Dla mnie najprostszym obejściem zmiany zasad jest otwarcie skryptu w „PowerShell ISE” , wyróżnienie kodu (lub części kodu) do wykonania, a następnie kliknięcie przycisku „Uruchom zaznaczenie” (lub użyć F8 skrót).

Nie jest to najlepsze rozwiązanie i niewiele robi na rzecz automatyzacji zadań, ale pozwala mi korzystać z programu PowerShell i korzystać z niego, nie działając jednocześnie w moim dziale IS.

DBADon
źródło
-2

Powodem, dla którego działa klucz reg, jest to, że robi dokładnie to, co robią polecenia PS. Polecenia zapisują zmiany w kluczach reg. Polecenia są znacznie szybsze i łatwiejsze niż tworzenie klucza reg lub wczytywanie rejestru.

Keith
źródło
1
To po prostu źle: klucze, które zostały wspomniane w innych odpowiedziach, zmieniają zasady wykonywania PowerShells, co następnie umożliwia uruchomienie skryptu PowerShell.
Patrick R.