Solved

c# PowerShell runspace woes

Posted on 2016-09-27
5
92 Views
1 Endorsement
Last Modified: 2016-09-28
I have the following code, and an issue with it.  Starting with the PowerShell block:
Import-Module RemoteDesktop
$ConnBroker = (Get-RDConnectionBrokerHighAvailability -ConnectionBroker "dm3us050.dm3.wizmoworks.net").ActiveManagementServer
Set-RDSessionHost -SessionHost $server -ConnectionBroker $ConnBroke -NewConnectionAllowed $action

Open in new window

And the following c# code:
        public static void RunPowershellCommand(string scriptPath, string[,] variables = null)
        {
            RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
            Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
            runspace.Open();
            RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
            //scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
            
            Pipeline pipeline = runspace.CreatePipeline();

            Command myCommand = new Command(scriptPath, false);

            if (variables[0, 0] != null)
            {
                for (int i = 0; i < variables.GetLength(0); i++)  //Add all the powershell variables we might need in the partner specific.
                {
                    runspace.SessionStateProxy.SetVariable(variables[i, 0], variables[i, 1]);
                }
            }

            pipeline.Commands.Add(myCommand);
            Collection<PSObject> psObjects;
            psObjects = pipeline.Invoke();
            runspace.Close();
        }

Open in new window


The powershell script works independently, but when I run it from the c# runspace I get the following error:
{"The term 'Get-RDConnectionBrokerHighAvailability' 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."}

Any ideas why Powershell can't use this cmdlet when invoked via my c# app?

Thanks,
1
Comment
Question by:Dustin Saunders
  • 3
  • 2
5 Comments
 
LVL 40

Expert Comment

by:Subsun
ID: 41819788
My two cents :
Check the version of PowerShell when you invoke it from you app. I have see similar issues with our orchestrator server .net activity tasks, as it invokes/executes it’s commands still in PowerShell 2.0 instead of PS version installed on the computer.

As a work around, we are running the script in a sub process, example..

$Result = PowerShell { <Script Here> }

Check and see if there is a difference when you try these commands inside your app..

PowerShell {$Host.Version}
$Host.Version


Or it's possible that the RemoteDesktop module file is not accessible for the user account which you use to run the application/script.

To check the access issue, copy the module folder from default module path C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ to C:\Users\<UserName>\Documents\WindowsPowerShell\Modules and try to run app..
0
 
LVL 12

Author Comment

by:Dustin Saunders
ID: 41819854
That seems to work for executing the code, but it doesn't pass the variables through- is there a way I can dump the variables I pass to the script in the sub process? (doesn't look like I can add any -args)
0
 
LVL 40

Accepted Solution

by:
Subsun earned 500 total points
ID: 41819897
-Args should work.. Try..
Powershell.exe {Write-host $Args[0] $Args[1]} -Args $message,$message1

Or

Powershell.exe {Param($message,$Message1) Write-host $Message $Message1} -Args $message,$message1

Open in new window

0
 
LVL 12

Author Closing Comment

by:Dustin Saunders
ID: 41819940
Hey, that was incredibly helpful.  Thanks, greatly appreciated!
0
 
LVL 40

Expert Comment

by:Subsun
ID: 41819963
happy to help!.. :-)
0

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Synchronize a new Active Directory domain with an existing Office 365 tenant
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

775 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question