2015-09-17 16 views
5

Tôi đang cố gắng để giết một quá trình trên một máy tính từ xa, nhưng nó không hoạt động, và tôi không nhận được bất kỳ lỗi nào. Tôi đang sử dụng mã này:Làm thế nào để giết quá trình trên máy tính từ xa với wmi

  ManagementScope scope = new ManagementScope("\\\\" + txtMaquina.Text + "\\root\\cimv2"); 
      scope.Connect(); 
      ObjectQuery query = new ObjectQuery("select * from Win32_process where name = '" + lstProcessos.SelectedItem.ToString() + "'"); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 
      ManagementObjectCollection objectCollection = searcher.Get(); 
      foreach (ManagementObject managementObject in objectCollection) 
       managementObject.InvokeMethod("Terminate", null); 

Tên máy tính là txtMaquina.Text và tên quá trình tôi nhận được từ một sản phẩm được chọn vào một người ListView

có bất cứ ý tưởng gì là sai ở đây?

+0

thể trùng lặp của [Không thể chấm dứt từ xa một quá trình sử dụng WMI và C#] (http://stackoverflow.com/questions/18993363/unable- đến từ xa-chấm dứt-một-quá trình-sử dụng-wmi-và-c-sắc nét) – BugFinder

+0

'lstProcessos.SelectedItem.ToString()' có lẽ là không chính xác .. nó có thể trả về tên Type .. (aka 'ListViewItem'). Rõ ràng đó không phải là những gì bạn muốn .. ListViews có thể được điều khiển khá phức tạp (có nghĩa là, Nếu đây là một điều khiển hộp danh sách, các selectedItem có lẽ sẽ có một tài sản 'Text' trên nó ..) –

+0

nếu bạn đang ràng buộc kiểm soát , giá trị thường nằm trong thuộc tính dataItem; mà bạn sẽ đưa một cách rõ ràng từ đối tượng vào chuỗi ..... chỉ cần đặt một điểm gỡ lỗi xuống và nhìn vào thể hiện 'lstProcessos.SelectedItem' (sử dụng các cửa sổ Local/Watch .. hoặc di chuột qua đoạn mã đó .. hoặc sử dụng các giao diện immeidate .. –

Trả lời

3

và tôi không có bất kỳ lỗi

Đó là bởi vì bạn không thực sự kiểm tra lỗi. Bạn có thể hy vọng cho một ngoại lệ nhưng đó không phải là những gì các phương pháp chấm dứt nào. Nó trả về một mã lỗi. Bạn không thể bỏ qua giá trị trả về của ManagementObject.InvokeMethod().

Vì vậy, bắt đầu giải quyết vấn đề bằng cách nhận rằng ngoại trừ bạn không phải ngay bây giờ:

foreach (ManagementObject managementObject in objectCollection) { 
    int reason = (int)managementObject.InvokeMethod("Terminate", null); 
    switch (reason) { 
     case 0: break; 
     case 2: throw new Exception("Access denied"); break; 
     case 3: throw new Exception("Insufficient privilege"); break; 
     case 8: throw new Exception("Unknown failure"); break; 
     case 9: throw new Exception("Path not found"); break; 
     case 21: throw new Exception("Invalid parameter"); break; 
     default: throw new Exception("Terminate failed with error code " + reason.ToString()); break; 
    } 
} 

Bây giờ bạn biết được nơi để bắt đầu tìm kiếm.

+0

it's thậm chí không nhập foreach – Mathi901

+5

Ah, vâng, rất hữu ích của bạn để đăng bài đó vào một bình luận thay vì câu hỏi của bạn. Bit của một up-up giữa phải sửa chữa ListView của bạn hoặc sửa chữa của bạn xử lý sự kiện hoặc sử dụng MessageBox.Show ("Process no longer running") –

2

Vấn đề của bạn xuất phát từ các thông số:

  • txtMaquina.Text: phải là tên máy.
  • lstProcessos.SelectedItem.ToString(): phải là tên exe như Taskmgr.exe

tôi đã chạy mã của bạn trên máy tính của tôi và tôi hoạt động tốt với các giá trị ngay trong đầu vào thông số. Như Brett đã nói, bạn có thể gỡ lỗi nó, sử dụng các cửa sổ ngay lập tức hoặc chạy đoạn mã trong một đơn vị kiểm tra cố định.

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