0

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

System.Management.ManagementException:Błąd dostawcy。
在 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 数据库。它有时会有所帮助,但不幸的是并非总是如此。

谁能告诉我这个错误的原因是什么,我该如何解决?

4

1 回答 1

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 的比较放入异常处理程序中,并忽略引发异常的打印机。

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

于 2012-03-27T17:14:22.650 回答