ManagementObjectSearcher错误

时间:2012-03-27 12:26:26

标签: c# system.management

我们的一些客户告诉我们,在某些情况下会出现以下错误:

  

System.Management.ManagementException:Błąddostawcy。
     在   System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus   ERRORCODE)。
     在   System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()

尝试循环访问System.Mamangment.ManagementObjectSearcher对象的Get()方法返回的集合时生成错误。

这是我方法的代码:

private bool PrinterExists(string printerName)
{
    bool retVal = false;
    SelectQuery q = new SelectQuery("select caption from win32_printer");
    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(q))
    {
        foreach (ManagementObject printer in searcher.Get())
        {
            if(printer["Caption"].ToString() == printerName)
            {
                retVal = true;
                break;
            }
        }
    }
    return retVal;
}

似乎问题仅出现在Windows XP上。我所知道的唯一解决方法是重建WMI数据库。它有时会有所帮助,但不幸的是并非总是如此。

任何人都可以告诉我这个错误的原因是什么,我该如何解决?

1 个答案:

答案 0 :(得分:0)

在枚举WMI集合时可能会出现许多错误,包括您无权查看对象的某些属性。您可以通过以管理员身份运行应用程序并查看错误是否消失来检查权限可能性。

无论根本原因如何,您可以尝试的一种解决方案是修改WQL查询以包含您要查找的打印机的名称。通过让WMI代替您进行枚举,它可以绕过有问题的项目。

SelectQuery q = new SelectQuery(
    "select caption from win32_printer where Caption='Fax' ");
bool found = new System.Management.ManagementObjectSearcher(q).Get().Count > 0;

如果这不起作用,则将Caption的比较放入异常处理程序,并忽略抛出异常的打印机。

当然,如果潜在的问题是您正在尝试查找您无权查看的打印机,那么您需要调整应用程序,以便它以提升的权限运行。