Pourquoi mes scripts PowerShell ne s'exécutent-ils pas?

103

J'ai écrit un simple fichier de commandes en tant que script PowerShell et j'obtiens des erreurs lorsqu'ils s'exécutent.

C'est dans un répertoire de scripts dans mon chemin. Voici l'erreur que j'obtiens:

Ne peut pas être chargé car l'exécution des scripts est désactivée sur ce système. Veuillez consulter "obtenir de l'aide sur la signature".

J'ai regardé dans l'aide, mais c'est moins qu'utile.

DévelopperChris
la source

Réponses:

102

Il peut s'agir du niveau de sécurité par défaut de PowerShell, qui (IIRC) n'exécutera que des scripts signés.

Essayez de taper ceci:

set-executionpolicy remotesigned

Cela indiquera à PowerShell d'autoriser l'exécution de scripts non signés locaux (c'est-à-dire sur un lecteur local).

Ensuite, essayez d'exécuter à nouveau votre script.

Matt Hamilton
la source
5
Vous devez exécuter Powershell avec des privilèges d'administrateur, au moins sous Windows 8!
ComFreek
1
Et vous devez également exécuter le script PowerShell avec des privilèges administratifs sous Windows 7.
Rod
14
C'est une réponse assez terrifiante. D'une part, il modifie définitivement le niveau de sécurité par défaut de Powershell de manière éventuellement indésirable (et non sécurisée). D'autre part, il ne parvient même pas à expliquer de manière adéquate que les scripts distants signés et les scripts locaux non signés - mais pas les scripts distants non signés, dont Chocolatey a parfois besoin - se verront accorder des privilèges d'exécution. La plupart des utilisateurs veulent probablement ceci et cela à la place.
Cecil Curry
1
Bien que l'inquiétude de Cecil quant à certaines faiblesses de la réponse soit juste, je voulais souligner quelques points. 1) Ses deux liens semblent ouvrir la même page pour moi. 2) Si vous voulez que les scripts s'exécutent simplement, la définition de la politique d'exécution est probablement encore la voie à suivre, et peut-être sans rapport avec OP: 3) il semble que la meilleure politique soit pour les scripts de démarrage, spécifiez la politique d'exécution et la portée dans la ligne de commande exécutez le script et, pour la connexion, définissez la configuration de session selon vos besoins. Si vous voulez une sécurité élevée pendant la session Windows mais réduite pour la connexion, vous voudrez être nuancé dans l'ordre de vos scripts.
omJohn8372
Pour les one-shots, je trouve la réponse d'Ankur ci - dessous, qui définit une exception temporaire pour l'instance PowerShell en cours d'exécution, la plus utile.
Florenz Kley
79

Vous devez exécuter Set-ExecutionPolicy:

Set-ExecutionPolicy Restricted <-- Will not allow any powershell scripts to run.  Only individual commands may be run.

Set-ExecutionPolicy AllSigned <-- Will allow signed powershell scripts to run.

Set-ExecutionPolicy RemoteSigned <-- Allows unsigned local script and signed remote powershell scripts to run.

Set-ExecutionPolicy Unrestricted <-- Will allow unsigned powershell scripts to run.  Warns before running downloaded scripts.

Set-ExecutionPolicy Bypass <-- Nothing is blocked and there are no warnings or prompts.
Nadeem_MK
la source
3
Quelle est la valeur ExecutionPolicy par défaut sur laquelle Windows définit une nouvelle installation?
Matthew Lock
5
@MatthewLock Restrictedest la stratégie par défaut. Lire la suite
Nadeem_MK
24

Utilisation:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Utilisez toujours la commande ci-dessus pour activer l'exécution de PowerShell dans la session en cours.

Naveen
la source
this + superuser.com/questions/612409/… + lien shorcut = perfection
Q20
16

J'ai pu contourner cette erreur en appelant PowerShell comme ceci:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Autrement dit, j'ai ajouté le -executionpolicy bypassà la façon dont j'ai appelé le script.

Cela a fonctionné sur Windows 7 Service Pack 1. Je suis nouveau sur PowerShell, donc il pourrait y avoir des mises en garde à faire que je ne suis pas au courant.

[Edit 2017-06-26] J'ai continué à utiliser cette technique sur d'autres systèmes, y compris Windows 10 et Windows 2012 R2 sans problème.

Voici ce que j'utilise maintenant. Cela m'empêche d'exécuter accidentellement le script en cliquant dessus. Quand je l'exécute dans le planificateur, j'ajoute un argument: "planificateur" et qui contourne l'invite.

Cela interrompt également la fenêtre à la fin pour que je puisse voir la sortie de PowerShell.

if NOT "%1" == "scheduler" (
   @echo looks like you started the script by clicking on it.
   @echo press space to continue or control C to exit.
   pause
)

C:
cd \Scripts

powershell -executionpolicy bypass -File .\rundps.ps1

set psexitcode=%errorlevel%

if NOT "%1" == "scheduler" (
   @echo Powershell finished.  Press space to exit.
   pause
)

exit /b %psexitcode%
si NewQuestion voteCLOSE
la source
C'est ce que chocolatey utilise pour télécharger et installer chocolatey
icc97
J'ai essayé d'exécuter la commande Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 et j'ai reçu un message d'erreur. Il n'y a pas d'option -File pour cette commande.
David Spector
Oh je vois. Vous devez créer un raccourci contenant la commande powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1. La commande test.ps1 est alors exécutée même lorsque la commande globale sûre Set-ExecutionPolicy Restricted a été donnée. J'espère que ces informations de base aident quelqu'un.
David Spector
5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

La commande ci-dessus a fonctionné pour moi même lorsque l'erreur suivante se produit:

Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.
user3335140
la source
5

Il est également intéressant de savoir que vous devrez peut-être l'inclure .\devant le nom du script. Par exemple:

.\scriptname.ps1
Léon Bambrick
la source
1

La commande set-executionpolicy unrestrictedpermettra à tout script que vous créez de s'exécuter en tant qu'utilisateur connecté. Assurez-vous simplement de redéfinir le paramètre de stratégie d'exécution sur signé à l'aide de la set-executionpolicy signedcommande avant de vous déconnecter.

ExchangeAdmin
la source
set-executionpolicy signeddonne Cannot bind parameter 'ExecutionPolicy'etc.
JinSnow
0

Sous Windows 10: cliquez sur modifier la propriété de sécurité de myfile.ps1 et modifiez «autoriser l'accès» par un clic droit / propriétés sur myfile.ps1

utilisateur2781940
la source