2011-08-02 22 views
8

Me gustaría encontrar algún resultado después de esta consulta, pero al comienzo del ciclo foreach, aparece el error "clase no válida".C# 'Clase no válida' en una simple consulta 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"]); 
} 

Uso window 7 64, y me pregunto si existe Win32_Process. También uso el creador de código wmi, descárguelo de http://www.microsoft.com/downloads/en/details.aspx?familyid=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en pero no encuentro ningún Win32_Process.

Alguien tiene una idea?

+0

¿Está tratando de enumerar la información del proceso en ejecución? No necesita WMI para eso, consulte la clase Process. –

+0

Resolví mi problema y publiqué la respuesta, gracias a todos. –

Respuesta

11

que resolver mi problema. Parece que mi WMI era corrupta. Después de probar WMI con este paso:

  1. Haga clic en Inicio y en Ejecutar, escriba wmimgmt.msc y, a continuación, haga clic en Aceptar.
  2. Haga clic con el botón derecho en Control WMI (Local) y luego haga clic en Propiedades.

vi Win32_Process era una clase no válida sigo este paso para la reparación de mi WMI, y que funcione

1) En el inicio de tipo menú "cmd"

2) Tipo "net stop winmgmt "y presione Intro

3) Abra un Explorador de Windows y busque la ruta a la carpeta C: \ windows \ system32 \ WBEM \ y cambie el nombre de la carpeta Repositorio a otra cosa como RepositoryOLD (haga clic derecho y elija 'Cambiar nombre de carpeta') .

4), reinicie el equipo

5) En el inicio de tipo menú "cmd"

6) Tipo de "parada winmgmt red" y pulse enter

7) Tipo "winmgmt/resetRepository" y reinicia la computadora.

+0

¡Muchas gracias! Necesitaba usar una consola de administrador porque el comando de detención tenía que eliminar algunos servicios adicionales, ¡excepto que funcionaba como un amuleto! –

2

Como sugirieron dominus, utilice la clase de proceso:

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

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

no es una mala idea, pero al final quiero la columna CommandLine, así: "SELECT ProcessId, CommandLine FROM Win32_Process CUANDO ..." Según [link] (http://stackoverflow.com/questions/504208/how-to -read-command-line-arguments-of-another-process-in-c) la mejor manera de tener línea de comandos es con WMI. –

+0

Resolví mi problema y publiqué la respuesta, gracias a todos. –

+0

Excepto que no se puede matar el proceso de esta manera. Necesitarías usar WMI. – NapkinBob

Cuestiones relacionadas