0

一部のお客様から、次のエラーが表示される場合があるとの連絡がありました。

System.Management.ManagementException:Błąddostawcy。
System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at 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;
}

問題はWindowsXPでのみ発生するようです。私が知っている唯一の回避策は、WMIデータベースの再構築です。それは時々役に立ちますが、残念ながら常にではありません。

このエラーの理由とその修正方法を教えてもらえますか?

4

1 に答える 1

0

オブジェクトの一部のプロパティを参照する権限がないなど、WMI コレクションの列挙中にエラーが発生する理由は多数考えられます。アプリを管理者として実行し、エラーが消えるかどうかを確認することで、アクセス許可の可能性を確認できます。

根本的な原因に関係なく、WQL クエリを変更して、探しているプリンターの名前を含めることができる解決策の 1 つです。ユーザーの代わりに 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 に答える