4 votes

Activation de la politique d'exécution pour PowerShell à partir de C#

J'ai une page ASP.NET MVC 4 qui appelle un module PowerShell. Cependant, je rencontre un problème car un module que j'utilise n'est pas signé. Non affecté politique. Comment puis-je forcer l'enfant PowerShell à utiliser la stratégie Non affecté politique ?

J'ai activé cette fonction dans mon script, mais elle est ignorée. De plus, lorsque j'essaie de définir la politique dans le code, une exception est levée.

    using (Runspace myRunSpace = RunspaceFactory.CreateRunspace())
    {
        myRunSpace.Open();

        using (PowerShell powerShell = PowerShell.Create())
        {
            powerShell.Runspace = myRunSpace;
            powerShell.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted");
            powerShell.AddScript(script);

            objectRetVal = powerShell.Invoke();
        }
    }

12voto

kravits88 Points 1307

Si vous n'avez besoin d'exécuter qu'un seul script sans interactions, vous pouvez définir la politique d'exécution via l'invite de commande de la manière suivante :

string command = "/c powershell -executionpolicy unrestricted C:\script1.ps1";
System.Diagnostics.Process.Start("cmd.exe",command);

11voto

Jacob Archambault Points 124

Pour PowerShell 5.1 et PowerShell 7 Core, vous pouvez utiliser un fichier Politique d'exécution Enum pour définir la politique d'exécution, comme suit :

using Microsoft.PowerShell;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
...
public class MyClass
{
     public void MyMethod() 
     {
          // Create a default initial session state and set the execution policy.
          InitialSessionState initialSessionState = InitialSessionState.CreateDefault();
          initialSessionState.ExecutionPolicy = ExecutionPolicy.Unrestricted;

          // Create a runspace and open it. This example uses C#8 simplified using statements
          using Runspace runspace = RunspaceFactory.CreateRunspace(initialSessionState);
          runspace.Open();

          // Create a PowerShell object 
          using PowerShell powerShell = PowerShell.Create(runspace);

          // Add commands, parameters, etc., etc.
          powerShell.AddCommand(<command>).AddParameter(<parameter>);

          // Invoke the PowerShell object.
          powerShell.Invoke()
     }
}

5voto

Khan CAD Points 51

Vous devez utiliser le paramètre -Scope = CurrentUser :

  powershell.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted")
    .AddParameter("Scope","CurrentUser");

2voto

FrakyDale Points 145

C'est la même chose que la réponse de @kravits88 mais sans afficher le cmd :

static void runPowerShellScript(string path, string args) {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = @"/c powershell -executionpolicy unrestricted " + path + " " + args;
        startInfo.UseShellExecute = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.CreateNoWindow = true;
        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();
    }

0voto

Al West Points 128

Ma solution a été d'auto-signer les modules et script que j'exécutais à partir d'IIS Express. Je suis toujours en train de développer et j'ai découvert qu'IIS Express ne voit pas tous les modules que vous pouvez avoir installés dans le fichier \System32\WindowsPowerShell...\Modules Chemin. J'ai déplacé les modules que j'utilisais sur un autre disque et j'ai utilisé cet emplacement pour importer le module dans mon script.

Merci pour les réponses :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X