异步远程 WMI 调用 C#

Asynchronous Remote WMI Calls C#

我真的很难以异步方式从远程主机获取 WMI 数据。经过大量研究,我找不到任何明确的例子,微软的文档只有 VB 和 C++ 代码,甚至还有文章解释为什么这是个坏主意。我来自 PowerShell,因此我只需创建一个新的运行空间来获取信息。

我目前有一个 WPF window,我想在更新 window 之前在查询信息时保持响应。我目前只设法使用 CimSession.Create 和 QueryInstance.

来使用同步调用

非常感谢您对此提供帮助:)

您可以使用 ORMi 异步方法来执行异步 WMI 工作。例如:

WMIHelper helper = new WMIHelper("root\CimV2");
List<Processor> processors = await helper.QueryAsync<Processor>().ToList();

在 MSDN 论坛上提出同样的问题后,我得到了正确的答案,我想我也会在这里分享它:) 我已经在代码中添加了注释来解释发生了什么:

//Used to define what is returned in the async results
public static CimAsyncMultipleResults<CimInstance> GetValues(CimSession _session)
{
    return _session.QueryInstancesAsync(@"root\cimv2", "WQL", "SELECT Username FROM Win32_ComputerSystem");
}

//This watches the async progress
class CimInstanceWatcher : IObserver<CimInstance>
{
    public void OnCompleted()
    {
        Console.WriteLine("Done");
    }

    public void OnError(Exception e)
    {
        Console.WriteLine("Error: " + e.Message);
    }

    public void OnNext (CimInstance value)
    {
        Console.WriteLine("Value: " + value);
    }
}

private static void Main()
{
    //Leaving cimsession creation as sync because is happens "instantly"
    CimSession Session = CimSession.Create("PC-NAME");
    //Creating a new watcher object
    var instanceObject = new CimInstanceWatcher();
    //Subscribing the watcher object to the async call
    GetValues(Session).Subscribe(instanceObject);
    Console.ReadLine();
}