Убить процесс на удаленной машине в C # - PullRequest
2 голосов
/ 08 декабря 2008

Это только помогает убить процессы на локальном компьютере. Как убить процессы на удаленных машинах?

Ответы [ 3 ]

10 голосов
/ 08 декабря 2008

Вы можете использовать wmi . Или, если вы не возражаете против использования внешнего исполняемого файла, используйте pskill

3 голосов
/ 19 августа 2014

Мне нравится (похоже на ответ Мубашара):

ManagementScope managementScope = new ManagementScope("\\\\servername\\root\\cimv2");
managementScope.Connect();
ObjectQuery objectQuery = new ObjectQuery("SELECT * FROM Win32_Process Where Name = 'processname'");
ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(managementScope, objectQuery);
ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();
foreach (ManagementObject managementObject in managementObjectCollection)
{
    managementObject.InvokeMethod("Terminate", null);
}
1 голос
/ 26 ноября 2013

Я использую следующий код. psKill - также хороший способ, но иногда вам нужно проверить некоторые другие вещи, например, в моем случае на удаленной машине выполнялось несколько экземпляров одного и того же процесса, но с разными аргументами командной строки, поэтому следующий код работал для меня.

ConnectionOptions connectoptions = new ConnectionOptions();
connectoptions.Username = string.Format(@"carpark\{0}", "domainOrWorkspace\RemoteUsername");
connectoptions.Password = "remoteComputersPasssword";

ManagementScope scope = new ManagementScope(@"\\" + ipAddress + @"\root\cimv2");
scope.Options = connectoptions;

SelectQuery query = new SelectQuery("select * from Win32_Process where name = 'MYPROCESS.EXE'");

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
{
       ManagementObjectCollection collection = searcher.Get();

       if (collection.Count > 0)
       {
           foreach (ManagementObject mo in collection)
           {
                uint processId = (uint)mo["ProcessId"];
                string commandLine = (string) mo["CommandLine"];

                string expectedCommandLine = string.Format("MYPROCESS.EXE {0} {1}", deviceId, deviceType);

                if (commandLine != null && commandLine.ToUpper() == expectedCommandLine.ToUpper())
                {
                     mo.InvokeMethod("Terminate", null);
                     break;
                }
            }
       }
}
...