2009-02-13 7 views
9

में विस्टा/विंडोज 7 में प्रोग्रामेटिक रूप से एक प्रक्रिया को मार डालें, मैं विस्टा/विंडोज 7 में प्रोग्रामेटिक रूप से एक प्रक्रिया को मारना चाहता हूं (मुझे यकीन नहीं है कि दोनों के बीच यूएसी के कार्यान्वयन में महत्वपूर्ण समस्याएं हैं) ।सी #

अभी, मेरे कोड लगता है:

if(killProcess){ 
     System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName"); 
     // Before starting the new process make sure no other MyProcessName is running. 
     foreach (System.Diagnostics.Process p in process) 
     { 
      p.Kill(); 
     } 

     myProcess = System.Diagnostics.Process.Start(psi); 
    } 

मैं क्योंकि मैं सुनिश्चित करने की आवश्यकता यह करने के लिए है कि उपयोगकर्ता कार्यक्रम दुर्घटनाओं या अचानक बाहर निकल जाता है, जब अनुप्रयोग है इस माध्यमिक प्रक्रिया पुन: प्रारंभ होने अगर पुनरारंभ किया गया, या यदि उपयोगकर्ता इस माध्यमिक प्रक्रिया के लिए पैरामीटर बदलना चाहता है।

कोड XP में ठीक काम करता है, लेकिन 'एक्सेस अस्वीकार' संदेश के साथ विंडोज 7 (और मैं Vista में मानता हूं) में विफल रहता है। सर्वशक्तिमान Google ने मुझे क्या बताया है, मुझे इस समस्या को हल करने के लिए व्यवस्थापक के रूप में अपना हत्या कार्यक्रम चलाने की जरूरत है, लेकिन यह केवल कमजोर सॉस है। अन्य संभावित उत्तर LinkDemand का उपयोग करना है, लेकिन मैं LinkDemand के लिए msdn पृष्ठ को समझ नहीं पा रहा हूं क्योंकि यह प्रक्रियाओं से संबंधित है।

मैं कोड को थ्रेड में ले जा सकता हूं, लेकिन इसमें अन्य कठिनाइयों का पूरा मेजबान है जो मैं वास्तव में खोजना नहीं चाहता हूं।

+0

को मार डालो() अन्वेषक और एक ही ऐप्लिकेशन द्वारा बनाया गया प्रक्रियाओं के लिए मुझे दोनों के लिए ठीक काम कर रहा है:

System.Diagnostics.Process myProc = new System.Diagnostics.Process(); myProc.EnableRaisingEvents=false; myProc.StartInfo.FileName="PATH_TO_EXE"; myProc.Start(); 

बाद में, बस इसके साथ मार डालते हैं। यहां सीमित उपयोगकर्ता में Vista चला रहा है। –

+0

शायद यह सिर्फ विंडोज 7 बग है? क्या आप अपना कोड उत्तर में पोस्ट कर सकते हैं? क्योंकि यह सिर्फ मेरे लिए परेशान है। – mmr

उत्तर

4

आप इसमें सही हैं क्योंकि आपके पास प्रशासनिक प्रावधान नहीं हैं। आप स्थानीय सिस्टम उपयोगकर्ता के तहत एक सेवा स्थापित करके इसे आवश्यकतानुसार एक कस्टम कमांड चलाकर इसे हल कर सकते हैं।

अपने विंडोज़ में एप्लिकेशन फार्म:

private enum SimpleServiceCustomCommands { KillProcess = 128 }; 

ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "SERVICE_NAME"); 
scp.Assert(); 
System.ServiceProcess.ServiceController serviceCon = new System.ServiceProcess.ServiceController("SERVICE_NAME", Environment.MachineName); 
serviceCon.ExecuteCommand((int)SimpleServiceCustomCommands.KillProcess); 

myProcess = System.Diagnostics.Process.Start(psi); 

आपकी सेवा में:

private enum SimpleServiceCustomCommands { KillProcess = 128 }; 

protected override void OnCustomCommand(int command) 
{ 
    switch (command) 
    { 
     case (int)SimpleServiceCustomCommands.KillProcess: 
      if(killProcess) 
      { 
       System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName"); 
       // Before starting the new process make sure no other MyProcessName is running. 
       foreach (System.Diagnostics.Process p in process) 
       { 
        p.Kill(); 
       } 
      } 
      break; 
     default: 
      break; 
    } 
} 
+0

यह एक समाधान है, और शायद सही है। मुझे इसमें देखना होगा; मुझे सेवाओं के साथ कोई अनुभव नहीं है, हालांकि इस प्रक्रिया को ऐप के साथ चलने वाली सेवा के रूप में संदर्भित करना शायद सही है। – mmr

+1

यह एकमात्र तरीका है जिसे मैं इसे पूरा करने के बारे में जानता हूं बिना उपयोगकर्ता को परेशान यूएसी प्रॉम्प्ट प्राप्त करता है। सौभाग्य से, आपको इसे लागू करने के लिए सेवाओं (इसके इंस्टॉलेशन के अलावा) के बारे में कुछ भी नहीं जानना चाहिए। आपके द्वारा जोड़े गए कोड के साथ वीएस टेम्पलेट पूरी तरह से काम करेगा। –

+0

हाँ, यह जाने का रास्ता है। सहायता के लिए धन्यवाद! – mmr

0

मैं साइमन Buchan के सुझाव के लिए कोड जोड़ेंगे। यह समझ में आता है और साथ ही काम करना चाहिए, यह मानते हुए कि आपके विंडोज़ फॉर्म ने पहली बार प्रक्रिया को लॉन्च किया है।

यहां आप कहां प्रक्रिया बनाते हैं। परिवर्तनीय myProc पर ध्यान दें। यही कारण है कि इस पर अपनी संभाल है:

myProc.Kill(); 
+0

लेकिन समस्या यह है कि ऐप अप्रत्याशित रूप से मर चुका है, या उपयोगकर्ता खुद को मारने के साथ आक्रामक था। मैं प्रक्रिया को ऐप के दूसरे उदाहरण द्वारा शुरू की गई प्रक्रिया के अन्य उदाहरणों को हटाने की प्रक्रिया चाहता हूं। – mmr

+1

फिर सेवा दृष्टिकोण शायद आपका सबसे अच्छा (केवल?) समाधान है। –