Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

c# - Kill process on remote machine

I'm trying to kill a process on a remote machine. But I get error. What am I doing wrong and how can I make this work?

My code:

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();
    }

Just to clarify ImpersonateUser, it makes me login to the remote machine with correct user rights. So the problem is not there. When I debug and check the process object I find the correct process ID for notepad in this case. So the connection works fine. But when I try to kill the process I get this error:

System.NotSupportedException: Feature is not supported for remote machines. at System.Diagnostics.Process.EnsureState
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The System.Diagnostics.Process class cannot kill a remote process. You can use the System.Management namespace (be sure to set a reference), to use WMI.

A simple example is below.

var processName = "iexplore.exe";

var connectoptions = new ConnectionOptions();
connectoptions.Username = @"YourDomainNameUserName";
connectoptions.Password = "User Password";

string ipAddress = "192.168.206.53";
ManagementScope scope = new ManagementScope(@"" + ipAddress + @"
ootcimv2", 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();

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...