Exécuter du PowerShell depuis C#

Semaine dernière, un collègue me demande comment exécuter du PowerShell depuis C#. Plus exactement  depuis une page web afin de faciliter certaines actions d’administration SharePoint.

Préparation

Pour commencer, il faut utiliser la classe PowerShell du namespace System.Management.Automation. Vous pouvez récupérer la DLL System.Management.Automation.dllen passant par NuGet.

System.Management.Automation

System.Management.Automation (PowerShell 3.0)

Code

Exécuter du PowerShell

 

 

La logique par défaut de la classe consiste à lier les commandes entre elles par des pipes. Si vous voulez exécuter des commandes sans lien entre elles, il faut utiliser PowerShell.AddStatement() qui n’est disponible que dans Automation pour Powershell 3.0

équivalent à

Ensuite on appelle Powershell.Invoke() pour une exécution synchrone ou PowerShell.BeginInvoke() pour une exécution asynchrone.

Gérer les résultats

Les résultats sont contenus dans une collection de PSObject. Vous pouvez ensuite les parcourir et les manipuler pour réaliser votre dessein.

Gérer les erreurs

Vous pourrez trouver les messages, warning et erreurs en utilisant la propriété PowerShell.Streams. Si vous appelez plusieurs fois PowerShell.Invoke(), pensez à nettoyer les flux avant chaque appel à l’aide de Clear() (exemple : ps.Streams.Error.Clear())

Configurer l’environnement

A ce stade de l’article, vous pouvez exécuter du PowerShell depuis C#. C’est bien mais d’une utilité relative (par rapport à un script ou un module). Par contre depuis asp.net – vous en conviendrez – cela prend plus de sens.

Quelques messages et exceptions qui peuvent survenir :

Dynamic operations can only be performed in homogenous AppDomain.

An exception of type ‘System.TypeInitializationException’ occurred in System.Management.Automation.dll but was not handled in user code

Additional information: The type initializer for ‘System.Management.Automation.SessionStateScope’ threw an exception.

Pour résoudre ce problème, vous devez modifier le fichier web.config du site qui execute la page. Trouver la ligne contenant legacyCasModel et passer la valeur à false comme ci-après :

Si vous travaillez avec un timerjob SharePoint, il vous faudra éditer le fichier HIVE\BIN\OWSTIMER.EXE.CONFIG (source : SoftLanding.ca)

Références:

MSDN – System.Management.Automation.PowerShell

NuGet.org – System.Management.Automation

NuGet.org – System.Management.Automation (PowerShell 3.0)

Related Post

Synchroniser une liste de contacts SharePoint dans... Les listes de contacts SharePoint permettent à une équipe de gérer et partager un ensemble de contact de manière autonome. Vous utilisez la liste comm...
Créer un formulaire InfoPath avec PowerShell La reprise des données est souvent problématique quand on remplace un process papier par un formulaire InfoPath dans SharePoint. La saisie manuelle é...
Planifier l’exécution d’un package SSIS Maintenant nous savons comment créer et paramétrer un package SSIS, il reste donc à planifier l’exécution d’un package SSIS. Trois possibilités : ...
Configurer un package SSIS selon l’environne... Dans l’article précédent, vous avez pu voir comment configurer un package SSIS selon l’environnement. Le résultat est indéniablement intéressant mais ...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *