首页 > 解决方案 > 从 PowerShell 检索 GetExecutingRequests 到 c# 对象

问题描述

我正在尝试将数据从 PowerShell 检索到 ac# 对象中。我要查找的数据是从远程 Web 服务器上的 GetExecutingRequests 的 PowerShell Invoke() 返回的。我遇到的问题是我没有收到错误代码,但我正在寻找的 Invoke() 的结果在返回数据或 PowerShell 对象中不存在。

using (Runspace runspace = RunspaceFactory.CreateRunspace(cxn))
            {
                runspace.Open();
                using (PowerShell ps = PowerShell.Create())
                {
                    ps.Runspace = runspace;

                    string script = String.Format("Get-WmiObject 
    WorkerProcess -Namespace root\\WebAdministration -ComputerName {0} | 
    Invoke-WmiMethod -Name GetExecutingRequests", server);

                    ps.AddScript(script);
                    ps.AddParameter("OutputElement", new HttpRequest[0]);

                    var result = ps.Invoke();
                }
            }  

此代码执行,并返回一个包含 29 个项目的集合。但是,它们都没有显示 GetExecutingRequests 结果,并且 PowerShell 对象也没有任何相关内容。

我想将 GetExecutingRequests 的输出转换为 ac# 对象,以便进行进一步处理。ps 对象上的 PSDataStreams 也没有结果。

任何帮助,将不胜感激。

更多信息:

我能够通过更改我发送的 PowerShell 脚本来解决这个问题:

string script = String.Format("Get-WmiObject WorkerProcess -Namespace root\\WebAdministration -ComputerName {0} | Invoke-WmiMethod -Name GetExecutingRequests | %{{ $_ | Select-Object -ExpandProperty OutputElement }}", server);

标签: c#powershell

解决方案


我不太确定是否可以直接解析结果,但我建议在命令下方运行以获取有关返回对象的更多信息。从那里,您可以研究如何处理 C# 中的返回。

Get-WmiObject -Class $(<scriptblock>) | get-member
  1. 在 C# 中定义对象类型并查看您是否能够首先以这种方式捕获它。

如果您无法在自己捕获在 powershell 中返回的对象类型方面取得任何进展,则可能值得在此处发布以查看是否有其他人能够提供任何见解/经验,以及将这些对象类型连接到 C# 的变通方法.

  1. 如果上面确实不可能,那么强制 powershell 从标准输出返回所有内容将有助于确定它是否正在编写任何有意义的东西,您可以在 C# 中抓取/格式化。我认为在引用的 powershell 命令中执行此操作的最佳方法是:

    return $(Get-WmiObject WorkerProcess -Namespace root\WebAdministration -ComputerName {0} | Invoke-WmiMethod -Name GetExecutingRequests | *>&1)

这会将所有 5+ 标准输出从 powershell 返回到返回对象(对于那些阅读,请参阅ps 流上的这些文档)。您绝对应该能够在结果变量中捕获返回值,但确保您能够从溢出中抛出/捕获错误并没有什么坏处。

希望这有助于继续挖掘!


推荐阅读