2011-08-02 10 views
8

Chciałbym znaleźć jakiś wynik po tym zapytaniu, ale na początku pętli foreach występuje błąd "nieważna klasa".C# 'Nieprawidłowa klasa' w prostym zapytaniu WMI

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"]); 
} 

Używam okna 7 64 i zastanawiam się, czy istnieje Win32_Process. Używam również twórcy kodu wmi pobrać go z http://www.microsoft.com/downloads/en/details.aspx?familyid=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en , ale nie znajduję żadnych Win32_Process.

Ktoś ma pomysł?

+0

Czy chcesz tylko wyświetlić informacje o uruchomionych procesach? Nie potrzebujesz do tego WMI, sprawdź klasę Proces. –

+0

Rozwiązałem mój problem i napisałem odpowiedź, dziękuję wszystkim. –

Odpowiedz

11

mi rozwiązać mój problem. Wygląda na to, że mój WMI był uszkodzony. Po przetestowaniu WMI z tego kroku:

  1. kliknij przycisk Start, kliknij polecenie Uruchom, wpisz wmimgmt.msc, a następnie kliknij przycisk OK.
  2. Kliknij prawym przyciskiem myszy opcję Sterowanie usługą WMI (lokalne), a następnie kliknij polecenie Właściwości.

Widziałem Win32_Process był nieważny klasa śledzę ten krok do naprawy mój WMI, i to działa

1) na początku typu menu "cmd"

2) Typ „net stop winmgmt "i naciśnij Enter

3) Otwórz Eksploratora Windows i znajdź ścieżkę do folderu C: \ windows \ system32 \ WBEM \ i zmień nazwę folderu z repozytorium na coś innego, na przykład RepositoryOLD (kliknij prawym przyciskiem myszy i wybierz" Zmień nazwę folderu ") .

4) uruchom ponownie komputer

5) W Typ startu menu "cmd"

6) Typ "Stop winmgmt netto" i naciśnij enter

7) Typ "winmgmt/resetRepository" i ponownie uruchom komputer.

+0

Wielkie dzięki! Musiałem użyć konsoli administratora, ponieważ polecenie stop musiało zabić dodatkowe usługi, z tym, że działało jak czar! –

2

Jak Dominus zasugerował użycie klasy Process:

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

foreach (Process process in processes) 
    Console.WriteLine(process.ProcessName); 
... 
+1

niezły pomysł, ale ostatecznie chcę kolumna CommandLine, tak jak poniżej: "SELECT ProcessId, CommandLine FROM Win32_Process WHEN ..." Według [link] (http://stackoverflow.com/questions/504208/how-to -read-command-line-arguments-of-another-process-in-c) najlepszy sposób na umieszczenie linii poleceń w WMI. –

+0

Rozwiązałem mój problem i napisałem odpowiedź, dziękuję wszystkim. –

+0

Tyle tylko, że nie można zabić procesu w ten sposób. Musisz użyć usługi WMI. – NapkinBob