web-dev-qa-db-fra.com

Comment modifier avec succès la stratégie d'exécution et permettre l'exécution de scripts PowerShell

J'ai un problème avec la modification de Stratégie d'exécution dans le système d'exploitation Windows Server 2008+. C’est la première fois que j’essaie d’exécuter un script pour lequel j’ai besoin d’un accès complet aux ressources et j’essaie ce qui suit après avoir lancé Powershell in mode élevé :

Set-ExecutionPolicy Unrestricted

Mais je comprends ceci:

Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope.  Due to the override, your Shell will retain its current
effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. For more information please see
"Get-Help Set-ExecutionPolicy".
At line:1 char:1
+ Set-ExecutionPolicy Unrestricted
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException
    + FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand

Bien que je sois administrateur, je ne peux pas changer la stratégie d'exécution. Que faire? 

28
Andry

Le message d'erreur indique que le paramètre que vous essayez de définir via Set-ExecutionPolicy est remplacé par un paramètre d'une autre portée. Utilisez Get-ExecutionPolicy -List pour voir quelle étendue a quel paramètre.

PS C:\>Get-ExecutionPolicy -List

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

PS C:\>Set-ExecutionPolicy Restricted -Scope Process -Force
PS C:\>Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force
Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope.  Due to the override, your Shell will retain its current
effective execution policy of Restricted. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. ...
PS C:\>Get-ExecutionPolicy -List

        Scope    ExecutionPolicy
        -----    ---------------
MachinePolicy          Undefined
   UserPolicy          Undefined
      Process         RestrictedCurrentUser       Unrestricted
 LocalMachine       RemoteSigned

PS C:\>.\test.ps1
.\test.ps1 : File C:\test.ps1 cannot be loaded because running scripts is
disabled on this system. ...
PS C:\>Set-ExecutionPolicy Unestricted -Scope Process -Force
PS C:\>Set-ExecutionPolicy Restricted -Scope CurrentUser -Force
Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope.  Due to the override, your Shell will retain its current
effective execution policy of Restricted. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. ...
PS C:\>Get-ExecutionPolicy -List

        Scope    ExecutionPolicy
        -----    ---------------
MachinePolicy          Undefined
   UserPolicy          Undefined
      Process       UnrestrictedCurrentUser         Restricted
 LocalMachine       RemoteSigned

PS C:\>.\test.ps1Hello World!

Comme vous pouvez le constater, les deux paramètres ont été définis malgré l'erreur, mais le paramètre dans la portée plus spécifique (Process) est toujours prioritaire, ce qui empêche ou autorise l'exécution du script.

Etant donné que l'étendue par défaut est LocalMachine, l'erreur peut être provoquée par un paramètre de l'étendue CurrentUser ou Process. Cependant, une raison plus courante est que l'exécution du script a été configurée via une stratégie de groupe (locale ou domaine).

Un administrateur local peut modifier une stratégie de groupe local via gpedit.msc (éditeur de stratégie de groupe local), comme décrit dans cette réponse .

Une stratégie de groupe de domaine ne peut pas être remplacée par des paramètres/stratégies locaux et doit être modifiée par un administrateur de domaine via gpmc.msc (Gestion de la stratégie de groupe) sur un contrôleur de domaine.

Le paramètre peut être défini en tant que paramètre d'ordinateur pour les stratégies locales et de domaine.

Computer Configuration
`-Administrative Templates
  `-Windows Components
    `-Windows PowerShell -> Turn on Script Execution

ou en tant que paramètre utilisateur:

User Configuration
`-Administrative Templates
  `-Windows Components
    `-Windows PowerShell -> Turn on Script Execution

Les premiers sont appliqués aux objets informatiques, tandis que les derniers sont appliqués aux objets utilisateurs. Pour les stratégies locales, il n'y a pas de différence significative entre les stratégies utilisateur et ordinateur, car les stratégies utilisateur sont automatiquement appliquées à tous les utilisateurs de l'ordinateur.

Une stratégie peut avoir l'un des trois états (ou cinq si vous comptez les trois paramètres disponibles pour l'état activé séparément):

  • Non configuré: la stratégie ne contrôle pas l'exécution du script PowerShell.
  • Enabled: autorise l'exécution du script PowerShell .
    • Autoriser uniquement les scripts signés: autorise uniquement l'exécution de scripts signés (identique à Set-ExecutionPolicy AllSigned).
    • Autoriser les scripts locaux et les scripts signés distants: permet l'exécution de tous les scripts locaux (signés ou non) et des scripts signés à partir d'emplacements distants (identique à Set-ExecutionPolicy RemoteSigned).
    • Autoriser tous les scripts: permet l'exécution de scripts locaux et distants, qu'ils soient signés ou non (identique à Set-ExecutionPolicy Unrestricted).
  • Disabled: n'autorise pas l'exécution du script PowerShell (identique à Set-ExecutionPolicy Restricted).

Les modifications apportées via Set-ExecutionPolicy ne prennent effet que lorsque les stratégies locales et de domaine sont définies sur Non configuré (stratégie d'exécution Undefined dans les étendues MachinePolicy et UserPolicy).

30
Ansgar Wiechers

Le problème est que Windows ne permet pas que tous les scripts soient exécutés en mode Unrestricted. En fait, quelle que soit la politique d’exécution de votre utilisateur (même en tant qu’administrateur), le Local Group Policy sera prioritaire. 

Et par défaut, la stratégie d’exécution de script de groupe local est telle que les scripts ne sont pas autorisés à être exécutés. Nous devons le changer!

Modification de la stratégie d'exécution du groupe local

Nous faisons cela via le Local Group Policy Editor auquel vous pouvez accéder en cherchant dans la barre de recherche Windows la "stratégie de groupe". Ou faire ceci:

  1. Ouvrez la console de gestion en cliquant sur Win + r et en tapant la commande mmc.
  2. Allez à File -> Add Remove Snap In....
  3. Dans le volet de gauche, recherchez Group Policy Object Editor et ajoutez-le.
  4. Fermez le formulaire.

Ensuite, dans le volet de gauche, l'éditeur de groupe peut être développé. Développez-le et accédez à Computer Configuration -> Administrative Templates -> Windows Components.

enter image description here

Puis à Windows PowerShell.

enter image description here

Donc, sélectionnez Turn on Script Execution. Changez la configuration en Enabled et spécifiez Allow all scripts dans Execution Policy.

enter image description here

Confirmez en appuyant sur Ok et fermez la console de gestion.

26
Andry
11
Diganta Kumar

Si vous avez récemment rencontré ce problème avec visual studio 2015, vérifiez s’il existe des mises à jour pour le gestionnaire de paquets nuget dans outils> extensions et mises à jour>. 

8
Jhayes2118

Si PowerShell ExecutionPolicy est défini par un contrôleur de domaine via une stratégie de groupe, vous devez réinitialiser ExecutionPolicy sur "Contourner" dans le registre après chaque démarrage. J'ai créé une paire de scripts de démarrage pour automatiser le processus. Ci-dessous, je décris mon processus.

Créez un dossier appelé% USERPROFILE%\Documents\StartupScripts, puis placez-y un script PowerShell appelé ExecutionPolicy.ps1 avec le code suivant:

Push-Location
Set-Location HKLM:\Software\Policies\Microsoft\Windows\PowerShell
Set-ItemProperty . ExecutionPolicy "Bypass"
Pop-Location

Créez ensuite un fichier appelé% USERPROFILE%\AppData\Roaming\Microsoft\Windows\Menu Démarrer\Programmes\Startup\Startup.cmd et placez-y le code suivant:

PowerShell -Version 3.0 -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1
PowerShell -Version 3.0 "%USERPROFILE%\Documents\StartupScripts\ExecutionPolicy.ps1" >> "%TEMP%\StartupLog.txt" 2>&1

Ce script sera exécuté au début de chaque connexion.

4
Perry Tribolet

Créez le ps.cmd suivant et mettez-le dans votre PATH:

POWERSHELL -Command "$enccmd=[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content '%1' | Out-String)));POWERSHELL -EncodedCommand $enccmd"

Maintenant, vous pouvez exécuter n'importe quel script Powershell comme dans:

psa mypowershell.ps1
0
Marc