Проверьте, запущен ли процесс в удаленной системе с использованием C # - PullRequest
9 голосов
/ 15 мая 2009

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

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

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

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

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

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

Ответы [ 6 ]

7 голосов
/ 15 мая 2009

Используйте класс 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();
}
4 голосов
/ 15 мая 2009

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

Сначала я добавил ссылку на 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);
   }
1 голос
/ 15 мая 2009

Внутреннее исключение говорит "Отказано в доступе"?

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

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

0 голосов
/ 19 февраля 2019

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

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

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

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

0 голосов
/ 08 сентября 2016

Уничтожение удаленного процесса
Я обнаружил, что метод Process.
Метод расширения для создания метода: 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);
            });
    }
0 голосов
/ 01 октября 2014

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

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

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

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

...