Warum darf mein lokal erstelltes Skript nicht unter der RemoteSigned-Ausführungsrichtlinie ausgeführt werden?

92

Da diese Frage weiterhin Antworten anzieht, die entweder vom Fragentext widerlegt werden oder das eigentliche Problem nicht ansprechen, lesen Sie bitte diese einfache Zusammenfassung dessen, was Sie wissen müssen:

  • Dies ist kein "Warum werden bei meiner Standardinstallation von PowerShell keine Skripts ausgeführt?" Frage.
  • Dies ist kein "Warum werden bei meiner Installation von PowerShell keine aus dem Internet heruntergeladenen Skripts ausgeführt?" Frage.
  • Die Frage ist, warum die RemoteSignedAusführungsrichtlinie die Skriptausführung verhindert, wenn dies nicht der Fall sein sollte.
  • RemoteSignedist die einzige Ausführungsrichtlinie, die ich verwenden möchte. Mir ist bekannt, dass andere, weniger restriktive Richtlinien verfügbar sind. Wenn diese Richtlinien akzeptable Ersatzprodukte wären, hätte ich sie stattdessen nur verwendet, und diese Frage würde nicht existieren.
  • Die Ausführungsrichtlinie ist bereits auf festgelegt RemoteSigned. Ein Wechsel von RemoteSignedzu RemoteSignedist keine Lösung.
  • Die Skriptdatei wird lokal erstellt und gespeichert.
  • Die Skriptdatei ist nicht blockiert. Die Skriptdatei wurde nie blockiert (siehe vorherigen Punkt).
  • Die Skriptdatei kann nicht entsperrt werden, da nichts zu entsperren ist (siehe vorherigen Punkt).
  • Die Skriptdatei wird (versucht) von einem Administrator ausgeführt.
  • Windows PowerShellist die einzige betroffene Anwendung. Weder Windows PowerShell ISEnoch Command Promptandere Tools oder Editoren sind relevant.
  • Die Ursache des Problems wurde bereits identifiziert (siehe akzeptierte Antwort). Nach fast 8 Jahren denke ich, dass auch alle anderen offensichtlichen Erklärungen, ob zutreffend oder nicht, veröffentlicht wurden. Wenn Sie anders denken , lesen Sie bitte die Frage und die vorhandenen Antworten vollständig durch, bevor Sie Ihre hinzufügen.

Ich verwende Windows PowerShell 2.0 unter 64-Bit Windows 7 Professional. Ich habe ein Skript auf meinem Desktop, das den folgenden Fehler verursacht, wenn ich versuche, es auszuführen:

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

Ich bin sowohl Domänenadministrator als auch lokaler Administrator. Wenn ich ausgeführt werde Get-ExecutionPolicy -List, kann ich feststellen, dass die Group Policy Objectzur Konfiguration von PowerShell erstellte RemoteSignedAusführungsrichtlinie die Ausführungsrichtlinie auf Computerebene korrekt anwendet :

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

Ich habe das Skript selbst erstellt Notepadund mithilfe des streamsDienstprogramms von Sysinternals und des PropertiesDateidialogs bestätigt, dass das Skript nicht als aus dem Internet stammend behandelt wird. Wenn ich das Skript auf eine Netzwerkfreigabe auf einem Domänenserver kopiere, kann es ausgeführt werden. Wenn ich Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachinees ausführe, darf das lokale Skript immer noch nicht ausgeführt werden. Dies ist sinnvoll, da die Ausführungsrichtlinie im MachinePolicyBereich Vorrang hat.

Wie dokumentiert durch about_Execution_Policies( aktuell ; zum Zeitpunkt der Frage ) RemoteSignedbedeutet die Richtlinie:

  • Skripte können ausgeführt werden.

  • Erfordert eine digitale Signatur eines vertrauenswürdigen Herausgebers für Skripte und Konfigurationsdateien, die aus dem Internet heruntergeladen werden (einschließlich E-Mail- und Instant Messaging-Programmen).

  • Erfordert keine digitalen Signaturen für Skripte, die Sie ausgeführt und auf dem lokalen Computer geschrieben haben (nicht aus dem Internet heruntergeladen).

  • Risiken beim Ausführen nicht signierter Skripte aus anderen Quellen als dem Internet und signierter, aber böswilliger Skripte.

Mein Skript ist nicht signiert, aber da es lokal erstellt und ausgeführt wird, sollte es den dritten Punkt oben erfüllen. Deshalb...

  • Warum darf mein Skript nicht ausgeführt werden?
  • Warum beschwert sich PowerShell darüber, dass mein Skript "nicht digital signiert" ist, wenn diese Anforderung nur für Dateien aus dem Internet gelten sollte?
  • Warum kümmert sich PowerShell nicht mehr darum, dass das Skript nicht signiert wird, wenn es von einer Netzwerkfreigabe ausgeführt wird?
SPECK
quelle
@ Downvoter: Möchtest du einen Grund angeben warum?
Speck

Antworten:

119

Wird die Datei blockiert? Ich hatte das gleiche Problem und konnte es beheben, indem ich mit der rechten Maustaste auf die PS1-Datei Eigenschaften klickte und die Option Entsperren aufnahm.

O-Dogg
quelle
1
Wie ich bereits erklärt habe, wird das Skript direkt auf meiner Festplatte erstellt (nicht von irgendwoher heruntergeladen), und ich habe bestätigt, dass es keine alternativen Streams gibt, die es als aus einer anderen Zone stammend identifizieren (wie Internet Explorer und andere Webbrowser). Wenn ich starte, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;erhalte ich immer noch die Fehlermeldung, dass das Skript nicht digital signiert und nicht ausgeführt wird. Wenn ich das Dialogfeld Eigenschaften für die neu erstellte Datei öffne, kann nichts entsperrt werden.
Speck
45
Was meinst du mit " Eigenschaften und Entsperren "?
IgorGanapolsky
1
@IgorGanapolsky bedeutet im Explorer, suchen Sie die ps1Datei mit der rechten Maustaste, um das Kontextmenü aufzurufen, und wählen Sie Propertiesauf der ersten Registerkarte unten aus, dass die Datei blockiert ist, und aktivieren Sie ein Kontrollkästchen, um sie zu entsperren.
Lankymart
1
Beachten Sie, dass Sie beim Herunterladen einer Zip-Datei die Zip-Datei vor dem Extrahieren entsperren sollten, um zu vermeiden, dass alle darin enthaltenen Dateien massenweise entsperrt werden.
Ohad Schneider
14
@Lankymart Windows 10, versucht dies, sagt nicht, dass es blockiert ist.
Alan Baljeu
114

Einige Dinge zu überprüfen:

Können Sie uneingeschränkt wechseln?

Set-ExecutionPolicy Unrestricted

Ist die Gruppenrichtlinie festgelegt?

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

Wie ruft man Script.ps1 auf?

Lässt es das laufen?

powershell.exe -executionpolicy bypass -file .\Script.ps1
Andy Arismendi
quelle
Der Standardwert für den ScopeParameter ist LocalMachine, entspricht also Set-ExecutionPolicy Unrestrictedpraktisch dem, den Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachineich bereits versucht hatte. Ja, die Turn on Script ExecutionRichtlinie ist für aktiviert Computer Configuration. PowerShellöffnet sich zu C:\Users\UserName, also laufe ich einfach .\Desktop\Script.ps1an der Eingabeaufforderung. Die Verwendung des absoluten Pfads führt zu demselben Fehler wie das Aufrufen des Skripts über powershell.exe.
Speck
Haben Sie versucht, die Gruppenrichtlinieneinstellung zu deaktivieren und mit zu aktualisieren gpupdate /force? (Relaunch PowerShell.exe nach)
Andy Arismendi
Nun, lange Zeit lief ich wie Unrestrictedim LocalMachineBereich, aber als ich anfing, Skripte zu schreiben, wollte ich von anderen Computern ausgeführt werden, auf die ich LocalMachinezurückgesetzt habe, Undefinedund fügte die aktuelle Gruppenrichtlinie hinzu, die RemoteSignedim MachinePolicyBereich festgelegt wurde. Dies ist nur ein einmaliges Testskript und es ist wirklich keine große Sache, es stattdessen über das Netzwerk auszuführen. Ich möchte nur wissen, warum es lokal nicht funktioniert. Schließlich sollte ein lokal erstelltes Skript unter ausgeführt werden dürfen RemoteSigned, oder? Ich dachte nur, dass es etwas geben muss, das mir fehlt oder das ich nicht verstehe.
Speck
@BACON Sie haben Recht, wenn Sie mit dem Editor auf Ihrem Desktop RemoteSignedspeichern Write-Host hi, sollte dies einwandfrei funktionieren . Ihre Konfiguration sieht auch in Ordnung aus ... Mir scheint etwas kaputt zu sein ... Deshalb habe ich vorgeschlagen, die Gruppenrichtlinie zu entfernen, um zu sehen, ob sie hilft.
Andy Arismendi
1
Für die Entwicklung haben wir -executionpolicy bypassdas Problem mit den Remotesigns nur vorübergehend überwunden ... und damit andere Probleme aufgedeckt und behoben (unabhängig davon, dass wir PowerShell aktualisieren mussten).
Doug_Ivison
12

Ich habe dies schließlich auf .NET Code Access Security zurückgeführt . Ich habe einige intern entwickelte Binärmodule, die auf einer Netzwerkfreigabe gespeichert und von dieser ausgeführt werden. Damit .NET 2.0 / PowerShell 2.0 sie laden kann, habe ich der IntranetCodegruppe eine URL-Regel hinzugefügt , um diesem Verzeichnis zu vertrauen:

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

Beachten Sie, dass abhängig davon, welche Versionen von .NET installiert sind und ob es sich um 32- oder 64-Bit-Windows handelt, caspol.exean den folgenden Speicherorten mit jeweils eigener Sicherheitskonfiguration ( security.config) vorhanden sein kann:

  • $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\

Nach dem Löschen der Gruppe 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

... Ich habe die Standard-CAS-Konfiguration und die lokalen Skripte funktionieren jetzt wieder. Es ist schon eine Weile her, dass ich an CAS herumgebastelt habe, und ich bin mir nicht sicher, warum meine Regel die Gewährung FullTrustvon CAS zu beeinträchtigen scheint MyComputer, aber da CAS ab .NET 4.0 (auf dem PowerShell 3.0 basiert) veraltet ist, habe ich Ich denke, es ist jetzt ein strittiger Punkt.

SPECK
quelle
Wie haben Sie eine URL-Regel hinzugefügt? Ich hatte das gleiche Problem und hoffe, dass dies mir bei der Lösung helfen kann. Vielen Dank.
OptimusPrime
Es ist sehr lange her, dass ich mit gearbeitet habe caspol.exe, aber nach dem Laufen habe caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrustich die gleiche 1.2.3.Regel wie in dieser Antwort erhalten. Ich habe eine file://URL verwendet, um auf ein Verzeichnis auf einer SMB-Freigabe zu verweisen, obwohl in der Dokumentation eines der -addgroup Beispiele einen UNC-Pfad verwendet.
Speck
9

Ich habe beim Ausführen einer PS1-Datei für ein zugeordnetes Laufwerk zu Dropbox festgestellt, dass immer dieser Fehler angezeigt wird. Beim Öffnen von Eigenschaften für die PS1 gibt es kein "Entsperren".

Das einzige, was für mich funktioniert, ist

Powershell.exe -Executionpolicy Bypass-Datei. \ Script.ps1

GeekMustHave
quelle
1
Sie sagen, Ihr Skript ist auf einem Laufwerk gespeichert, das einer Netzwerkfreigabe zugeordnet ist? Oder erstellt das Skript ein zugeordnetes Laufwerk? Wenn erstere, wie im Text und Titel der Frage angegeben, das Skript lokal erstellt und gespeichert wird, ist der Ursprung / die Zone des Skripts kein Faktor. In beiden Fällen wurde die Verwendung der BypassAusführungsrichtlinie bereits vor über fünf Jahren und erst vor fünf Monaten vorgeschlagen . Bitte lesen Sie die Frage und die vorhandenen Antworten, bevor Sie antworten.
Speck
6

Wenn die Datei von einem Netzwerkspeicherort, dh einem anderen Computer, kopiert wird, hat Windows diese Datei möglicherweise blockiert. Klicken Sie mit der rechten Maustaste auf die Datei und klicken Sie auf die Schaltfläche zum Entsperren, um festzustellen, ob sie funktioniert.

Shyam
quelle
2
Wie ich sowohl in der Frage als auch in meinem Kommentar zur Antwort von @ O-Dogg erklärt habe, wurde das Skript direkt auf meiner Festplatte erstellt (nicht von irgendwoher heruntergeladen), und ich habe bestätigt, dass es keine alternativen Streams gibt, die es als aus einer anderen Zone stammend identifizieren (wie Internet Explorer und andere Webbrowser erstellen). Wenn ich lief, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;bekam ich immer noch die Fehlermeldung, dass das Skript nicht digital signiert und nicht ausgeführt wurde. Wenn ich das Dialogfeld "Eigenschaften" für die neu erstellte Datei geöffnet habe, konnte nichts entsperrt werden.
Speck
Es lohnt sich zu überprüfen, ob Sie es nicht auf einem zugeordneten Laufwerk erstellen und ausführen. Auf unseren Servern ist beispielsweise der Basisordner für jeden Benutzer ein Laufwerk, das seinem persönlichen Ordner zugeordnet ist.
Caltor
0

Dies ist ein IDE-Problem. Ändern Sie die Einstellung in der PowerShell-Benutzeroberfläche. Gehen Sie auf die Werkzeuge Menü und wählen Sie Optionen und anschließend Optionen Debuggen . Aktivieren Sie dann das Kontrollkästchen Anforderung zum Signieren von Skripten deaktivieren . Getan.

bdubb
quelle
Das OP möchte eindeutig nicht, dass Skripte ohne Vorzeichen ausgeführt werden, und verweist nicht auf die IDE.
KFSONE
Nicht verfügbar in Powershell ISE
Josh Noe
0

Was für mich funktioniert, war ein Rechtsklick auf die .ps1-Datei und dann auf die Eigenschaften. Klicken Sie auf die Schaltfläche "UNBLOCK". Funktioniert hervorragend für mich, nachdem ich stundenlang versucht habe, die Richtlinien zu ändern.

Mo Zaatar
quelle
1
Es gibt bereits zwei Antworten, die die Angaben in der Frage ignoriert haben und dieselbe nicht anwendbare Lösung vorschlagen. Ich schrieb sehr deutlich: "Ich ... habe das Stream-Dienstprogramm von Sysinternals und das Dialogfeld" Dateieigenschaften "verwendet, um zu bestätigen, dass das Skript nicht als aus dem Internet stammend behandelt wird" und dann "es wird lokal erstellt und ausgeführt". Direkt im Titel steht sogar, dass das Skript "lokal erstellt" ist. Es gibt nichts zu entsperren. Wenn das Entsperren Ihres Skripts Ihr Problem gelöst hat, hatten Sie nicht das gleiche Problem wie ich, da mein Skript, wie angegeben, nicht blockiert wurde. -1.
Speck
1
@BACON um fair zu sein, ich hatte die gleichen Symptome wie Sie und für mich hat das Entsperren funktioniert. Obwohl mein Skript lokal erstellt wurde, musste ich es jedes Mal nach dem Speichern entsperren .
SQB
Dies ist vielleicht eine Lösung, aber nicht die richtige Lösung
Mo Zaatar
0

Bitte erstellen Sie ein Backup für die Datei script.bs1

Was für mich funktioniert, war das Löschen der Datei script.bs1 und das Ausführen des Ausführungsbefehls.

Einfache Abstraktion
quelle
Was ist die Fehlermeldung, die Sie erhalten haben und die dadurch behoben wurde?
Speck
Ich habe diesen Fehler 2 verschiedene Male durchlaufen und ihn auf die gleiche Weise behoben. Es sieht so aus, als würde das Ausführen des Ausführungsbefehls vom CMD aus sofort für die andere Datei mit demselben Namen, jedoch mit der Erweiterung (.cmd) ausgeführt.
Einfache Abstraktion
Datei C: \ Benutzer \ Benutzername \ Desktop \ Script.ps1 kann nicht geladen werden. Die Datei C: \ Users \ UserName \ Desktop \ Script.ps1 ist nicht digital signiert. Das Skript wird nicht auf dem System ausgeführt. ((Script.ps1 nicht digital signierter Fehler))
Einfache Abstraktion
Aha. Und was wird zurückgegeben, wenn Sie laufen Get-ExecutionPolicy -List?
Speck
MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
Einfache Abstraktion
-1

Wählen Sie anstelle der Power Shell die Eingabeaufforderung Ihres Terminals aus. Das sollte funktionieren.

Pranav Aggarwal
quelle
2
Was bedeutet das überhaupt? Wählen Sie es wo? Ziel war es, ein PowerShell-Skript in PowerShell auszuführen, sodass die Verwendung von etwas anderem als PowerShell nicht funktioniert.
Speck
-1

Wenn Sie ein .ps1 PowerShell-Skript ausführen, wird möglicherweise die Meldung angezeigt, dass .ps1 nicht digital signiert ist. Das Skript wird auf dem System nicht ausgeführt. “ Um dies zu beheben, müssen Sie den folgenden Befehl ausführen, um Set-ExecutionPolicy auszuführen und die Einstellung für die Ausführungsrichtlinie zu ändern.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Gautam Sharma
quelle
Eine andere Antwort schlägt bereits vor, die BypassAusführungsrichtlinie zu verwenden. Die Verwendung einer anderen Richtlinie ist sowieso nicht hilfreich und behebt das eigentliche Problem nicht, wenn es RemoteSignedwirklich erforderlich ist. Schließlich ist die Fehlermeldung, auf die Sie verweisen, nicht dieselbe wie in der Frage.
Speck
-2

Ich hatte das gleiche Problem und habe es behoben, indem ich das Standardprogramm so geändert habe, dass .ps1-Dateien in PowerShell geöffnet werden. Es wurde auf Notepad gesetzt .

Neuer Typ
quelle
Sie hatten das gleiche Problem? Oder wenn Sie auf eine .ps1Datei doppelklicken, die im Editor geöffnet wird, anstatt das Skript in PowerShell auszuführen?
Speck
-2

Versuchen Sie, die Powershell-Benutzeroberfläche als Administrator auszuführen

Pauline
quelle
3
Wie in der Frage angegeben , I am both a domain administrator and a local administrator. Das Ausführen von PowerShell mit erhöhten Rechten würde keinen Unterschied machen, da das Skript bei Speicherung auf einer Netzwerkfreigabe nicht hoch ausgeführt werden durfte.
Speck
-4

Führen Sie im PowerShell-Fenster die folgenden 2 Befehle aus

  1. Set-ExecutionPolicy uneingeschränkt

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

Rakesh Dongarwar
quelle
2
Offensichtlich haben Sie die Frage oder die anderen jahrelangen Antworten, die Variationen derselben nicht anwendbaren Lösung vorschlagen, oder meine Kommentare, die immer wieder besagen, dass dies nicht die Antwort ist, nicht gelesen. Ich würde dies -10, wenn ich könnte, aber stattdessen muss ich mich mit -1 zufrieden geben.
Speck