【问题标题】:Get PowerShell.Invoke() output in C#在 C# 中获取 PowerShell.Invoke() 输出
【发布时间】:2018-07-31 11:28:13
【问题描述】:

我有一个应用程序,它允许用户在 Win 10 IoT 机器上配置基本的 WMI 设置。

我目前正在努力阅读所有已启用的 WEKF_PredefinedKey 设置。 我只是在运行一个脚本,我将它作为字符串添加到名为 ReadEnabledKeys 的项目设置中:

$CommonParams = @{"namespace"="root\standardcimv2\embedded"}
$CommonParams += $PSBoundParameters

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned;
     $keys = Get-WMIObject -class WEKF_PredefinedKey @CommonParams
        foreach($k in $keys) 
        {
            if($k.Enabled -eq $false)
            {
             "$k";
            }
        }

我在 C# 代码中的调用如下所示(注意:使用 System.Management.Automation):

 using (PowerShell PowerShellInstance = PowerShell.Create())
        {
          PowerShellInstance.AddScript(Properties.Settings.Default.ReadEnabledKeys);          
          var result = PowerShellInstance.Invoke();
        } 

我的变量结果将始终为空。 如果我直接在 Powershell 中运行脚本,输出就很好(所有快捷方式,当前未禁用)。

我使用统一写入过滤器编写了类似的程序,我在其中启用和禁用它:

$COMPUTER = "localhost"
$NAMESPACE = "root\standardcimv2\embedded"

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned;
$objUWFInstance = Get-WMIObject -namespace $NAMESPACE -class UWF_Filter;
$retval = $objUWFInstance.Enable();
if ($retval.ReturnValue -eq 0) {"Unified Write Filter will be enabled after the next system restart."}
else {"Unknown Error: " + "{0:x0}" -f $retval.ReturnValue}

还有 C# 调用:

 using (PowerShell PowerShellInstance = PowerShell.Create())
        {
          PowerShellInstance.AddScript(Properties.Settings.Default.EnableUWF);

          // [0] = result or error
          var result = PowerShellInstance.Invoke();
          if (result[0].ToString().ToLower().Contains("enabled"))
            MessageBox.Show(result[0].ToString(), "", MessageBoxButton.OK, MessageBoxImage.Information);
          else
            MessageBox.Show("Error when enabling the filter!  " + Environment.NewLine + result[0].ToString(), "",
                            MessageBoxButton.OK, MessageBoxImage.Error);
        }

这里我的结果变量将被预期的字符串填充。

我已尝试 Write-Host $k,因为我怀疑流有问题,但这没有任何成功。

Powershell 中的输出如下所示:

PS C:\Users\Administrator> C:\Users\Administrator\Desktop\Newfolder\Untitled1.ps1
\\DESKTOP-RMGOBMG\root\standardcimv2\embedded:WEKF_PredefinedKey.Id="Alt"\\DESKTOP-RMGOBMG\root\standardcimv2\embedded:WEKF_PredefinedKey.Id="Application"
\\DESKTOP-RMGOBMG\root\standardcimv2\embedded:WEKF_PredefinedKey.Id="Ctrl+Esc"
\\DESKTOP-RMGOBMG\root\standardcimv2\embedded:WEKF_PredefinedKey.Id="Ctrl+F4"
\\DESKTOP-RMGOBMG\root\standardcimv2\embedded:WEKF_PredefinedKey.Id="Ctrl+Tab"
.
.
.

谁能告诉我,问题是什么?

【问题讨论】:

  • Properties.Settings.Default.ReadEnabledKeys 这是在哪里定义的?为什么在 powershell 中这样做而不是通过 C# 查询 wmi?
  • 我编辑了问题,但是这个属性只是项目设置中的一个字符串,它包含我要执行的脚本的内容。

标签: c# powershell wmi


【解决方案1】:

问题似乎出在您的脚本上。设置 ExecutionPolicy 中游不会做任何事情,并且您没有编写函数,因此添加 $PSBoundParameters 也不会做任何事情。这是一个应该可以使用的示例(我会在未来指定 PS 版本。我知道您使用的是 v5.1/win10,因为键盘过滤)

$collection = [System.Collections.Generic.List[string]]::new()
foreach ($key in (Get-CimInstance -Namespace 'root\standardcimv2\embedded' -ClassName WEKF_PredefinedKey)) {
    if (-not $key.Enabled) {
        $collection.Add($key.ToString())
    }
}
return $collection

(简体)

@(Get-CimInstance -Namespace root\standardcimv2\embedded -ClassName WEKF_PredefinedKey).
    Where{-not $_.Enabled}.
    ForEach('ToString')

例子:

using (PowerShell ps = PowerShell.Create())
{
    string script = @"Import-Module -Name C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1 -ErrorAction Stop; @(Get-WmiObject -Namespace root\standardcimv2\embedded -Class WEKF_PredefinedKey -ErrorAction Stop).Where{-not $_.Enabled}.ForEach('ToString')";
    ps.AddScript(script);
    var result = ps.Invoke();
}

【讨论】:

  • @christian 并填充在 powershell 控制台中? ExecutionPolicy不确定权利;这是一个单独的概念。您是否尝试过删除 if 语句并返回整个键集合以查看是否返回了任何内容?
  • 这听起来像是您如何访问字符串的问题。您是否考虑过将字符串添加到代码中并对其进行测试?我会用一个例子更新我的答案@christian
  • @christian 你设置了一个断点,结果没有填充?这太奇怪了。不幸的是,我没有启用该类来测试返回。如果您删除 Where 过滤器,您会得到一个空集合吗?
  • 您是否考虑过将-ErrorAction Stop 添加到参数列表中以查看异常是否未通过/被忽略?
  • 只是这样做了,似乎 System.Management.Automation.ItemNotFoundException: '找不到路径'C:\Users\Administrator\Documents\WindowsPowerShell\Modules',因为它不存在。' ----- 还有这个: ----- System.Management.Automation.ItemNotFoundException: '找不到路径'C:\Windows\system32\WindowsPowerShell\v1.0\Modules\CimCmdlets\Microsoft.Management.Infrastructure。 CimCmdlets' 因为它不存在。老实说,让我有点困惑。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多