Dlaczego mój skrypt utworzony lokalnie nie może działać w ramach zasad wykonywania RemoteSigned?


106

Ponieważ to pytanie nadal przyciąga odpowiedzi, które są albo odrzucane przez treść pytania, albo nie odnoszą się do rzeczywistego problemu, przeczytaj to proste podsumowanie tego, co musisz wiedzieć:

  • To nie jest pytanie „Dlaczego moja domyślna instalacja programu PowerShell nie uruchamia skryptów?” pytanie.
  • To nie jest pytanie „Dlaczego moja instalacja programu PowerShell nie uruchamia skryptów pobranych z Internetu?” pytanie.
  • Powstaje pytanie, dlaczego RemoteSignedpolityka wykonywania uniemożliwia wykonanie skryptu, a nie powinna.
  • RemoteSignedjest jedyną zasadą wykonywania, której chcę używać. Zdaję sobie sprawę, że dostępne są inne, mniej restrykcyjne zasady. Gdyby te zasady były akceptowalnymi substytutami, po prostu użyłbym ich zamiast tego, a to pytanie by nie istniało.
  • Zasady wykonywania są już ustawione na RemoteSigned. Zmiana z RemoteSignedna RemoteSignednie jest rozwiązaniem.
  • Plik skryptu jest tworzony i przechowywany lokalnie.
  • Plik skryptu nie jest blokowany. Plik skryptu nigdy nie został zablokowany (patrz poprzedni punkt).
  • Pliku skryptu nie można odblokować, ponieważ nie ma nic do odblokowania (patrz poprzedni punkt).
  • Plik skryptu jest (próbuje) wykonać administrator.
  • Windows PowerShellto jedyna zaangażowana aplikacja. Nie Windows PowerShell ISEani Command Promptani żadnych innych narzędzi lub redaktorzy są istotne.
  • Przyczyna problemu została już zidentyfikowana (patrz zaakceptowana odpowiedź). Myślę, że po prawie 8 latach opublikowano również wszystkie inne oczywiste wyjaśnienia, mające zastosowanie lub nie. Jeśli uważasz, że jest inaczej, przeczytaj pytanie i istniejące odpowiedzi w całości, zanim dodasz swoje.

Używam programu Windows PowerShell 2.0 w 64-bitowym systemie Windows 7 Professional. Mam na swoim komputerze skrypt, Desktopktóry powoduje następujący błąd, gdy próbuję go uruchomić:

File C:\Users\UserName\Desktop\Script.ps1 cannot be loaded. The file C:\Users\UserName\Desktop\Script.ps1 is not digitally signed. The script will not execute on the system.  Please see "get-help about_signing" for more details..
At line:1 char:54
+ C:\Users\UserName\Desktop\TestGetWindowsUpdateLog.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

Jestem zarówno administratorem domeny, jak i administratorem lokalnym, a jeśli uruchomię Get-ExecutionPolicy -List, widzę, Group Policy Objectże utworzony w celu skonfigurowania PowerShell poprawnie stosuje zasady RemoteSignedwykonywania na poziomie komputera:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy    RemoteSigned
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

Stworzyłem skrypt w sobie Notepad, i użył Sysinternals ' streamsnarzędzia i plik Propertiesdialogowe potwierdzające, że skrypt nie jest traktowane jako mające pochodzić z internetu. Jeśli skopiuję skrypt do udziału sieciowego na serwerze domeny, będzie można go wykonać. Jeśli uruchomię, Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachineskrypt lokalny nadal nie będzie mógł wykonać, co ma sens, ponieważ zasady wykonywania w MachinePolicyzakresie będą miały pierwszeństwo.

Zgodnie z dokumentacją about_Execution_Policies( aktualna ; w momencie zapytania ) RemoteSignedpolityka oznacza:

  • Skrypty mogą działać.

  • Wymaga podpisu cyfrowego od zaufanego wydawcy na skryptach i plikach konfiguracyjnych pobieranych z Internetu (w tym w programach do obsługi poczty e-mail i komunikatorów internetowych).

  • Nie wymaga podpisów cyfrowych w skryptach, które uruchomiłeś i które napisałeś na lokalnym komputerze (nie pobrano z Internetu).

  • Ryzyko uruchamiania niepodpisanych skryptów ze źródeł innych niż Internet oraz podpisanych, ale złośliwych skryptów.

Mój skrypt nie jest podpisany, ale ponieważ jest tworzony i wykonywany lokalnie, powinien spełniać wymagania trzeciego podpunktu powyżej. W związku z tym...

  • Dlaczego mój skrypt nie może działać?
  • Dlaczego program PowerShell narzeka, że ​​mój skrypt „nie jest podpisany cyfrowo”, podczas gdy to wymaganie powinno dotyczyć tylko plików z Internetu?
  • Dlaczego program PowerShell nie przejmuje się już tym, że skrypt nie jest podpisywany, gdy jest uruchamiany z udziału sieciowego?

1
@Downvoter: czy chcesz podać powód?
Lance U. Matthews

Odpowiedzi:


125

Czy plik jest blokowany? Miałem ten sam problem i udało mi się go rozwiązać, klikając prawym przyciskiem myszy plik PS1, Właściwości i wybierając Odblokuj.


1
Jak wyjaśniłem, skrypt jest tworzony bezpośrednio na moim dysku twardym (nie jest pobierany z dowolnego miejsca) i potwierdziłem, że nie ma alternatywnych strumieni identyfikujących go jako pochodzący z innej strefy (jak Internet Explorer i inne przeglądarki internetowe). Jeśli uruchomię 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;, nadal pojawia się błąd, że skrypt nie jest podpisany cyfrowo i nie jest wykonywany. Jeśli otworzę okno dialogowe Właściwości dla nowo utworzonego pliku, nie ma nic do odblokowania.
Lance U. Matthews

50
Co masz na myśli ~ „ Właściwości i wybranie Odblokuj ”?
IgorGanapolsky,

1
@IgorGanapolsky mają na myśli w Eksploratorze, znajdź ps1plik, kliknij go prawym przyciskiem myszy, aby wyświetlić menu kontekstowe i wybierz Properties, na pierwszej karcie u dołu powie, że plik jest zablokowany i pozwoli ci zaznaczyć pole wyboru, aby go odblokować.
user692942

1
Zwróć uwagę, że jeśli pobrałeś plik zip, powinieneś go odblokować przed wyodrębnieniem, aby uniknąć masowego odblokowania wszystkich znajdujących się w nim plików.
Ohad Schneider

15
@Lankymart Windows 10, próbował tego, nie mówi, że jest zablokowany.
Alan Baljeu

124

Kilka rzeczy do sprawdzenia:

Czy możesz zmienić na nieograniczoną?

Set-ExecutionPolicy Unrestricted

Czy zasady grupy są ustawione?

  • Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell
  • User Configuration\Administrative Templates\Windows Components\Windows PowerShell

Ponadto, jak wywołujesz Script.ps1?

Czy to pozwala mu działać?

powershell.exe -executionpolicy bypass -file .\Script.ps1

Domyślna wartość Scopeparametru to LocalMachine, więc Set-ExecutionPolicy Unrestrictedjest faktycznie taka sama, jak Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachinejuż wypróbowałem. Tak, Turn on Script Executionzasada jest włączona dla Computer Configuration. PowerShellotwiera się C:\Users\UserName, więc po prostu uruchamiam .\Desktop\Script.ps1po monicie. Użycie ścieżki bezwzględnej powoduje ten sam błąd, co wywołanie skryptu przez powershell.exe.
Lance U. Matthews

Czy próbowałeś wyłączyć ustawienie zasad grupy i odświeżyć go za pomocą gpupdate /force? (Uruchom ponownie PowerShell.exe po)
Andy Arismendi

Cóż, przez długi czas działałem jak Unrestrictedw LocalMachinezakresie, ale kiedy zacząłem pisać skrypty, które chciałem uruchamiać z innych komputerów, ustawiłem z LocalMachinepowrotem Undefinedi dodałem bieżące zasady grupy, aby ustawić RemoteSignedw MachinePolicyzakresie. To jest tylko jednorazowy skrypt testowy i uruchomienie go z sieci nie jest niczym wielkim. Chcę tylko wiedzieć, dlaczego nie działa lokalnie. W końcu lokalnie utworzony skrypt powinien mieć możliwość wykonywania w ramach RemoteSigned, prawda? Pomyślałem, że musi być coś, czego mi brakuje lub nie rozumiem.
Lance U. Matthews

@BACON Masz rację, jeśli chodzi o RemoteSignedzapisywanie za Write-Host hipomocą notatnika na pulpicie, powinno działać dobrze. Twoja konfiguracja też wygląda w porządku ... Coś wydaje mi się zepsute ... dlatego zasugerowałem usunięcie zasad grupy, aby sprawdzić, czy to pomaga.
Andy Arismendi

1
W przypadku programowania po prostu -executionpolicy bypasstymczasowo omijaliśmy problem ze zdalnym sterowaniem ... a to pozwoliło nam odkryć i debugować inne problemy (niezwiązane, które wymagały aktualizacji PowerShell).
Doug_Ivison

15

W końcu wyśledziłem to do bezpieczeństwa dostępu kodu .NET . Mam kilka wewnętrznie opracowanych modułów binarnych, które są przechowywane i uruchamiane z udziału sieciowego. Aby pobrać .NET 2.0 / PowerShell 2.0 do ich załadowania, dodałem regułę adresu URL do Intranetgrupy kodu, aby ufać temu katalogowi:

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -listgroups
Microsoft (R) .NET Framework CasPol 2.0.50727.5420
Copyright (c) Microsoft Corporation.  All rights reserved.

Security is ON
Execution checking is ON
Policy change prompt is ON

Level = Machine

Code Groups:

1.  All code: Nothing
    1.1.  Zone - MyComputer: FullTrust
        1.1.1.  StrongName - ...: FullTrust
        1.1.2.  StrongName - ...: FullTrust
    1.2.  Zone - Intranet: LocalIntranet
        1.2.1.  All code: Same site Web
        1.2.2.  All code: Same directory FileIO - 'Read, PathDiscovery'
        1.2.3.  Url - file://Server/Share/Directory/WindowsPowerShell/Modules/*: FullTrust
    1.3.  Zone - Internet: Internet
        1.3.1.  All code: Same site Web
    1.4.  Zone - Untrusted: Nothing
    1.5.  Zone - Trusted: Internet
        1.5.1.  All code: Same site Web

Należy pamiętać, że w zależności od zainstalowanych wersji platformy .NET i tego, czy jest to 32- czy 64-bitowy system Windows, caspol.exemogą istnieć w następujących lokalizacjach, z których każda ma własną konfigurację zabezpieczeń ( security.config):

  • $Env:SystemRoot\Microsoft.NET\Framework\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework\v4.0.30319\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\

Po usunięciu grupy 1.2.3....

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -remgroup 1.2.3.
Microsoft (R) .NET Framework CasPol 2.0.50727.9136
Copyright (c) Microsoft Corporation.  All rights reserved.

The operation you are performing will alter security policy.
Are you sure you want to perform this operation? (yes/no)
yes
Removed code group from the Machine level.
Success

... Zostałem z domyślną konfiguracją CAS, a lokalne skrypty teraz znów działają. Minęło trochę czasu odkąd tam majstrował z CAS, i nie jestem pewien, dlaczego moja zasada wydaje się kolidować z tymi przyznania FullTrustdo MyComputer, ale ponieważ CAS jest przestarzała jak .NET 4.0 (na którym opiera się PowerShell 3.0), I Chyba jest to teraz kwestia sporna.


Jak dodałeś regułę adresu URL? Miałem ten sam problem i mam nadzieję, że to pomoże mi go rozwiązać. Dzięki.
OptimusPrime

Minęło bardzo dużo czasu, odkąd pracowałem z caspol.exe, ale po uruchomieniu caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrustskończyłem z tą samą 1.2.3.zasadą, co w tej odpowiedzi. Używałem file://adresu URL, aby odwołać się do katalogu w udziale SMB, chociaż widzę w dokumentacji, że jeden z -addgroup przykładów używa ścieżki UNC.
Lance U. Matthews

12

Podczas uruchamiania pliku PS1 dla dysku mapowanego na Dropbox dowiedziałem się, że zawsze otrzymuję ten błąd. Podczas otwierania właściwości dla PS1 nie ma opcji „Odblokuj”.

Jedyne, co mi pasuje, to

powershell.exe -executionpolicy bypass -file. \ Script.ps1


1
Mówisz, że twój skrypt jest przechowywany na dysku zmapowanym do udziału sieciowego? Albo skrypt tworzy zmapowany dysk? Jeśli to pierwsze, jak stwierdza w treści i tytule pytania, skrypt został utworzony i przechowywany lokalnie, więc pochodzenie / strefa skryptu nie będzie miało znaczenia. Tak czy inaczej, stosowanie Bypasspolityki wykonania było sugerowane już ponad pięć lat temu i jeszcze pięć miesięcy temu . Przed udzieleniem odpowiedzi przeczytaj pytanie i istniejące odpowiedzi.
Lance U. Matthews

6

Jeśli plik jest kopiowany z lokalizacji sieciowej, czyli z innego komputera, system Windows mógł zablokować ten plik. Kliknij plik prawym przyciskiem myszy i kliknij przycisk odblokowania i zobacz, czy działa.


2
Jak wyjaśniłem zarówno w pytaniu, jak i komentarzu do odpowiedzi @ O-Dogg, skrypt był tworzony bezpośrednio na moim dysku twardym (nie został pobrany z dowolnego miejsca) i potwierdziłem, że nie ma alternatywnych strumieni identyfikujących go jako pochodzący z innej strefy (jak Internet Explorer i inne przeglądarki internetowe tworzą). Jeśli uruchomiłem 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;, nadal otrzymywałem błąd, że skrypt nie został podpisany cyfrowo i nie został wykonany. Jeśli otworzyłem okno dialogowe Właściwości dla nowo utworzonego pliku, nie było nic do odblokowania.
Lance U. Matthews

Warto sprawdzić, czy nie tworzysz i nie uruchamiasz go na zmapowanym dysku. Na przykład na naszych serwerach folder domowy każdego użytkownika jest dyskiem zamapowanym na jego folder osobisty.
Caltor

0

To jest problem z IDE. Zmień ustawienie w interfejsie GUI programu PowerShell. Przejdź do karty Narzędzia i wybierz Opcje, a następnie Opcje debugowania . Następnie zaznacz pole Wyłącz wymóg podpisywania skryptów . Gotowe.


OP wyraźnie nie chce, aby skrypty były uruchamiane bez znaku i nie odnosiło się do IDE.
kfsone

1
Niedostępne w Powershell ISE
Josh Noe

0

W moim przypadku działało to kliknięcie prawym przyciskiem myszy pliku .ps1, a następnie właściwości. Kliknij przycisk „ODBLOKUJ”. Działa świetnie po spędzeniu godzin na próbach zmiany zasad.


1
Istnieją już dwie odpowiedzi, które zignorowały to, co zostało powiedziane w pytaniu, i sugerują to samo niemożliwe do zastosowania rozwiązanie. Napisałem bardzo wyraźnie: „Użyłem narzędzia strumieniowego Sysinternals i okna dialogowego Właściwości pliku, aby potwierdzić, że skrypt nie jest traktowany jako pochodzący z Internetu”, a następnie „został utworzony i wykonany lokalnie”. Nawet w tytule jest napisane, że skrypt jest „stworzony lokalnie”. Nie ma nic do odblokowania. Jeśli odblokowanie skryptu rozwiązało problem, to nie miałeś tego samego problemu co ja, ponieważ, jak wspomniano, mój skrypt nie został zablokowany. -1.
Lance U. Matthews

1
@BACON żeby być uczciwym, miałem takie same objawy jak ty i dla mnie odblokowanie zadziałało. Nawet jeśli mój skrypt został utworzony lokalnie, po zapisaniu musiałem go odblokowywać za każdym razem .
SQB

Może to obejście, ale nie jest to pełne poprawne rozwiązanie
Mo Zaatar

@SQB Ciekawe, czy masz profil roamingowy?
Robert Talada

0

Wykonaj kopię zapasową pliku script.bs1

U mnie zadziałało usunięcie pliku script.bs1 i uruchomienie polecenia wykonawczego.


1
Jaki otrzymany komunikat o błędzie został rozwiązany w ten sposób?
Lance U. Matthews

Przeszedłem przez ten błąd 2 razy i naprawiłem go w ten sam sposób. Wygląda na to, że uruchomienie polecenia z CMD spowoduje natychmiastowe uruchomienie innego pliku o tej samej nazwie, ale z rozszerzeniem (.cmd).
Prosta abstrakcja

Nie można załadować pliku C: \ Users \ UserName \ Desktop \ Script.ps1. Plik C: \ Users \ UserName \ Desktop \ Script.ps1 nie jest podpisany cyfrowo. Skrypt nie zostanie wykonany w systemie. ((Błąd Script.ps1 nie podpisany cyfrowo))
Prosta abstrakcja

Widzę. A co jest zwracane podczas biegu Get-ExecutionPolicy -List?
Lance U. Matthews

MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
Simple Abstraction

0

Po uruchomieniu skryptu .ps1 PowerShell może pojawić się komunikat „.ps1 nie jest podpisany cyfrowo. Skrypt nie zostanie wykonany w systemie ”. Aby to naprawić, musisz uruchomić poniższe polecenie, aby uruchomić Set-ExecutionPolicy i zmienić ustawienie zasad wykonywania.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Inna odpowiedź sugeruje już użycie Bypasspolityki wykonywania. Korzystanie z innej zasady nie jest w każdym razie pomocne i nie rozwiązuje rzeczywistego problemu, jeśli RemoteSignednaprawdę jest to potrzebne. Wreszcie komunikat o błędzie, do którego się odwołujesz, nie jest tym samym, co w pytaniu.
Lance U. Matthews

-1

Wybierz wiersz polecenia terminala zamiast powłoki Power. To powinno działać.


2
Co to w ogóle znaczy? Wybierz gdzie? Celem było uruchomienie skryptu PowerShell w PowerShell, więc użycie czegokolwiek innego niż PowerShell nie zadziała.
Lance U. Matthews

Wystąpił ten sam błąd podczas próby uruchomienia AWS Amplify CLI. Wydawało się, że uruchomienie polecenia amplify z terminalu Windows zamiast PowerShell sprawiło, że zadziałało.
symbiotech

-2

Miałem ten sam problem i naprawiłem go, zmieniając domyślny program, aby otwierał pliki .ps1 na PowerShell. Był ustawiony na Notatnik .


Miałeś ten sam problem? Lub gdy klikniesz dwukrotnie .ps1plik, który otworzy się w Notatniku, zamiast wykonywać skrypt w PowerShell?
Lance U. Matthews

-2

Spróbuj uruchomić interfejs GUI programu PowerShell jako administrator


3
Jak wskazano w pytaniu I am both a domain administrator and a local administrator. Uruchamianie programu PowerShell z podwyższonym poziomem uprawnień nie miałoby znaczenia, ponieważ skrypt mógł działać bez podwyższenia poziomu, gdy był przechowywany w udziale sieciowym.
Lance U. Matthews

-5

Uruchom poniżej 2 polecenia w oknie PowerShell

  1. Set-ExecutionPolicy nieograniczony

  2. Unblock-File -Path D: \ PowerShell \ Script.ps1


2
Najwyraźniej nie czytałeś pytania ani odpowiedzi sprzed lat, które proponują odmiany tego samego niemożliwego do zastosowania rozwiązania, ani moich komentarzy, w których wielokrotnie stwierdzałem, że to nie jest odpowiedź. Zrobiłbym -10 to gdybym mógł, ale zamiast tego będę musiał zadowolić się -1.
Lance U. Matthews

@BACON Agreed.lol
Robert Talada
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.