Question:
I need to run powershell cmdlets using C# in Visual Studio Console.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Management.Automation; using System.Threading; using System.Management.Automation.Runspaces; using System.Collections.ObjectModel; using System.Collections; namespace ConsoleApp1 { class Program { private static string RunScript() { Runspace runSpace = RunspaceFactory.CreateRunspace(); runSpace.Open(); Pipeline pipeline = runSpace.CreatePipeline(); Command cmd = new Command("Connect-MsolService"); pipeline.Commands.Add(cmd); ICollection results = pipeline.Invoke(); // Here exception occurs runSpace.Close(); StringBuilder stringBuilder = new StringBuilder(); foreach (PSObject obj in results) { stringBuilder.AppendLine(obj.ToString()); } return stringBuilder.ToString(); } static void Main(string[] args) { using (PowerShell PowerShellInstance = PowerShell.Create()) { Console.WriteLine(RunScript()); Console.ReadKey(); } } } } |
When I run the code an Exception occurs:
The term ‘Connect-MsolService’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Even though it works when I run the commands in Powershell.
Answer:
Try to use PowerShell instance, like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
InitialSessionState iss = InitialSessionState.CreateDefault(); iss.ImportPSModule(new[] { "MSOnline" }); iss.LanguageMode = PSLanguageMode.FullLanguage; var _o365Runspace = RunspaceFactory.CreateRunspace(iss); _o365Runspace.Open(); var _o365Shell = PowerShell.Create(); _o365Shell.Runspace = _o365Runspace; var connect = new Command("Connect-MsolService"); connect.Parameters.Add("Credential", new PSCredential("logon@name", GetSecureString("Password")); _o365Shell.Commands.AddCommand(connect); // add some msol commands to _o365Shell.Commands as well _o365Shell.Invoke(); |