Проверьте, запущен ли процесс в удаленной системе с помощью C #

Я пытаюсь проверить, запущен ли процесс в удаленной системе. Я использую следующий код:

string procSearc = "notepad";
string remoteSystem = "remoteSystemName";

Process[] proce = System.Diagnostics.Process.GetProcessesByName(procSearch, remoteSystem);

Однако, когда я пытаюсь запустить код, я получаю следующую ошибку: «Не удалось подключиться к удаленному компьютеру».

Я могу запустить pslist с помощью следующей команды: C:> pslist \ remoteSystemName Итак, я знаю, что можно получить нужную мне информацию, но она нужна мне в коде.

Другой вариант - интегрировать pslist в C # и выполнить поиск по списку, чтобы увидеть, есть ли там процесс, но я не нашел информации о том, как это сделать.


person Community    schedule 14.05.2009    source источник


Ответы (6)


Используйте класс System.ServiceProcess.ServiceController для службы. Вы можете использовать Status, чтобы проверить, работает ли он, и Stop() и Start(), чтобы управлять им.

ServiceController sc = new ServiceController();
sc.MachineName = remoteSystem;
sc.ServiceName = procSearc;

if (sc.Status.Equals(ServiceControllerStatus.Running))
{
   sc.Stop();
}
else
{
   sc.Start();
}
person Larry Hipp    schedule 14.05.2009
comment
Это тот же самый код, который я использую для этого. Я столкнулся с сообщением «Доступ запрещен» при попытке подключиться к Windows 2008 Server. - person Hector Sosa Jr; 15.05.2009
comment
Когда я запускаю приведенный выше код, я получаю сообщение: Не удается открыть службу блокнота на компьютере имя_компьютера. Я пытаюсь проверить процесс, и это похоже на проверку службы. Может и то, и другое? - person ; 15.05.2009
comment
Я не думал о том, что это не услуга ... Теперь я не уверен, что дал вам хороший ответ. - person Larry Hipp; 15.05.2009
comment
Я только что проверил свой код с помощью notpad на удаленном компьютере и получил то же сообщение, что и вы. Я запустил ваш код без ошибок. Как вы запускаете свой код? У вас есть доступ к удаленной машине. Я знаю, что являюсь локальным администратором удаленной машины, с которой я тестировал. - person Larry Hipp; 15.05.2009
comment
Ниже то, что я сделал, и это работает. Спасибо за вашу помощь. - person ; 15.05.2009
comment
Это для услуг, а не для процессов. Я также получаю сообщение об ошибке Не удается открыть службу xxxx на компьютере. Ответ ниже должен быть принятым. - person Hylle; 16.05.2018

Вот что я сделал, чтобы это работало:

Сначала я добавил ссылку на System.ServiceProcess и добавил: using System.ServiceProcess;

string remoteSystem = "remoteSystemName";
string procSearch = "notepad";            
Process[] proc = System.Diagnostics.Process.GetProcessesByName(procSearch, remoteSystem);

   if (proc.Length > 0)

   {
        Console.WriteLine("Able to find: " + proc[0]);
   }
   else
   {
        Console.WriteLine("Unable to find: " + procSearch);
   }
person Community    schedule 14.05.2009

Говорит ли внутреннее исключение «Доступ запрещен»?

Аналогичный вопрос может помочь, в нем упоминается необходимость быть в группе пользователей монитора производительности.

GetProcessesByName () и запланированная задача Windows Server 2003

person Crispy    schedule 14.05.2009

Я полагал, что при запуске приложения я получаю окно исключения, потому что исключения не обрабатывались в моем коде ...

Там я увидел причину в stacktrace: доступ запрещен. Причина заключалась в том, что пользователь, запустивший программу, которая вызывала метод .NET для получения списка процессов, не входил в группу «Пользователи монитора производительности» удаленного компьютера.

После этого у меня появилось еще одно исключение, в котором говорилось, что служба мониторинга производительности не запущена на удаленном компьютере. Итак, я запустил соответствующую службу на удаленном компьютере и вуаля заработало!

При этом использовался клиент Windows 7, который пытался получить список процессов Windows 2008 Server.

person Marcell    schedule 01.10.2014

Удаление удаленного процесса
Я обнаружил, что метод Process.Kill () не работает, если задано Process.MachineName, поэтому вот решение для удаленного уничтожения процесса, надеюсь помогает другим.


Метод расширения для создания метода: KillRemoteProcess

public static class ProcessExtensions
{
    public static void KillRemoteProcess(this Process p, string user, string password)
    {
        new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "TaskKill.exe",
                Arguments = string.Format("/pid {0} /s {1} /u {2} /p {3}", p.Id, p.MachineName, user, password),
                WindowStyle = ProcessWindowStyle.Hidden,
                CreateNoWindow = true
            }
        }.Start();
    }
}

И, конечно же, метод поиска процессов и использования KillRemoteProcess

 public static void KillProcessesRemote()
    {
        string targetProcessName = "myProcess"; //Do not put 'process.exe' here just 'process'
        string targetMachine = "remotMachine"; //Target machine
        string username = "myUser"; //Username
        string password = "myPassword"; //Password

        Parallel.ForEach<Process>( //Kill all processes found
            source: System.Diagnostics.Process.GetProcessesByName(targetProcessName, targetMachine),
            body: process => {
                process.KillRemoteProcess(username, password);
            });
    }
person Nick Prozee    schedule 08.09.2016

Вы можете попробовать выдать себя за пользователя, имеющего доступ к удаленному серверу.

https://docs.microsoft.com/en-us/dotnet/api/system.security.principal.windowsimpersonationcontext?redirectedfrom=MSDN&view=netframework-4.7.2

После олицетворения вы больше не столкнетесь с ошибкой. Кроме того, вы должны убедиться, что между доменами существует доверие, иначе олицетворение не сработает.

LogonUser работает только для моего домена

person Xavier    schedule 19.02.2019