2012-06-01 36 views
7

Ho tre PC remoti a cui collego in remoto. Sto provando a scrivere una semplice applicazione Windows che visualizzerebbe in una singola finestra se un particolare processo è in esecuzione su una delle macchine, ad es.È un processo in esecuzione su una macchina remota?

Server1: Chrome non correre

Server2: Chrome è in esecuzione

Server3: Chrome è in esecuzione

ho usato WMI e C#. Finora ho ottenuto questo molto:

  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!! :'(      
       } 
      } 

Penso che sia tutto impostato correttamente, ma se io MessageBox.Show (process.ToString()) all'interno del ciclo foreach, ho un sacco di messaggi caselle con il testo seguente:

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

Sono tipo bloccato. C'è un modo in cui posso "tradurre" XXX in un nome di processo? Oppure, come è possibile ottenere i nomi dei processi in modo da poter utilizzare un'istruzione if per verificare se si tratta di un processo "chrome"?

Oppure ... la mia implementazione è eccessiva? C'è un modo più semplice per realizzare questo?

Grazie mille!

risposta

6

Nella tua foreach, provate questo:

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

Dove posso trovare una sorta di elenco di proprietà come "Nome"? Funziona, non sono sicuro di dove l'hai preso. – Krzysiek

+0

Buona domanda - ci deve essere una lista da qualche parte. IIRC, ho originariamente ottenuto questo da un esempio su CodeProject.com. –

+3

Le proprietà della classe WMI Win32_Process sono elencate nella documentazione MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372%28v=vs.85%29.aspx – RRUZ

2

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

definito nel System.Diagnostics.Process come

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

Probabilmente sarà una domanda per principianti, ma come posso specificare il nome computer di una macchina remota? Cioè, dove specificare IP, nome utente, password ...? – Krzysiek

+0

non si conosce il nome della macchina a cui si desidera connettersi? Dovrai conoscere il nome e/o l'indirizzo IP. Dovrai anche essere in grado di accedere dal computer di monitoraggio al computer monitorato come amministratore. –

+1

Non posso semplicemente dire ("chrome", "ipnumber") .. dove posso fornire il nome utente/password? – Krzysiek

3

È possibile filtrare il nome del processo per guardare nella frase WQL, in modo da poter scrivere qualcosa del genere

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

Prova questo campione app

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(); 
     } 
    } 
} 
Problemi correlati