Процесс запущен на удаленной машине?

У меня есть три удаленных ПК, к которым я удаленно подключаюсь. Я пытаюсь написать простое приложение для Windows, которое будет отображать в одном окне, запущен ли конкретный процесс на любой из машин, например.

Server1: Chrome не работает

Server2: Chrome работает

Server3: Chrome работает

Я использовал WMI и C#. Пока у меня так много:

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

Я думаю, что все настроено правильно, но если я MessageBox.Show(process.ToString()) внутри цикла foreach, я получаю целую кучу окон сообщений со следующим текстом:

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

Я немного застрял. Есть ли способ «перевести» это XXX в имя процесса? Или, как на самом деле получить имена процессов, чтобы я мог использовать оператор if, чтобы проверить, является ли это процессом «chrome»?

Или... моя реализация излишняя? Есть ли более простой способ сделать это?

Большое спасибо!


person Krzysiek    schedule 01.06.2012    source источник


Ответы (3)


В вашем foreach попробуйте следующее:

Console.WriteLine(process["Name"]);
person 500 - Internal Server Error    schedule 01.06.2012
comment
Где я могу найти какой-то список свойств, таких как имя? Это работает, только не знаю, откуда вы это взяли .. - person Krzysiek; 01.06.2012
comment
Хороший вопрос - где-то должен быть список. IIRC, я изначально получил это из примера на CodeProject.com. - person 500 - Internal Server Error; 01.06.2012
comment
Свойства класса WMI Win32_Process перечислены в документации MSDN msdn.microsoft.com/en-us/library/windows/desktop/ - person RRUZ; 01.06.2012
comment
@RRUZ, я был на этом сайте раньше! Я просто никогда не пролистывал вниз :( Спасибо! В закладки! :) - person Krzysiek; 01.06.2012
comment
Также вы можете использовать такой инструмент, как wmi-delphi-code-creator для проверки классов WMI и создания кода. - person RRUZ; 01.06.2012

Вы можете отфильтровать имя процесса для просмотра в предложении WQL, поэтому вы можете написать что-то вроде этого

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

Попробуйте этот пример приложения

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();
        }
    }
}
person RRUZ    schedule 01.06.2012

Попробуйте Process.GetProcesses("chrome", "computerName");

Определено в System.Diagnostics.Process как

public static Process[] GetProcessesByName(
   string processName,
   string machineName)
person agent-j    schedule 01.06.2012
comment
Вероятно, это будет вопрос новичка, но как указать имя компьютера удаленной машины? То есть где указать IP, логин, пароль...? - person Krzysiek; 01.06.2012
comment
вы не знаете имя машины, к которой хотите подключиться? Вам нужно знать имя и/или IP-адрес. Вы также должны иметь возможность войти с компьютера мониторинга на контролируемый компьютер в качестве администратора. - person agent-j; 01.06.2012
comment
Я не могу просто сказать (chrome,ipnumber).. где я могу указать имя пользователя/пароль? - person Krzysiek; 01.06.2012
comment
+1, так как это самый простой код для записи/чтения, особенно если учетная запись, под которой вы его запускаете, уже имеет разрешения. Вам нужно будет олицетворять другую учетную запись перед вызовом этого метода, если текущая не имеет разрешений (или если возникает проблема с одним переходом NTLM для кода на стороне сервера). - person Alexei Levenkov; 01.06.2012