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?
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):
Set-ExecutionPolicy AllSigned
).Set-ExecutionPolicy RemoteSigned
).Set-ExecutionPolicy Unrestricted
).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
).
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!
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:
Win + r
et en tapant la commande mmc
.File -> Add Remove Snap In...
.Group Policy Object Editor
et ajoutez-le.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
.
Puis à Windows PowerShell
.
Donc, sélectionnez Turn on Script Execution
. Changez la configuration en Enabled
et spécifiez Allow all scripts
dans Execution Policy
.
Confirmez en appuyant sur Ok
et fermez la console de gestion.
Un correctif est maintenant disponible pour installer:
2.8.7 pour VS 2013: https://github.com/NuGet/Home/releases/download/2.8.7/NuGet.Tools.vsix
3.1.1 pour VS 2015: https://github.com/NuGet/Home/releases/download/3.1.1/NuGet.Tools.vsix
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>.
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.
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