web-dev-qa-db-fra.com

Pourquoi mon script créé localement n'est-il pas autorisé à s'exécuter sous la stratégie d'exécution RemoteSigned?

J'utilise Windows PowerShell 2.0 sur 64 bits Windows 7 Professional . J'ai un script sur mon bureau qui provoque l'erreur suivante lorsque je tente de l'exécuter:

File C:\Users\UserName\Desktop\Script.ps1 cannot be loaded. The file C:\Users\UserName\Desktop\Script.ps1 is not digitally signed. The script will not execute on the system.  Please see "get-help about_signing" for more details..
At line:1 char:54
+ C:\Users\UserName\Desktop\TestGetWindowsUpdateLog.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

Je suis à la fois administrateur de domaine et administrateur local, et si j'exécute Get-ExecutionPolicy -List, je peux voir que le Group Policy Object que j'ai créé pour configurer PowerShell applique correctement la stratégie d'exécution RemoteSigned au niveau de l'ordinateur:

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

J'ai créé le script moi-même dans Notepad , et j'ai utilisé l'utilitaire Sysinternals ' - et le fichier Properties pour confirmer que le script n'est pas traité comme provenant d'Internet. Si je copie le script sur un partage réseau sur un serveur de domaine, son exécution est autorisée. Si j'exécute Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine, le script local n'est toujours pas autorisé à s'exécuter, ce qui est logique, car la stratégie d'exécution de la portée MachinePolicy aura la priorité.

Comme indiqué dans about_Execution_Policies , la règle RemoteSigned signifie:

  • Les scripts peuvent courir.

  • Requiert une signature numérique d'un éditeur approuvé pour les scripts et les fichiers de configuration téléchargés depuis Internet (y compris les programmes de messagerie électronique et de messagerie instantanée).

  • Ne nécessite pas de signatures numériques sur les scripts que vous avez exécutés et que vous avez écrits sur l'ordinateur local (non téléchargés à partir d'Internet).

  • Risques liés à l'exécution de scripts non signés provenant de sources autres qu'Internet et de scripts signés, mais malveillants.

Mon script n'est pas signé, mais comme il est à la fois créé et exécuté localement, il devrait satisfaire au troisième point ci-dessus. Alors, pourquoi ne pas être autorisé à courir? Pourquoi PowerShell se plaint-il que mon script "n'est pas signé numériquement" alors que cette exigence ne devrait s'appliquer qu'aux fichiers provenant d'Internet? Et pourquoi ne s’inquiète-t-il plus du fait que le script ne soit pas signé lorsqu’il est exécuté à partir d’un partage réseau?

37
BACON

J'ai finalement trouvé cela jusqu'à .NET Code Access Security . J'ai des modules binaires développés en interne qui sont stockés et exécutés à partir d'un partage réseau. Pour que .NET 2.0/PowerShell 2.0 les charge, j'avais ajouté une règle d'URL au groupe de codes Intranet pour approuver ce répertoire:

PS C:\Users\UserName> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -listgroups
Microsoft (R) .NET Framework CasPol 2.0.50727.5420
Copyright (c) Microsoft Corporation.  All rights reserved.

Security is ON
Execution checking is ON
Policy change Prompt is ON

Level = Machine

Code Groups:

1.  All code: Nothing
    1.1.  Zone - MyComputer: FullTrust
        1.1.1.  StrongName - ...: FullTrust
        1.1.2.  StrongName - ...: FullTrust
    1.2.  Zone - Intranet: LocalIntranet
        1.2.1.  All code: Same site Web
        1.2.2.  All code: Same directory FileIO - 'Read, PathDiscovery'
        1.2.3.  Url - file://Server/Share/Directory/WindowsPowerShell/Modules/*: FullTrust
    1.3.  Zone - Internet: Internet
        1.3.1.  All code: Same site Web
    1.4.  Zone - Untrusted: Nothing
    1.5.  Zone - Trusted: Internet
        1.5.1.  All code: Same site Web

Notez que, selon les versions de .NET installées et Windows 32 ou 64 bits, caspol.exe peut exister aux emplacements suivants, chacun avec sa propre configuration de sécurité (security.config):

  • $Env:SystemRoot\Microsoft.NET\Framework\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework\v4.0.30319\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\

Après la suppression du groupe 1.2.3 (me laissant avec la configuration par défaut pour CAS), les scripts locaux fonctionnent à nouveau. Cela fait longtemps que je n’ai pas bricolé avec CAS, et je ne sais pas pourquoi ma règle semblerait interférer avec ceux qui accordent FullTrust à MyComputer, mais depuis CAS est obsolète à partir de .NET 4.0 3.0 est basé), je suppose que c'est un point discutable maintenant.

6
BACON

Le fichier est-il bloqué? J'ai eu le même problème et j'ai pu le résoudre en cliquant avec le bouton droit de la souris sur le fichier .PS1, Propriétés et en choisissant Débloquer.

74
O-Dogg

Quelques points à vérifier:

Pouvez-vous changer pour sans restriction?

Set-ExecutionPolicy Unrestricted

La stratégie de groupe est-elle définie?

  • Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell
  • User Configuration\Administrative Templates\Windows Components\Windows PowerShell

Aussi, comment appelez-vous Script.ps1?

Est-ce que cela lui permet de fonctionner?

powershell.exe -executionpolicy bypass -file .\Script.ps1
39
Andy Arismendi

Si le fichier est copié à partir d’un emplacement réseau, c’est-à-dire d’un autre ordinateur, Windows l’a peut-être bloqué. Faites un clic droit sur le fichier et cliquez sur le bouton de déblocage pour voir si cela fonctionne.

4
shyam

Ceci est un problème de IDE. Modifiez le paramètre dans l'interface graphique PowerShell. Accédez à l'onglet Outils et sélectionnez Options, puis Options de débogage . Cochez ensuite la case Désactivez la condition requise pour la signature des scripts . Terminé.

1
bdubb

Essayez de lancer l'interface graphique Powershell en tant qu'administrateur

0
Pauline

Lors de l’exécution d’un fichier PS1 pour un lecteur mappé sur Dropbox, j’ai constaté cette erreur. Lors de l'ouverture des propriétés de la PS1, il n'y a pas de "déblocage".

La seule chose qui fonctionne pour moi est

powershell.exe -executionpolicy bypass -file.\Script.ps1

0
GeekMustHave