web-dev-qa-db-fra.com

Exécution de PowerShell à partir de .NET Core

Existe-t-il un moyen d'exécuter des scripts PowerShell à partir de .net-core? 

J'essaie d'exécuter un script PowerShell dans un nouveau 'site Web\api' . Core .net. Pour pouvoir utiliser PowerShell sur .net, nous devons ajouter le

Espace de noms System.Management.Automation.

Ce n’est pas possible pour le noyau .net (ou je n’ai pas trouvé le moyen approprié de l’ajouter) . Il existe quelques paquets NuGet qui visent également à ajouter ce DLL au projet, mais ne sont pas compatibles avec .net core non plus . Y a-t-il un moyen de le faire sur .net core? Voici quelques liens que j'ai essayés mais aucun d'entre eux n'est spécifique au noyau .net:

http://www.powershellmagazine.com/2014/03/18/writing-a-powershell-module-in-c-part-1-the-basics/

Référencement de system.management.automation.dll dans Visual Studio

https://www.nuget.org/packages/System.Management.Automation/

17
JanivZ

La réponse officielle est que l'exécution de PowerShell Core à partir de votre propre application n'est actuellement pas prise en charge. Le problème le plus important est probablement que .Net Core manque AppDomain.GetAssemblies(), ce qui pourrait être corrigé dans .Net Core 1.2.

6
svick

On dirait qu’il est bien pris en charge à partir de .NET Core 2.0 et PowerShell 6 Beta 3 (bien qu’il ait été pris en charge dans les versions bêta 1 et 2 également mais pas aussi facilement), voici un lien vers la documentation Host PowerShell dans le dépôt GitHub

Et ils donnent un bon exemple d'application montrant qu'ils fonctionnent avec .NET Core 2.0 et PowerShell Core v6.0.0-beta.3 et versions ultérieures:

https://github.com/PowerShell/PowerShell/tree/master/docs/Host-powershell

Afin d’obtenir les bons paquets dans ma liste de paquets NuGet, j’avais besoin d’ajouter powershell-core en tant que nouvel emplacement de référentiel NuGet qui était:

https://powershell.myget.org/F/powershell-core/api/v3/index.json

Je pourrais alors installer les packages NuGet:

install-package Microsoft.powershell.sdk -version 6.0.0-rc
install-package Microsoft.powershell.commands.diagnostics -version 6.0.0-rc
install-package Microsoft.wsman.management -version 6.0.0-rc

Ces trois dépendances étaient obligatoires et je pouvais ensuite exécuter la commande PowerShell simple suivante dans mon application Web MVC asp.net principale:

public class PowerShellHelper
{
    public void Execute(string command)
    {
        using (var ps = PowerShell.Create())
        {
            var results = ps.AddScript(command).Invoke();
            foreach (var result in results)
            {
                Debug.Write(result.ToString());
            }
        }
    }
}
11
James Eby

Bien que la réponse de James Eby soit correcte, il y a eu quelques nouvelles informations que j'ai trouvées utiles. 

Il existe maintenant PowerShell Core disponible pour une utilisation multiplate-forme. Et c'est open source!

Voici quelques points utiles de l'article de Microsoft :

PowerShell prend désormais officiellement en charge macOS et Linux, notamment:

  • Windows 7, 8.1 et 10 
  • Windows Server 2008 R2, 2012 R2, 2016 
  • Canal semestriel de Windows Server
  • Ubuntu 14.04, 16.04 et 17.04 
  • Debian 8.7+, et 9 
  • CentOS 7 
  • Red Hat Enterprise Linux 7 
  • OpenSUSE 42.2 
  • Fedora 25, 26 
  • macOS 10.12+

Enregistrement

Sous macOS, PowerShell utilise les API natives os_log pour se connecter au système de journalisation unifiée d'Apple. Sous Linux, PowerShell utilise Syslog, une solution de journalisation omniprésente.

Remoting PowerShell basé sur SSH

Le protocole PSRP (PowerShell Remoting Protocol) fonctionne désormais avec le protocole SSH (Secure Shell) en plus du PSRP traditionnel basé sur WinRM. La source

Breaking Changes lien

1
Roman

Merci pour @Roman et @JamesEby.

Si nous ne pouvons pas utiliser dotnet core 2.0 ou version ultérieure et que nous pouvons utiliser Process pour exécuter PowerShell.exe dans Windows.

Le chemin est C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe et nous pouvons utiliser Process dans ce code.

        var process = new Process
        {
            StartInfo = new ProcessStartInfo(@"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",
                script)
            {
                WorkingDirectory = Environment.CurrentDirectory,
                RedirectStandardOutput = true,
                CreateNoWindow = true,
            }
        };
        process.Start();

        var reader = process.StandardOutput;
        return reader.ReadToEnd();

La valeur de script est le script PowerShell et la fonction reader.ReadToEnd() renvoie le texte de sortie de Power Shell.

Voir: https://stackoverflow.com/a/30846513/6116637

0
lindexi