Dlaczego moje skrypty PowerShell nie działają?

104

Napisałem prosty plik wsadowy jako skrypt PowerShell i otrzymuję błędy podczas ich uruchamiania.

Znajduje się w katalogu skryptów w mojej ścieżce. Oto błąd, który otrzymuję:

Nie można załadować, ponieważ wykonywanie skryptów jest wyłączone w tym systemie. Zobacz „Uzyskaj pomoc dotyczącą podpisywania”.

Szukałem pomocy, ale to mniej niż pomocne.

DevelopingChris
źródło

Odpowiedzi:

102

Może to być domyślny poziom bezpieczeństwa PowerShell, który (IIRC) będzie uruchamiał tylko podpisane skrypty.

Spróbuj wpisać to:

set-executionpolicy remotesigned

To powie PowerShell, aby zezwolił na uruchamianie lokalnych (to znaczy na dysku lokalnym) niepodpisanych skryptów.

Następnie spróbuj ponownie wykonać skrypt.

Matt Hamilton
źródło
5
Musisz uruchomić Powershell z uprawnieniami administratora, przynajmniej pod Windows 8!
ComFreek
1
Musisz także uruchomić skrypt PowerShell z uprawnieniami administratora w systemie Windows 7.
Rod
14
To dość przerażająca odpowiedź. Po pierwsze, trwale zmienia domyślny poziom bezpieczeństwa programu PowerShell w potencjalnie niepożądany (i niepewny) sposób. Po drugie, nie wyjaśnia nawet odpowiednio, że podpisane zdalne skrypty i niepodpisane skrypty lokalne - ale nie niepodpisane zdalne skrypty, których czasami wymaga Chocolatey - otrzymają uprawnienia do wykonywania. Większość użytkowników prawdopodobnie chce tego i tego zamiast tego .
Cecil Curry
1
Chociaż obawy Cecila dotyczące niektórych słabych punktów odpowiedzi są słuszne, chciałem zwrócić uwagę na kilka rzeczy. 1) Jego dwa linki wydają się otwierać dla mnie tę samą stronę. 2) Jeśli chcesz, aby skrypty po prostu uruchamiały się, ustawienie polityki wykonywania jest prawdopodobnie nadal właściwą drogą i prawdopodobnie nie ma związku z OP: 3) wydaje się, że najlepszą zasadą jest dla skryptów startowych, określ zasady wykonywania i zakres w wierszu poleceń uruchomienie skryptu i ustawienie konfiguracji sesji zgodnie z potrzebami podczas logowania. Jeśli chcesz mieć wysoki poziom bezpieczeństwa podczas sesji systemu Windows, ale ograniczony do logowania, chcesz uzyskać niuanse w kolejności skryptów.
omJohn8372
W przypadku pojedynczych ujęć najbardziej pomocna jest poniższa odpowiedź Ankur, która definiuje tymczasowy wyjątek dla działającej instancji PowerShell.
Florenz Kley,
79

Musisz biegać Set-ExecutionPolicy:

Set-ExecutionPolicy Restricted <-- Will not allow any powershell scripts to run.  Only individual commands may be run.

Set-ExecutionPolicy AllSigned <-- Will allow signed powershell scripts to run.

Set-ExecutionPolicy RemoteSigned <-- Allows unsigned local script and signed remote powershell scripts to run.

Set-ExecutionPolicy Unrestricted <-- Will allow unsigned powershell scripts to run.  Warns before running downloaded scripts.

Set-ExecutionPolicy Bypass <-- Nothing is blocked and there are no warnings or prompts.
Nadeem_MK
źródło
3
Jaka jest domyślna wartość ExecutionPolicy, na którą system Windows ustawia nową instalację?
Matthew Lock
5
@MatthewLock Restrictedjest zasadą domyślną. Czytaj więcej
Nadeem_MK
24

Posługiwać się:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Zawsze używaj powyższego polecenia, aby umożliwić wykonywanie programu PowerShell w bieżącej sesji.

Naveen
źródło
this + superuser.com/questions/612409/ ... + skrót link = perfekcja
Q20
16

Udało mi się ominąć ten błąd, wywołując PowerShell w następujący sposób:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Oznacza to, że dodałem -executionpolicy bypassdo sposobu wywoływania skryptu.

To działało w systemie Windows 7 z dodatkiem Service Pack 1. Jestem nowy w programie PowerShell, więc mogą istnieć zastrzeżenia dotyczące robienia tego, których nie jestem świadomy.

[Edytuj 2017-06-26] Nadal bez problemu korzystam z tej techniki w innych systemach, w tym Windows 10 i Windows 2012 R2.

Oto, czego teraz używam. Dzięki temu nie mogę przypadkowo uruchomić skryptu, klikając go. Kiedy uruchamiam go w programie planującym, dodaję jeden argument: „harmonogram”, który omija monit.

To również zatrzymuje okno na końcu, więc mogę zobaczyć dane wyjściowe PowerShell.

if NOT "%1" == "scheduler" (
   @echo looks like you started the script by clicking on it.
   @echo press space to continue or control C to exit.
   pause
)

C:
cd \Scripts

powershell -executionpolicy bypass -File .\rundps.ps1

set psexitcode=%errorlevel%

if NOT "%1" == "scheduler" (
   @echo Powershell finished.  Press space to exit.
   pause
)

exit /b %psexitcode%
jeśli głosowanie w NewQuestionCLOSE
źródło
To właśnie używa chocolatey do pobierania i instalowania chocolatey
icc97
Próbowałem uruchomić polecenie Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 i otrzymałem komunikat o błędzie. Nie ma opcji -File dla tego polecenia.
David Spector,
Rozumiem. Musisz utworzyć skrót zawierający polecenie powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1. Polecenie test.ps1 jest następnie uruchamiane nawet po wydaniu bezpiecznego polecenia globalnego Set-ExecutionPolicy Restricted. Mam nadzieję, że te podstawowe informacje komuś pomogą.
David Spector,
5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Powyższe polecenie działało dla mnie nawet wtedy, gdy wystąpi następujący błąd:

Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.
user3335140
źródło
5

Warto również wiedzieć, że może być konieczne umieszczenie .\przed nazwą skryptu. Na przykład:

.\scriptname.ps1
Leon Bambrick
źródło
1

Polecenie set-executionpolicy unrestrictedpozwoli każdemu utworzonemu skryptowi na uruchomienie jako zalogowany użytkownik. Po prostu upewnij się, że ustawiłeś zasady wykonywania z powrotem na podpisane za pomocą set-executionpolicy signedpolecenia przed wylogowaniem.

ExchangeAdmin
źródło
set-executionpolicy signeddaje Cannot bind parameter 'ExecutionPolicy'itp.
JinSnow
0

W systemie Windows 10: kliknij opcję zmień właściwość zabezpieczeń pliku myfile.ps1 i zmień opcję „zezwól na dostęp”, klikając prawym przyciskiem myszy / właściwości na pliku myfile.ps1

user2781940
źródło