2012-06-01 13 views
7

Tengo tres PC remotas a las que me conecto de forma remota. Intento escribir una aplicación simple de Windows que muestre en una sola ventana si un proceso en particular se está ejecutando en cualquiera de las máquinas, p.¿Se está ejecutando un proceso en una máquina remota?

servidor 1: Chrome no correr

servidor 2: Chrome se está ejecutando

Server3: Chrome se está ejecutando

Solía ​​WMI y C#. Hasta ahora tengo esto:

  ConnectionOptions connectoptions = new ConnectionOptions(); 

      connectoptions.Username = @"domain\username"; 
      connectoptions.Password = "password"; 

      //IP Address of the remote machine 
      string ipAddress = "192.168.0.217"; 
      ManagementScope scope = new ManagementScope(@"\\" + ipAddress + @"\root\cimv2"); 
      scope.Options = connectoptions; 
      //Define the WMI query to be executed on the remote machine 
      SelectQuery query = new SelectQuery("select * from Win32_Process"); 

      using (ManagementObjectSearcher searcher = new 
         ManagementObjectSearcher(scope, query)) 
      { 

       ManagementObjectCollection collection = searcher.Get(); 
       foreach (ManagementObject process in collection) 
       { 
        // dwarfs stole the code!! :'(      
       } 
      } 

Creo que es todo configurado correctamente, pero si MessageBox.Show (process.ToString()) dentro del bucle foreach, me sale un montón de mensajes cuadros con el texto siguiente:

\\username\root\cimv2:W32_Process.Handle="XXX" 

I am kind of stuck. ¿Hay alguna forma de que pueda "traducir" ese XXX a un nombre de proceso? O bien, ¿cómo puedo obtener realmente los nombres de los procesos para poder usar una declaración if para verificar si se trata de un proceso "chrome"?

O ... ¿mi implementación es excesiva? ¿Hay alguna manera más fácil de lograr esto?

¡Muchas gracias!

Respuesta

6

En su foreach, intente esto:

Console.WriteLine(process["Name"]); 
+1

¿Dónde puedo encontrar una especie de lista de propiedades como "Nombre"? Funciona, pero no estoy seguro de dónde lo obtuviste. – Krzysiek

+0

Buena pregunta: tiene que haber una lista en alguna parte. IIRC, originalmente obtuve esto de un ejemplo en CodeProject.com. –

+3

Las propiedades de la clase Win32_Process WMI se enumeran en la documentación de MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372%28v=vs.85%29.aspx – RRUZ

2

Probar Process.GetProcesses("chrome", "computerName");

Definido en System.Diagnostics.Process como

public static Process[] GetProcessesByName(
    string processName, 
    string machineName) 
+0

Probablemente sea una pregunta para principiantes, pero ¿cómo especifico el nombre de la computadora de una máquina remota? Es decir, ¿dónde especificar IP, nombre de usuario, contraseña ...? – Krzysiek

+0

¿no sabe el nombre de la máquina a la que desea conectarse? Necesitarás saber el nombre y/o la dirección IP. También deberá poder iniciar sesión como administrador desde la computadora de monitoreo a la computadora monitoreada. –

+1

No puedo decir ("chrome", "ipnumber") .. ¿dónde proporciono el nombre de usuario/contraseña? – Krzysiek

3

Puede filtrar el nombre del proceso a seguir en la sentencia WQL, para que pueda escribir algo como esto

SelectQuery query = new SelectQuery("select * from Win32_Process Where Name='Chrome.exe'"); 

Prueba esto muestra de aplicación

using System; 
using System.Collections.Generic; 
using System.Management; 
using System.Text; 

namespace GetWMI_Info 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      try 
      { 
       string ComputerName = "localhost"; 
       ManagementScope Scope;     

       if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase)) 
       { 
        ConnectionOptions Conn = new ConnectionOptions(); 
        Conn.Username = ""; 
        Conn.Password = ""; 
        Conn.Authority = "ntlmdomain:DOMAIN"; 
        Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn); 
       } 
       else 
        Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null); 

       Scope.Connect(); 
       ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_Process Where Name='Chrome.exe'"); 
       ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query); 


       foreach (ManagementObject WmiObject in Searcher.Get()) 
       { 
        //for each instance found, do something 
        Console.WriteLine("{0,-35} {1,-40}","Name",WmiObject["Name"]); 

       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace)); 
      } 
      Console.WriteLine("Press Enter to exit"); 
      Console.Read(); 
     } 
    } 
} 
Cuestiones relacionadas