在 C# 中获取 PowerShell.Invoke() 输出

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


我目前正在努力阅读所有启用的 WEKF_PredefinedKey 设置。我只是在运行一个 skript,我将它作为字符串添加到名为 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 中运行 skript,输出就好了(所有快捷方式,目前都没有被禁用)。


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


$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);

        }

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

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


人到中年有点甜
浏览 512回答 1
1回答

LEATH

问题似乎出在您的脚本上。设置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();}
打开App,查看更多内容
随时随地看视频慕课网APP