2015-09-17 16 views
5

Próbuję zabić proces na zdalnym komputerze, ale to nie działa i nie dostaję żadnych błędów. Używam tego kodu:Jak zabić proces na komputerze zdalnym za pomocą 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); 

nazwa komputera jest txtMaquina.Text i nazwę procesu Dostaję od wybranej pozycji na ListView

ktoś ma jakiś pomysł co jest nie tak tutaj?

+0

możliwe duplikat [Nie można zakończyć proces zdalnie przy użyciu WMI i C#] (http://stackoverflow.com/questions/18993363/unable- to-remote-endate-a-process-using-wmi-and-c-sharp) – BugFinder

+0

'lstProcessos.SelectedItem.ToString()' jest prawdopodobnie niepoprawny .. prawdopodobnie zwraca nazwę typu .. (aka 'ListViewItem'). - wyraźnie to nie jest to, czego chcesz. Listy listView mogą być dość skomplikowanymi formantami (to znaczy, jeśli był to kontrolka listbox, selectedItem prawdopodobnie miałby właściwość 'Text' na nim). –

+0

jeśli wiążisz kontrolę , wartość jest ogólnie w własności dataItem; który jawnie rzutujesz z obiektu na ciąg ..... po prostu umieść punkt debugowania i zajrzyj do instancji 'lstProcessos.SelectedItem' (używając okna Lokalne/obserwuj .. lub unosząc się nad samym fragmentem kodu .. lub używając konsola immeidate .. –

Odpowiedz

3

a ja nie mając żadnego błędu

To dlatego, że w rzeczywistości nie sprawdzić błędu. Prawdopodobnie masz nadzieję na wyjątek, ale nie to robi metoda Terminate. Zwraca kod błędu. Nie można zignorować zwracanej wartości metody ManagementObject.InvokeMethod().

więc zacząć rozwiązywanie problemu przez uzyskanie tego wyjątku nie masz teraz:

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

Teraz wiesz, gdzie zacząć szukać.

+0

nie jest nawet wprowadzana na foreach – Mathi901

+5

Ah, tak, bardzo pomocne z twojej strony, aby zamieścić to w komentarzu zamiast na twoim pytaniu .. Trochę podrzucania pomiędzy koniecznością naprawienia twojego ListView lub naprawienia obsługa zdarzeń lub użycie MessageBox.Show ("Proces już nie działa") –

2

Twój problem wynika z parametrów:

  • txtMaquina.Text: musi być nazwa maszyny.
  • lstProcessos.SelectedItem.ToString(): musi być nazwa exe jak Taskmgr.exe

Zabrakło mi swój kod na moim komputerze i działa prawidłowo z odpowiednich wartości na wejściu parametry. Jak powiedział Brett, możesz go zdebugować, użyć natychmiastowego okna lub uruchomić fragment kodu w urządzeniu testowym.