11

このクエリの後に何らかの結果を見つけたいのですが、foreach ループの最初で「無効なクラス」というエラーが発生します。

string wmiQuery = string.Format("SELECT * FROM Win32_Process");
var searcher = new ManagementObjectSearcher(wmiQuery);
var wmiResults = searcher.Get();

foreach (ManagementObject retObject in wmiResults)
 {
   Console.WriteLine("[{0}]\tName: {1}", retObject["ProcessID"], retObject["Name"]);
 }

ウィンドウ 7 64 を使用していますが、Win32_Process が存在するかどうか疑問に思っています。また、 http://www.microsoft.com/downloads/en/details.aspx? familyid=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en からダウンロードする wmi コード作成者を使用します が、Win32_Process が見つかりません。

誰かがアイデアを持っていますか?

4

4 に答える 4

17

私は私の問題を解決します。私の WMI が壊れているようです。この手順で WMI をテストした後:

  1. [スタート]、[ファイル名を指定して実行] の順にクリックし、「wmimgmt.msc」と入力して、[OK] をクリックします。
  2. [WMI コントロール (ローカル)] を右クリックし、[プロパティ] をクリックします。

Win32_Process が無効なクラスであることがわかりました。この手順に従って WMI を修復すると、うまくいきます

1) スタート メニューで「cmd」と入力します。

2) 「net stop winmgmt」と入力し、Enter キーを押します。

3) Windows エクスプローラーを開き、C:\ windows\system32\WBEM\ フォルダーへのパスを見つけて、Repository フォルダーの名前を RepositoryOLD などの別の名前に変更します (右クリックして [フォルダーの名前を変更] を選択します)。

4) コンピューターを再起動します

5) スタート メニューで「cmd」と入力します。

6) 「net stop winmgmt」と入力し、Enter キーを押します。

7) 「winmgmt /resetRepository」と入力し、コンピューターを再起動します。

于 2011-08-03T17:15:07.787 に答える
2

dominus が提案したように、Process クラスを使用します。

...
Process[] processes = Process.GetProcesses();

foreach (Process process in processes)
    Console.WriteLine(process.ProcessName);
...
于 2011-08-02T21:42:25.283 に答える
0

私の意見では、例外は問題を十分に述べていません。以下のコードは機能します。たとえば、スコープで「\cimv2」を省略すると、例外が発生します。たとえば、「Win32_Processes」から誤って選択した場合も、例外が発生します。したがって、少なくともスコープが正しく、クエリが正しいことを確認してください。

ManagementScope scope = new ManagementScope(@"\\localhost\root\cimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementBaseObject eachObject in searcher.Get())
{
    Console.WriteLine("Value: {0}", eachObject);
}
于 2018-05-03T11:16:10.233 に答える