2014-09-08 15 views
8

Tôi đang cố gắng để giết một quá trình trên một máy từ xa. Nhưng tôi gặp lỗi. Tôi đang làm gì sai và làm cách nào tôi có thể thực hiện công việc này?quá trình giết trên máy tính từ xa

Mã của tôi:

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

Chỉ cần làm rõ ImpersonateUser, nó làm cho tôi đăng nhập vào máy từ xa với quyền sử dụng chính xác. Vì vậy, vấn đề là không có. Khi tôi gỡ lỗi và kiểm tra đối tượng quy trình, tôi tìm thấy ID quá trình chính xác cho notepad trong trường hợp này. Vì vậy, kết nối hoạt động tốt. Nhưng khi tôi cố gắng để giết chết quá trình tôi nhận được lỗi này:

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

Từ câu trả lời trước đó mà tôi đã xóa: Từ tài liệu của Micrsoft về 'Process.Kill': [Bạn đang cố gắng gọi Kill cho quá trình đang chạy trên máy tính từ xa. Phương pháp này chỉ áp dụng cho tiến trình đang chạy trên máy tính cục bộ.] (http://msdn.microsoft.com/en-us/library/system.diagnostics.process.kill%28v=vs.110%29.aspx) – JoelC

+0

Duplicate - http://stackoverflow.com/questions/348112/kill-a-process-on-a-remote-machine-in-c-sharp?rq=1 – vapcguy

Trả lời

16

Lớp System.Diagnostics.Process không thể giết một quá trình từ xa. Bạn có thể sử dụng không gian tên System.Management (đảm bảo đặt tham chiếu), để sử dụng WMI.

Một ví dụ đơn giản dưới đây.

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(); 
+0

"Không thể giải quyết biểu tượng InvokeMethod" – MrProgram

+0

tôi đã cập nhật mật mã. Tôi đã sử dụng 'var' mà tôi không nên có. –

Các vấn đề liên quan