为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
人到中年有点甜 2021-11-07 20:40:08
我有一个应用程序,它允许用户在 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);        }在这里,我的结果变量将填充预期的字符串。谁能告诉我,这是什么问题?
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

问题似乎出在您的脚本上。设置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();

}


查看完整回答
反对 回复 2021-11-07
  • 1 回答
  • 0 关注
  • 505 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信