繁体   English   中英

ManagementObjectSearcher错误

[英]ManagementObjectSearcher error

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

System.Management.ManagementException:延迟运行。
在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数据库。 有时会有所帮助,但不幸的是并非总是如此。

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

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

当然,如果潜在的问题是您试图查找没有权限查看的打印机,则需要调整您的应用程序,使其以提升的权限运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM