wmi

2015-09-17 8 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

के संभावित डुप्लिकेट (http://stackoverflow.com/questions/18993363/unable- [दूर से एक प्रक्रिया WMI और सी # का उपयोग कर को समाप्त करने में असमर्थ] टू-रिमोटली-टर्मिनेट-ए-प्रोसेस-यूज-वाईएमआई-एंड-सी-तेज) – BugFinder

+0

'lstProcessos.SelectedItem.ToString() 'शायद गलत है .. शायद यह टाइप नाम लौटा रहा है .. (उर्फ' ListViewItem')। स्पष्ट रूप से वह नहीं है जो आप चाहते हैं .. ListViews काफी जटिल नियंत्रण हो सकते हैं (यानी, यदि यह एक सूची बॉक्स नियंत्रण था, तो चयनित इटैम के पास शायद 'टेक्स्ट' प्रॉपर्टी होगी ..) –

+0

यदि आप नियंत्रण को बाध्य कर रहे हैं , मूल्य आम तौर पर डेटा इटैम संपत्ति में होता है; जिसे आप ऑब्जेक्ट से स्ट्रिंग में स्पष्ट रूप से डालेंगे ..... बस एक डीबग पॉइंट डालें और 'lstProcessos.SelectedItem' इंस्टेंस में देखें (स्थानीय/वॉच विंडोज़ का उपयोग करना .. या कोड स्निपेट पर ही होवर करना .. या उपयोग करना immeidate कंसोल .. –

उत्तर

2

मैं कोड परियोजना पर इस आदमी के soloution का उपयोग कर मेरी समस्या हल: http://www.codeproject.com/Articles/18146/How-To-Almost-Everything-In-WMI-via-C-Part-Proce

+0

नमस्ते, क्यों नहीं समझें कि आपकी विशिष्ट समस्या क्या थी और आप इसे कैसे हल कर सकते हैं? –

+0

@JuanRuizdeCastilla क्योंकि यह एक बहुत लंबा समाधान है। समझा नहीं जा सका यहाँ बेहतर – Mathi901

3

और मैं किसी भी

त्रुटि क्योंकि आप वास्तव में एक त्रुटि के लिए जाँच नहीं है यही कारण है कि होने नहीं कर रहा हूँ। आप शायद अपवाद की उम्मीद कर रहे हैं लेकिन यह नहीं है कि टर्मिनेट विधि क्या करती है। यह एक त्रुटि कोड देता है। आप 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

आह, हाँ, आपके प्रश्न के बजाय टिप्पणी में पोस्ट करने के लिए बहुत उपयोगी है। अपनी सूची दृश्य को ठीक करने या अपने फिक्सिंग के बीच टॉस-अप का बिट इवेंट हैंडलर या संदेशबॉक्स का उपयोग करें। शो ("प्रक्रिया अब चल रही नहीं है") –

2

आपकी समस्या मानकों से आता है:

  • txtMaquina.Text: मशीन नाम होना चाहिए।
  • lstProcessos.SelectedItem.ToString(): exe ​​नाम होना चाहिए Taskmgr.exe

की तरह मैं अपने कंप्यूटर पर अपने कोड चलाने है और मैं इनपुट में सही मूल्यों के साथ ठीक काम करता है मापदंडों। ब्रेट ने कहा, आप इसे डीबग कर सकते हैं, तात्कालिक विंडो का उपयोग कर सकते हैं या यूनिट टेस्ट फ़िक्स्चर में कोड स्निपेट चला सकते हैं।

संबंधित मुद्दे