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
RemoteSigned
polityka wykonywania uniemożliwia wykonanie skryptu, a nie powinna.RemoteSigned
jest 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 zRemoteSigned
naRemoteSigned
nie 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 PowerShell
to jedyna zaangażowana aplikacja. NieWindows PowerShell ISE
aniCommand Prompt
ani ż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, Desktop
któ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 RemoteSigned
wykonywania 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 ' streams
narzędzia i plik Properties
dialogowe 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 LocalMachine
skrypt lokalny nadal nie będzie mógł wykonać, co ma sens, ponieważ zasady wykonywania w MachinePolicy
zakresie będą miały pierwszeństwo.
Zgodnie z dokumentacją about_Execution_Policies
( aktualna ; w momencie zapytania ) RemoteSigned
polityka 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?
źródło
Odpowiedzi:
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.
źródło
'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.ps1
plik, kliknij go prawym przyciskiem myszy, aby wyświetlić menu kontekstowe i wybierzProperties
, na pierwszej karcie u dołu powie, że plik jest zablokowany i pozwoli ci zaznaczyć pole wyboru, aby go odblokować.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
źródło
Scope
parametru toLocalMachine
, więcSet-ExecutionPolicy Unrestricted
jest faktycznie taka sama, jakSet-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
już wypróbowałem. Tak,Turn on Script Execution
zasada jest włączona dlaComputer Configuration
.PowerShell
otwiera sięC:\Users\UserName
, więc po prostu uruchamiam.\Desktop\Script.ps1
po monicie. Użycie ścieżki bezwzględnej powoduje ten sam błąd, co wywołanie skryptu przezpowershell.exe
.gpupdate /force
? (Uruchom ponownie PowerShell.exe po)Unrestricted
wLocalMachine
zakresie, ale kiedy zacząłem pisać skrypty, które chciałem uruchamiać z innych komputerów, ustawiłem zLocalMachine
powrotemUndefined
i dodałem bieżące zasady grupy, aby ustawićRemoteSigned
wMachinePolicy
zakresie. 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 ramachRemoteSigned
, prawda? Pomyślałem, że musi być coś, czego mi brakuje lub nie rozumiem.RemoteSigned
zapisywanie zaWrite-Host hi
pomocą 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.-executionpolicy bypass
tymczasowo omijaliśmy problem ze zdalnym sterowaniem ... a to pozwoliło nam odkryć i debugować inne problemy (niezwiązane, które wymagały aktualizacji PowerShell).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
Intranet
grupy 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.exe
mogą 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
FullTrust
doMyComputer
, 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.źródło
caspol.exe
, ale po uruchomieniucaspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrust
skończyłem z tą samą1.2.3.
zasadą, co w tej odpowiedzi. Używałemfile://
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.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
źródło
Bypass
polityki wykonania było sugerowane już ponad pięć lat temu i jeszcze pięć miesięcy temu . Przed udzieleniem odpowiedzi przeczytaj pytanie i istniejące odpowiedzi.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.
źródło
'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.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.
źródło
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.
źródło
Wykonaj kopię zapasową pliku script.bs1
U mnie zadziałało usunięcie pliku script.bs1 i uruchomienie polecenia wykonawczego.
źródło
Get-ExecutionPolicy -List
?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
źródło
Bypass
polityki wykonywania. Korzystanie z innej zasady nie jest w każdym razie pomocne i nie rozwiązuje rzeczywistego problemu, jeśliRemoteSigned
naprawdę jest to potrzebne. Wreszcie komunikat o błędzie, do którego się odwołujesz, nie jest tym samym, co w pytaniu.Wybierz wiersz polecenia terminala zamiast powłoki Power. To powinno działać.
źródło
Miałem ten sam problem i naprawiłem go, zmieniając domyślny program, aby otwierał pliki .ps1 na PowerShell. Był ustawiony na Notatnik .
źródło
.ps1
plik, który otworzy się w Notatniku, zamiast wykonywać skrypt w PowerShell?Spróbuj uruchomić interfejs GUI programu PowerShell jako administrator
źródło
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.Uruchom poniżej 2 polecenia w oknie PowerShell
Set-ExecutionPolicy nieograniczony
Unblock-File -Path D: \ PowerShell \ Script.ps1
źródło