2015-09-17 2 views
5

Я пытаюсь убить процесс на удаленном компьютере, но он не работает, и я не получаю никаких ошибок. Я использую этот код:Как убить процесс на удаленном компьютере с помощью 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); 

Имя компьютера txtMaquina.Text и имя процесса я получаю от выбранного пункта на ListView

Кто-то есть идея, что случилось здесь?

+0

возможно дубликат [Невозможно удаленно прервать процесс с помощью WMI и C#] (http://stackoverflow.com/questions/18993363/unable- to-remote-terminate-a-process-using-wmi-and-c-sharp) – BugFinder

+0

'lstProcessos.SelectedItem.ToString()', вероятно, неверен. Вероятно, он возвращает имя типа .. (aka 'ListViewItem'). Очевидно, это не то, что вы хотите. ListViews могут быть довольно сложными элементами управления (то есть, если это был элемент управления списком, у выбранного элемента, вероятно, было бы свойство «Text» на нем.) –

+0

, если вы привязываете элемент управления , значение обычно находится в свойстве dataItem; который вы будете явно отбрасывать из объекта в строку ..... просто отложите точку отладки и посмотрите на экземпляр 'lstProcessos.SelectedItem' (используя локальные окна/окна просмотра или нависая над самим фрагментом кода .. или используя undeidate console .. –

ответ

2

Я решил свою проблему с помощью soloution этого парня по проекту Код: http://www.codeproject.com/Articles/18146/How-To-Almost-Everything-In-WMI-via-C-Part-Proce

+0

Привет, почему бы не объяснить лучше, какова была ваша конкретная проблема и как вы могли ее решить? –

+0

@JuanRuizdeCastilla Потому что это слишком длинное решение. лучше здесь. – Mathi901

3

и я, не имея какой-либо ошибки

Это потому, что вы на самом деле не проверить ошибки. Вероятно, вы надеетесь на исключение, но это не то, что делает метод Terminate. Он возвращает код ошибки. Вы не можете игнорировать возвращаемое значение ManagementObject.InvokeMethod().

Так приступить к решению этой проблемы, получая, что исключение вы не имеете прямо сейчас:

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

Теперь вы знаете, где начать искать.

+0

он даже не входит в foreach. – Mathi901

+5

Ах, да, очень полезно, чтобы вы опубликовали это в комментарии вместо вашего вопроса. Битва между необходимостью исправить ваш ListView или установить обработчик события или использование MessageBox.Show («Процесс больше не работает»). –

2

Ваша проблема связана с параметрами:

  • txtMaquina.Text: должно быть имя машины.
  • lstProcessos.SelectedItem.ToString(): должно быть имя ехе как Taskmgr.exe

Я запустить свой код на моем компьютере, и я прекрасно работает с правильными значениями на входе параметры. Как сказал Бретт, вы можете отлаживать его, использовать немедленные окна или запускать фрагмент кода в модульном тестировании.

Смежные вопросы