2015-09-17 4 views
5

Ich versuche, einen Prozess auf einem Remote-Computer zu töten, aber es funktioniert nicht, und ich bekomme keine Fehler. Ich verwende diesen Code:Wie kill Prozess auf Remote-Computer mit 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); 

Der Computername ist txtMaquina.Text und die Prozessnamen, ich bin eine Idee habe, auf einem ListView

Jemand aus einem ausgewählten Elemente zu bekommen, was hier falsch ist?

+0

möglich Duplikat [Es kann keinen Prozess # mithilfe von WMI und C aus der Ferne beenden] (http://stackoverflow.com/questions/18993363/unable- to-remote-terminate-a-process-using-wmi-und-c-sharp) – BugFinder

+0

'lstProcessos.SelectedItem.ToString()' ist wahrscheinlich inkorrekt .. es gibt wahrscheinlich den Typ name .. (aka 'ListViewItem'). Klarerweise ist das nicht, was Sie wollen .. ListViews können ziemlich komplexe Steuerelemente sein (das heißt, wenn dies ein Listbox-Steuerelement wäre, hätte das selectedItem wahrscheinlich eine 'Text'-Eigenschaft.) –

+0

wenn Sie das Steuerelement binden Der Wert befindet sich in der Regel in der Eigenschaft dataItem. was Sie explizit von Objekt zu String umsetzen werden ..... setzen Sie einfach einen Debug-Punkt und schauen Sie sich die 'lstProcessos.SelectedItem'-Instanz an (mit Local/Watch windows .. oder mit dem Mauszeiger über das Code-Snippet selbst .. oder mit die unvergängliche Konsole .. –

Antwort

3

und ich habe keine Fehler

Das ist, weil Sie eigentlich nicht für einen Fehler überprüfen. Sie hoffen wahrscheinlich auf eine Ausnahme, aber das ist nicht, was die Terminate-Methode tut. Es gibt einen Fehlercode zurück. Sie können den Rückgabewert von ManagementObject.InvokeMethod() nicht ignorieren.

So starten Sie das Problem lösen, indem diese Ausnahme bekommen Sie nicht gerade jetzt:

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

Jetzt wissen Sie, wo zu Beginn der Suche.

+0

es ist noch nicht einmal in die foreach. – Mathi901

+5

Ah, ja, sehr hilfreich von Ihnen, um das in einen Kommentar anstelle Ihrer Frage zu posten.Ein bisschen von einem Toss-up zwischen müssen Ihre ListView reparieren oder reparieren Ereignishandler oder mit MessageBox.Show ("Prozess nicht mehr läuft"). –

2

Ihr Problem kommt von den Parametern:

  • txtMaquina.Text: muss der Maschinenname sein.
  • lstProcessos.SelectedItem.ToString(): muss der exe Namen wie Taskmgr.exe sein

Ich habe den Code auf meinem Computer laufen und ich funktioniert gut mit den richtigen Werten im Eingangs Parameter. Wie Brett sagte, könnten Sie es debuggen, sofortige Fenster verwenden oder das Code-Snippet in einem Unit-Test-Fixture ausführen.

Verwandte Themen