如何检索特定类型的CimInstance属性?

时间:2017-07-21 07:28:09

标签: c# .net wmi

所以,我一直在寻找一段时间,而我似乎无法找到(至少对我来说)一个简单的基础C#问题的答案。

为了进行设置,我正在整理一个C#GUI程序,该程序利用来自远程机器的CIM类来检索有关所述机器的数据,这些数据将用于确定它的当前状态"状态"从最终用户支持技术人员的角度来看。

我在设置远程计算机的CIM会话时没有问题,并通过查询实例来检索我请求的数据。我遇到的问题是,我似乎无法弄清楚如何从其中一个实例中检索属性的值,返回的值是某种预期类型。在编译和执行代码之前没有实际运行查询,IDE(Visual Studio 2017)假定返回值是超类型"对象" (请原谅任何白话问题)。

以下是我用作参考的代码:

public class DispRecord
{
    //declare properties for record object
    public string Hostname;
    public string Status;
    public string User;
    public string NTLogin;
    public string LockTime;
    public string LockDuration;
    public string LogonTime;
    public string LogonDuration;
    public string LastRestart;
    public string PwrOnDuration;
}

我有一个构造的自定义类对象,它包含我正在检索和计算的属性。

然后将此自定义对象传递给执行查询并将值分配给属性的函数。我的方法类有几个方法,但这里是当前的关键点:

//method for gathering CIM data
public static DispRecord QueryCIMData (DispRecord Record)
{
    //use cimsession to remote host
    using (CimSession Session = CimSession.Create(Record.Hostname, new DComSessionOptions()))
    {
        //declare queries
        string PwrQuery = "Select LastBootUpTime from CIM_OperatingSystem";
        //string ProcQuery = "Select CreationDate,Caption from CIM_Process where Name='explorer.exe' or Name='logonui.exe'";

        //declare namespace
        string Namespace = @"root\cimv2";

        //perform PwrQuery and retrieve lastbootuptime
        IEnumerable<CimInstance> Results = Session.QueryInstances(Namespace, "WQL", PwrQuery);
        DateTime LastBootUpTime = DateTime.Parse(Results.First().CimInstanceProperties["LastBootUpTime"].Value.ToString());

        //add PwrOnDuration and LastRestart to Record
        Record.LastRestart = LastBootUpTime.ToString();
        Record.PwrOnDuration = (DateTime.Now - LastBootUpTime).ToString(@"dd\/hh\:mm\:ss");
    }

    //return changed record object
    return Record;
}

你上面看到的确实有效,但我觉得实现正确输出所需的代码回转有点荒谬,我觉得必须有另一种,可能更简单或更清洁的方式来实现我想要的输出。当然有一种更好的方法来检索我期望的DateTime对象,而不是将属性值检索为从DateTime对象构造的字符串,然后将其解析为新的Datetime对象,特别是考虑到我正在转身并将其转换回来成为要插入记录的字符串。

理想情况下,我想做这样的事情,但我不确定如何实现它:

DateTime LastBootUpTime = Results.First().CimInstanceProperties["LastBootUpTime"].Value;

当我尝试上述操作时,编译器将抛出一个异常,指出它无法隐式转换类型&#39;对象&#39;的值。输入&#39; DateTime&#39;

基本上,由于查询直到运行时才执行,因此返回的CIM实例属性都只是期望的对象,而不是基于构建实例的类的预期输出(在这种情况下, a&#39; DateTime&#39;对象应该是&#34; LastBootUpTime&#34;属性的值。

即使MSDN确实如此,“守则”也不知道鸡蛋在孵化前会发出什么。

任何人都可以帮我解决这个看似简单的问题吗?

1 个答案:

答案 0 :(得分:1)

好的,经过一些试验和错误后,我找到了我确定存在的简单解决方案。

要使用编译器,对Convert.ToDateTime()方法的调用允许代码编译,并且在运行时不会抛出异常。

//perform PwrQuery and retrieve lastbootuptime
IEnumerable<CimInstance> Results = Session.QueryInstances(Namespace, "WQL", PwrQuery);
DateTime LastBootUpTime = Convert.ToDateTime(Results.First().CimInstanceProperties["LastBootUpTime"].Value);

//add PwrOnDuration and LastRestart to Record
Record.LastRestart = LastBootUpTime.ToString();
Record.PwrOnDuration = (DateTime.Now - LastBootUpTime).ToString(@"dd\/hh\:mm\:ss");

唯一的成本是少数&#34; DOH!&#34; s:)