2012-12-26 20 views
10

मैंने एक महीने पहले विंडोज 8 स्थापित किया है और ऐसी समस्याएं हैं जहां एक प्रक्रिया लटकती है, मैं इसे समाप्त/मारने में असमर्थ हूं। न तो टास्क मैनेजर और न ही सीएमडी टास्किल/एफ/पीआईडी ​​#### नौकरी करेगा, इसलिए मुझे लगा कि मैं सी # में अपना खुद का प्रोसेस किलर लिखूंगा और देख सकता हूं कि कौन से मुद्दे आते हैं।हत्या प्रक्रिया (विंडोज़ 8) मुद्दे

एक छोटा ऐप लिखने के बाद मुझे एहसास हुआ कि मैं इतना स्मार्ट नहीं हूं जैसा मैंने सोचा था - मैं अभी भी प्रक्रिया को समाप्त करने में असमर्थ हूं। पहले तो मुझे नाम से प्रक्रिया को खोजने के लिए कर रहा था/पीआईडी:

Process p = Process.GetProcessById(aPid) 
//or 
foreach (Process p in Process.GetProcessesByName(aProcessName) 

..और हो रही थी जब मैं करने की कोशिश की अपवाद "प्रवेश निषेध": कुछ प्रयास ..after

process.Kill(); 

कि बदल गया और मैं अब प्रक्रिया को खोजने में असमर्थ हूं। उदाहरण के लिए। जब मैंने इसे नाम या पीआईडी ​​द्वारा खोजने की कोशिश की तो कुछ भी वापस नहीं किया गया था, जबकि प्रक्रिया अभी भी कार्य प्रबंधक और मेरी स्क्रीन पर बनी हुई थी।

मैं भी प्रक्रिया @MSDN पर पढ़ लिया है और यह कहते हैं, "निषेध पहुँच" यदि प्रक्रिया पहले ही समाप्त कर रहा है या समाप्त नहीं किया जा सका फेंक दिया जा सकता है कि .. :(

सहायता? वहाँ वास्तव में कोई रास्ता नहीं है अंत प्रक्रिया को आगे बढ़ाने के लिए?

+0

पर इसके बारे में एक प्रश्न पूछकर इसका पालन करें, क्या आप पावरहेल स्टॉप-प्रोसेस की कोशिश करते हैं? – tschmit007

उत्तर

11

ठीक है, आप अनिवार्य रूप से उसी समस्या में भाग रहे हैं जो कार्य प्रबंधक को प्रक्रिया को समाप्त करने से रोकता है। दो संभावित कारण हैं। एक पहुंच से इनकार किया गया अपवाद अपवाद है, प्रक्रिया ने एक्सेस को हटा दिया होगा प्रक्रिया के लिए एक हैंडल प्राप्त करने के लिए अन्य प्रक्रियाओं का अधिकार। चूंकि आप विंडोज 8 पर चल रहे हैं, आपके पास .NET 4.5 स्थापित है। जो प्रोसेस क्लास के लिए एक नई विधि प्रदान करता है, आप कॉल कर सकते हैं EnterDebugMode()। यह SeDebugPrivilege को सक्षम बनाता है, अब Kill() काम करने के लिए पर्याप्त हो सकता है।

दूसरा एक बड़ी समस्या है, प्रक्रिया में कर्नेल मोड में एक थ्रेड सक्रिय हो सकता है जो बाहर नहीं जा रहा है। इसका निदान करने का सबसे अच्छा तरीका टास्क मैनेजर, विवरण टैब का उपयोग करके, कॉलम हेडर में से एक पर राइट-क्लिक करें और "कॉलम का चयन करें" चुनें। टिक "हैंडल"। प्रक्रिया के लिए प्रदर्शित मूल्य को देखो। यदि आपको गैर-शून्य मान दिखाई देता है तो प्रक्रिया में एक हैंडल खोला जाने की संभावना है और डिवाइस चालक के लिए I/O अनुरोध करने का इंतजार है। और वह डिवाइस ड्राइवर विंडोज़ के लिए अन्यथा अभ्यस्त है, यह अनुरोध रद्द करने के लिए कह रहा है। परेशानी करने वाले को कम करना इतना आसान नहीं है, आपको इस बारे में और जानना होगा कि आपकी प्रक्रिया किस प्रकार की I/O अनुरोध करती है। Superuser.com