【发布时间】:2015-02-03 00:28:21
【问题描述】:
我在 C# 中使用 PowerShell 对象来执行远程命令。我要获取值的示例命令是Get-ExecutionPolicy,但没有返回标准输出。
最终目标是获取远程实例上的剩余磁盘空间。
这是我用来远程执行脚本的代码。它工作正常,按预期安静地执行所有测试,输出错误和异常,但是......没有标准输出。有人可以帮忙吗?
PowerShell ps = PowerShell.Create();
logger.LogAndDisplay(Logger.MessageType.Note, "Connecting to '" + instance0 + "'");
logger.LogAndDisplay(Logger.MessageType.Note, "Executing script on remote: '" + path0 + "'.");
ps.AddScript("$password = convertto-securestring -asplaintext -force -string " + pass);
ps.AddScript("$credential = new-object -typename system.management.automation.pscredential -argumentlist " + user + ", $password");
ps.AddScript("$session = new-pssession " + instance0 + " -credential $credential");
ps.AddScript("Invoke-Command -Session $session -FilePath " + path0);
ps.AddScript("Remove-PSSession $session");
Execute(ps);
private bool Execute(PowerShell ps0)
{
bool success = true;
PSOutput.Clear();
PSOutput = ps0.Invoke();
if (ps0.HadErrors)
{
success = false;
PSDataCollection<ErrorRecord> PSErrors = ps0.Streams.Error;
foreach (ErrorRecord e in PSErrors)
{
logger.LogAndDisplay(Logger.MessageType.Note, e.ToString());
}
}
if (PSOutput.Count() > 0)
{
logger.LogAndDisplay(Logger.MessageType.Subheader, "Command output:");
}
foreach (PSObject outputItem in PSOutput)
{
if (outputItem != null)
{
logger.LogAndDisplay(Logger.MessageType.Note, outputItem.BaseObject.GetType().FullName);
logger.LogAndDisplay(Logger.MessageType.Note, outputItem.BaseObject.ToString() + "\n");
}
}
logger.LogAndDisplay(Logger.MessageType.Note, "Command complete. Disconnecting.");
ps0.Dispose();
return success;
}
【问题讨论】:
-
您从哪里获得 powershell 代码中的
$session变量?为什么要从 powershell 使用Invoke-Command而不是使用远程运行空间?我不经常使用运行空间,所以我不只是在口头上问。 -
@briantist -
$session在前几行中设置了密码和用户名...它工作正常,我肯定会连接到远程实例并在远程实例上执行。我从来没有使用过运行空间,我现在会做一些研究。但是目前很多项目都是用PS来远程的,所以最好是围绕PS的解决方案。
标签: c# powershell remote-access