在C#

时间:2018-07-31 11:28:13

标签: c# powershell wmi

我有一个应用程序,允许用户在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);
        }

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

我尝试了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"
.
.
.

任何人都可以告诉我,这是什么问题?

1 个答案:

答案 0 :(得分: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();
}