Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Windows PowerShell 3, allows you to import and invoke a workflow that is packaged as a Windows PowerShell module. For information about Windows PowerShell modules, see Writing a Windows PowerShell Module.
The System.Management.Automation.Psjobproxyclass is used as a client side proxy for workflow objects on the server. The following procedure explains how to use a System.Management.Automation.Psjobproxyobject to invoke a workflow.
Creating a PSJobProxy object to execute workflow commands on a remote server.
Create an System.Management.Automation.Runspaces.Wsmanconnectioninfoobject to create a connection to a remote runspace.
Set the System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* property of the System.Management.Automation.Runspaces.Wsmanconnectioninfoobject to
Microsoft.PowerShell.Workflow
to specify a Windows PowerShell endpoint.Create a runspace that uses the connection created by completing the previous steps.
Create a System.Management.Automation.Powershellobject and set its System.Management.Automation.Powershell.Runspace* property to the runspace created in the previous step.
Import the workflow module and its commands into the System.Management.Automation.Powershell.
Create a System.Management.Automation.Psjobproxy object and use it to execute workflow commands on the remote server.
Example
The following code example demonstrates how to invoke a workflow by using Windows PowerShell.
This example requires Windows PowerShell 3.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
namespace WorkflowHostTest
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("Specify path to Workflow module");
return;
}
string moduleFile = args[0];
Console.Write("Creating Remote runspace connection...");
WSManConnectionInfo connectionInfo = new WSManConnectionInfo();
//Set the shellURI to workflow endpoint Microsoft.PowerShell.Workflow
connectionInfo.ShellUri = "Microsoft.PowerShell.Workflow";
//Create and open a runspace.
Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo);
runspace.Open();
Console.WriteLine("done");
PowerShell powershell = PowerShell.Create();
powershell.Runspace = runspace;
Console.Write("Setting $VerbosePreference=\"Continue\"...");
powershell.AddScript("$VerbosePreference=\"Continue\"");
powershell.Invoke();
Console.WriteLine("done");
Console.Write("Importing Workflow module...");
powershell.Commands.Clear();
//Import the module in to the PowerShell runspace. A XAML file could also be imported directly by using Import-Module.
powershell.AddCommand("Import-Module").AddArgument(moduleFile);
powershell.Invoke();
Console.WriteLine("done");
Console.Write("Creating job proxy...");
powershell.Commands.Clear();
powershell.AddCommand("Get-Proc").AddArgument("*");
PSJobProxy job = powershell.AsJobProxy();
Console.WriteLine("done");
Console.WriteLine();
Console.WriteLine("Using job proxy and performing operations...");
Console.WriteLine("State of Job :" + job.JobStateInfo.State.ToString());
Console.WriteLine("Starting job...");
job.StartJob();
Console.WriteLine("State of Job :" + job.JobStateInfo.State.ToString());
// use blocking enumerator to wait for objects until job finishes
job.Output.BlockingEnumerator = true;
foreach (PSObject o in job.Output)
{
Console.WriteLine(o.Properties["ProcessName"].Value.ToString());
}
// wait for a random time before attempting to stop job
Random random = new Random();
int time = random.Next(1, 10);
Console.Write("Sleeping for {0} seconds when job is running on another thread...", time);
System.Threading.Thread.Sleep(time * 1000);
Console.WriteLine("done");
Console.WriteLine("Stopping job...");
job.StopJob();
Console.WriteLine("State of Job :" + job.JobStateInfo.State.ToString());
Console.WriteLine();
job.Finished.WaitOne();
Console.WriteLine("Output from job");
Console.WriteLine("---------------");
foreach (PSObject o in job.Output)
{
Console.WriteLine(o.Properties["ProcessName"].Value.ToString());
}
Console.WriteLine();
Console.WriteLine("Verbose messages from job");
Console.WriteLine("-------------------------");
foreach (VerboseRecord v in job.Verbose)
{
Console.WriteLine(v.Message);
}
runspace.Close();
}
}
}