Comment permettre l'exécution de scripts PowerShell?

260

Lorsque j'essaie d'exécuter mon script PowerShell, le message d'erreur suivant s'affiche:

Le fichier C: \ Common \ Scripts \ hello.ps1 ne peut pas être chargé car l'exécution des scripts est désactivée sur ce système. Veuillez voir "get-help about_signing" pour plus de détails.
À la ligne: 1 caractère: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Pavel Chuchuva
la source

Réponses:

400
  1. Démarrez Windows PowerShell avec l’option "Exécuter en tant qu’administrateur". Seuls les membres du groupe Administrateurs sur l'ordinateur peuvent modifier la stratégie d'exécution.

  2. Activez l'exécution de scripts non signés en entrant:

    set-executionpolicy remotesigned
    

Cela permettra d'exécuter des scripts non signés que vous écrivez sur votre ordinateur local et des scripts signés à partir d'Internet.

Voir aussi Exécution de scripts dans la bibliothèque Microsoft TechNet.

Pavel Chuchuva
la source
3
Est-ce que cela modifiera la stratégie de manière permanente ou devrai-je le faire chaque fois que je redémarre mon ordinateur?
Ray
2
@Ray Cela va changer la politique de façon permanente.
Pavel Chuchuva
1
@Ray Voir la documentation . Par défaut, il le définit pour le LocalMachine. Pour définir d'autres portées ( CurrentUserou Process), passez -Scopeexplicitement.
jpmc26
@PavelChuchuva devrais-je ajouter cette ligne au-dessus de mon script que vous vouliez dire
FabioSpaghetti
@FabioSpaghetti Pas besoin d'ajouter quoi que ce soit à vos scripts. Il suffit d’exécuter cette commande une fois en suivant les étapes.
Pavel Chuchuva le
74

La stratégie d'exécution par défaut est définie sur restreinte, vous pouvez le voir en tapant:

Get-ExecutionPolicy

Vous devez taper ce qui suit pour passer en mode sans restriction:

Set-ExecutionPolicy unrestricted

J'espère que cela t'aides

William Hilsum
la source
13
La signature requise est logique si vous attendez de l'utilisateur qu'il copie et colle des scripts malveillants à partir d'Internet. Si vous supposez que l'utilisateur n'est pas stupide, alors "remotesigned" n'apporte aucune sécurité et rend la vie difficile.
Guss
@Guss: En testant cela, j'ai constaté que RemoteSigned n'avait plus besoin de signer les fichiers .ps1 générés localement, et qu'il traitait le contrôle de source git en tant que source locale.
Josué
@ Josué - oui, exactement ce que je veux dire. Si RemoteSignedne bloque pas le copier-coller, ne bloque pas Git ou d'autres méthodes de téléchargement non-IE, alors à quoi ça sert? Dis-le avec moi: "Absolument rien!". Exiger que les scripts soient signés avec un certificat de signature de code de 100 USD est inutile, stupide et annule tout le bien qu'un langage de script décent peut faire pour Windows. Cela dit, si la solution consiste à amener les utilisateurs à comprendre ce qu’ils font pour utiliser les scripts PS, nous risquons d’être trop gênés ... Nahhhh, ça ne marchera jamais ;-)
Guss
@Guss: J'ai déjà un bon langage de script sous Windows. Cygwin fonctionne très bien sur Windows 10; littéralement tellement mieux que sur n'importe quelle version précédente de Windows. Je ne veux que faire courir des scripts que quelqu'un d'autre a déjà écrit.
Josué
61

Sur ma machine que j'utilise pour les scripts de développement, je vais utiliser -unrestricted comme ci-dessus. Lors du déploiement de mes scripts sur un ordinateur d'utilisateur final, j'appellerai simplement PowerShell avec le commutateur -executionpolicy:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1
MDMoore313
la source
2
Vous pouvez combiner cette astuce avec une astuce polyglotte dans un fichier .CMD. Voir stackoverflow.com/a/8597794/5314
Jay Bazuzi
Agréable! J'ai déployé les SFX de
MDMoore313
1
Cette astuce m'a permis de lancer le script powershell de Git Bash (MINGW32 bash)
Kamil Szot le
16

Nous pouvons obtenir le statut de ExecutionPolicy actuel à l'aide de la commande ci-dessous:

Get-ExecutionPolicy;

Par défaut, il est restreint . Pour autoriser l'exécution de scripts PowerShell, vous devez définir cette ExecutionPolicy sur Bypass ou Unrestricted .

Nous pouvons définir la stratégie pour l'utilisateur actuel comme Bypassou Unrestricteden utilisant l'une des commandes PowerShell ci-dessous:

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

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

Une politique sans restriction charge tous les fichiers de configuration et exécute tous les scripts. Si vous exécutez un script non signé téléchargé depuis Internet, vous êtes invité à fournir une autorisation avant son exécution.

Tandis que dans la stratégie de contournement , rien n'est bloqué et il n'y a aucun avertissement ou invite lors de l'exécution du script. Bypass ExecutionPolicy est plus détendu que Sans restriction.

Pratik Patil
la source
5

Selon la version et la configuration de Windows, l'avertissement suivant peut s'afficher, même en Unrestrictedmode:

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")

La solution consiste à utiliser la stratégie "contourner", activée avec la commande suivante:

Set-ExecutionPolicy Bypass

De la documentation :

Bypass: rien n'est bloqué et il n'y a aucun avertissement ni invite.

Ceci est évidemment peu sûr, veuillez comprendre les risques encourus.

Benoit Blanchon
la source
C’est la seule façon pour moi de pouvoir exécuter mon script dans un environnement WINE avec Powershell 2.0. Je vous remercie.
Wyatt8740
@ Wyatt8740: Parce que Wine présente tous les lecteurs comme des lecteurs réseau.
Josué
@ Josué, je n'en avais aucune idée. pouvez-vous me donner une source pour cette déclaration? J'ai essayé un google occasionnel, mais je vis évidemment mal.
Wyatt8740
@ Wyatt8740: Source: Boîte de dialogue commune Wine OpenFileName. Regardez les icônes du lecteur.
Josué
@ Josué, je voulais dire une source de code source; les icônes sont éventuellement arbitraires. Mais je n'y avais pas pensé. Je suppose que c'est un bon endroit pour commencer: (modifier ne semble pas qu'ils sont ici .)
Wyatt8740
2

Une clé de
registre avec: Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE \ LOGICIEL \ Policies \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword: 00000001 "ExecutionPolicy" = "Contournement"

et:

Windows Registry Editor Version 5.00

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

fonctionne en effet aussi.

Giesbert Schipper
la source
1

Pour une raison quelconque, la cmdlet PowerShell n'a pas permis l'exécution locale au niveau global, uniquement pour le contexte utilisateur local. Si j'essayais de démarrer un script Powershell à partir de l'invite bash de CygWin, par exemple, qui s'exécute sous son propre contexte utilisateur, il ne s'exécuterait pas, donnant l'erreur "n'est pas signé numériquement". La réponse a été d'aller dans l'éditeur de stratégie de groupe locale -> Stratégie d'ordinateur local -> Modèles d'administration -> Composants Windows -> Windows PowerShell et double-cliquez sur "Activer l'exécution du script". Cela me laisse ensuite changer pour «Activé», puis la politique d’exécution «Autoriser les scripts locaux et les scripts signés distants» et le faire fonctionner globalement quel que soit le contexte de l’utilisateur.

Eric Green
la source
0

La réponse acceptée est correcte, mais la modification de stratégie n'est disponible que pour l'instance actuellement en cours de Powershell, ce qui signifie qu'une fois que l'instance de Powershell est fermée. La politique sera réinitialisée. Si un utilisateur rouvre une autre instance de Powershell, la stratégie par défaut sera appliquée.Restricted

Pour moi, je dois utiliser la console VisualStudio Code et g ++ de cygwin pour créer des choses. La console utilise Powershell, avec la politique par défaut, rien ne peut être fait. Une solution consiste à modifier la stratégie à chaque fois que la console est déclenchée dans la console Code VisualStudio, par exemple un script de modification de la stratégie.

Je suis paresseux, alors une autre solution consiste à exécuter Powershell en mode administrateur, comme ce que fait la réponse acceptée. mais avec un paramètre supplémentaire qui change les valeurs dans la table de registre. Une fois que cela a été fait. D'autres instances de Powershell utiliseront la RemoteSignedstratégie par défaut.

set-executionpolicy remotesigned -Scope CurrentUser

r0ng
la source
0

Définir la stratégie (correctement) est le meilleur choix, mais sur mes systèmes gérés, je ne suis pas en mesure de la modifier.

Pour moi, la solution la plus simple pour modifier la stratégie consiste à ouvrir le script dans "PowerShell ISE" , à mettre en surbrillance le code (ou une partie du code) à exécuter, puis à cliquer sur le bouton "Exécuter la sélection" (ou utiliser la touche F8). raccourci).

Ce n'est pas la meilleure solution et ne fait pas grand chose pour l'automatisation des tâches, mais cela me permet d'utiliser et d'utiliser PowerShell tout en évitant les problèmes de mon service informatique.

DBADon
la source
-2

La raison pour laquelle la clé de reg fonctionne, c'est parce qu'il fait exactement ce que font les commandes PS. Les commandes écrivent les modifications dans les clés de registre. Les commandes sont beaucoup plus rapides et faciles que de créer une clé de registre ou de creuser dans le registre.

Keith
la source
1
C'est tout simplement faux: les clés mentionnées dans d'autres réponses modifient la stratégie d'exécution de Pellshells, ce qui permet ensuite l'exécution du script Powershell.
Patrick R.