web-dev-qa-db-fra.com

Comment permettre l'exécution de scripts PowerShell?

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

232
Pavel Chuchuva
  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 Scripts en cours d'exécution dans la bibliothèque Microsoft TechNet.

353
Pavel Chuchuva

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

68
William Hilsum

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
59
MDMoore313

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

Get-ExecutionPolicy;

Par défaut, il s'agit de Restricted . Pour permettre l'exécution de scripts PowerShell, vous devez définir cette ExecutionPolicy comme suit: Bypass ou Unrestricted .

Nous pouvons définir la stratégie pour l'utilisateur actuel sur Bypass ou Unrestricted en utilisant l'une des commandes PowerShell ci-dessous:

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

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

Unrestricted policy 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.

Alors que dans Bypass policy, 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.

14
Pratik Patil

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

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.

4
Benoit Blanchon

Une clé de registre avec:
Éditeur du registre Windows, 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.

2
Giesbert Schipper

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 local -> 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 permet de le changer en "Activé" puis la politique d'exécution "Autoriser les scripts locaux et les scripts signés distants" et de le faire fonctionner globalement quel que soit le contexte de l'utilisateur.

1
Eric Green

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, qui est Restricted, sera appliquée.

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 stratégie RemoteSigned par défaut.

set-executionpolicy remotesigned -Scope CurrentUser

0
r0ng