2012-06-01 24 views
7

Uzaktan bağladığım üç uzak PC'im var. Belirli bir işlemin, makinelerden herhangi birinde çalışıp çalışmadığını tek bir pencerede görüntüleyen basit bir Windows uygulaması yazmaya çalışıyorum.Uzak bir makinede çalışan bir işlem mi?

Server1: Krom sunucu2

çalışmıyor: Chrome IS

Server3: Krom

Ben WMI ve C# kullanılan

çalışan IS. Şimdiye kadar bu kadar var:

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

Ben her doğru bir şekilde kurulmuş düşünüyorum, ama MessageBox.Show if (process.ToString()) foreach döngüsü içinde ben mesajın bir sürü olsun Aşağıdaki metin kutusu:

Sıkışmış durumdayım. XXX'u bir işlem adına "çevirebileceğim" herhangi bir yol var mı? Ya da, aslında süreçlerin isimlerini nasıl alabilirim, böylece bir "krom" işlemi olup olmadığını kontrol etmek için bir if ifadesini kullanabilirim?

Ya da benim ... uygulamam aşırı mı? Bunu başarmanın daha kolay bir yolu var mı?

Çok teşekkürler!

cevap

6

, şunu deneyin:

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

"Ad" gibi özelliklerin bir listesini nerede bulabilirim? Çalışır, sadece nereden aldığınızdan emin değil .. – Krzysiek

+0

İyi soru - bir yerde bir liste olmalı. IIRC, ben aslında bu CodeProject.com bir örnek aldım. –

+3

Win32_Process WMI sınıfındaki özellikler MSDN belgelerinde listelenmiştir http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372%28v=vs.85%29.aspx – RRUZ

2

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

Sen WQL cümlede izlemek için sürecin adını filtre

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

Muhtemelen yeni kullanıcı sorusu olacak, ancak uzaktaki bir makinenin bilgisayar adını nasıl belirtebilirim? Yani, IP, kullanıcı adı, şifre belirtilecek ...? – Krzysiek

+0

Bağlanmak istediğiniz makinenin adını bilmiyor musunuz? Adı ve/veya IP adresini bilmeniz gerekir. Ayrıca, izleme bilgisayarından izlenen bilgisayara yönetici olarak giriş yapabilmeniz gerekir. –

+1

Sadece "(" chrome "," ipnumber ") diyemem .. kullanıcı adını/parolayı nerede bulabilirim? – Krzysiek

3

olarak System.Diagnostics.Process tanımlıdır ve bu yüzden bu

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

gibi bir şey yazabilirsiniz bu deneyin senin foreach içinde örnek uygulaması

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(); 
     } 
    } 
} 
İlgili konular