Убить процесс на удаленной машине

Я пытаюсь убить процесс на удаленной машине. Но я получаю ошибку. Что я делаю не так и как мне заставить это работать?

Мой код:

var iu = new ImpersonateUser();
    try
    {
        iu.Impersonate(Domain, _userName, _pass);

        foreach (var process in Process.GetProcessesByName("notepad", "RemoteMachine"))

        {
            string processPath = pathToExe; //Is set as constant (and is correct)
            process.Kill();
            Thread.Sleep(3000);
            Process.Start(processPath);
        }

    }
    catch (Exception ex)
    {
        lblStatus.Text = ex.ToString();
    }
    finally
    {
        iu.Undo();
    }

Чтобы прояснить ImpersonateUser, он заставляет меня входить на удаленный компьютер с правильными правами пользователя. Так что проблема не в этом. Когда я отлаживаю и проверяю объект процесса, в этом случае я нахожу правильный идентификатор процесса для блокнота. Так что связь работает нормально. Но когда я пытаюсь убить процесс, я получаю такую ​​ошибку:

System.NotSupportedException: Feature is not supported for remote machines. at System.Diagnostics.Process.EnsureState

person MrProgram    schedule 08.09.2014    source источник
comment
Из моего предыдущего не-ответа, который я удалил: Из документации Micrsoft на Process.Kill: Вы пытаетесь вызвать Kill для процесса, запущенного на удаленном компьютере. Метод доступен только для процессов, запущенных на локальном компьютере.   -  person JoelC    schedule 24.01.2017
comment
Дубликат - stackoverflow.com/questions/348112/   -  person vapcguy    schedule 25.01.2017


Ответы (1)


Класс System.Diagnostics.Process не может убить удаленный процесс. Вы можете использовать пространство имен System.Management (не забудьте указать ссылку), чтобы использовать WMI.

Ниже приведен простой пример.

var processName = "iexplore.exe";

var connectoptions = new ConnectionOptions();
connectoptions.Username = @"YourDomainName\UserName";
connectoptions.Password = "User Password";

string ipAddress = "192.168.206.53";
ManagementScope scope = new ManagementScope(@"\\" + ipAddress + @"\root\cimv2", connectoptions);

// WMI query
var query = new SelectQuery("select * from Win32_process where name = '" + processName + "'");

using (var searcher = new ManagementObjectSearcher(scope, query))
{
    foreach (ManagementObject process in searcher.Get()) // this is the fixed line
    {
        process.InvokeMethod("Terminate", null);
    }
}
Console.ReadLine();
person David Crowell    schedule 08.09.2014
comment
Могу ли я отменить запущенный поток, то есть System.Threading.Task, с помощью CancellationToken на удаленном компьютере? - person starklord; 13.03.2018
comment
Если вы запустите удаленный процесс оболочки в том же домене приложения (на том же компьютере), вы можете убить его с помощью дескриптора процесса. Остерегайтесь, поскольку проблемы с Thread.Terminate все еще актуальны. - person Latency; 03.08.2018