【发布时间】:2012-09-01 16:09:28
【问题描述】:
我有一系列功能齐全的 powershell 脚本,这些脚本利用了我希望能够从 C# WinForm 调用的远程处理。这是我到目前为止的代码
private void button1_Click(object sender, EventArgs e)
{
_runspace = RunspaceFactory.CreateRunspace();
_runspace.Open();
_ps = PowerShell.Create();
_ps.Runspace = _runspace;
var output = new PSDataCollection<PSObject>();
output.DataAdded += DataAdded;
_ps.AddScript(@"C:\projects\Acme\trunk\PowerShell\deploy-qa-p5.ps1");
_invokeResult = _ps.BeginInvoke<PSObject, PSObject>(null, output);
}
当我运行此代码时,我看到脚本中旨在针对远程会话执行的任何 powershell 命令实际上都在我的本地 PC 上执行。
例如,当直接从 Powershell.exe 执行这段代码时,会从远程服务器上卸载应用程序。当从上面的 C# 代码运行时,同样的代码会在我的本地机器上卸载上述应用程序:
Invoke-Command -Session $remoteSession -scriptblock $uninstallScript -ArgumentList $applicationGuid
同样,我的 C# 代码中引用的完全相同的 PS 脚本,当直接从 powershell.exe 执行时,对远程服务器按预期工作。
通过谷歌搜索,我发现了如何从 C# 创建远程运行空间。但是,这将需要我大量重构我的 PS 脚本以提取任何远程处理代码,这些代码将移至 C#。由于我仍然需要能够以独立模式(即直接从 powershell.exe)运行我的 PS 脚本,因此这不是一个可行的解决方案。
任何人都可以提出一个不需要重新调整我的 PS 脚本来解决这个问题的方法吗?
【问题讨论】:
-
从 C# 运行时检查是否有
$remoteSession。我在 C# 中使用Invoke-Command,但使用-ComputerName而不是-Session,它对我来说工作得很好
标签: c# powershell powershell-2.0 powershell-remoting