为什么通过WMI查询系统还原点在Windows 7中工作,而不是Windows 10?

时间:2015-12-04 14:47:21

标签: c# wmi

当我需要在实现之前测试WMI代码时,我使用WMI Code Creator。它有点旧,但似乎效果很好。

我试图获取PC上的还原点列表,以便向用户显示此信息。当我在Windows 10上运行从代码创建器生成的代码时,即使我有5个设置,我也会得到0个还原点。当我在Windows 7上运行它时,它会显示所有还原点。

为什么这不能在Windows 10上运行?

try
{
    ManagementObjectSearcher searcher = 
        new ManagementObjectSearcher("root\\DEFAULT", 
        "SELECT * FROM SystemRestore"); 

    foreach (ManagementObject queryObj in searcher.Get())
    {
        Console.WriteLine("-----------------------------------");
        Console.WriteLine("SystemRestore instance");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine("SequenceNumber: {0}", queryObj["SequenceNumber"]);
    }
}
catch (ManagementException e)
{
    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}

1 个答案:

答案 0 :(得分:0)

我知道这篇文章已经有几个月了,但希望这对某些人有用。

您可以使用ManagementObjects枚举Windows(包括Win 10)中的还原点,而不是尝试自己运行查询:

ManagementScope ManScope = new ManagementScope(@"\\localhost\root\default");
ManagementPath ManPath = new ManagementPath("SystemRestore");
ObjectGetOptions ManOptions = new ObjectGetOptions();
ManagementClass ManClass = new ManagementClass(ManScope, ManPath, ManOptions);

foreach (ManagementObject mo in ManClass.GetInstances())
{
    // do whatever you want here
}

每个ManagementObject都代表一个SystemRestore实例,因此您现在可以轻松地检索其五个属性中的任何一个:

var description = mo["Description"].ToString();

以这种方式访问​​ManagementObjects的属性会返回一个对象,因此您仍然必须将值强制转换为适当的类型。

另请注意,GetInstances()方法返回一个ManagementObjectCollection,它允许您检索枚举器但不支持索引。因此,如果您需要做的不仅仅是简单地枚举还原点,您可能需要将它们复制到另一个数据结构。

祝你好运!