2012-04-13 10 views
7

मैं एक Windows सेवा (जो NT_AUTHORITY\SYSTEM रूप में चलता है) में निम्नलिखित सी # कोड प्रक्रिया निर्माण घटनाओं (WMI और WQL का प्रयोग करके) प्राप्त करने के लिए एक ईवेंट हैंडलर बनाने के लिए उपयोग कर रहा हूँ:प्रक्रिया शुरू घटना WMI का उपयोग करना - नहीं सभी प्रक्रिया का पता लगाया गया जा रहा शुरू होता

string queryString = "SELECT * FROM Win32_ProcessStartTrace"; 
ManagementEventWatcher watcher = new ManagementEventWatcher(new WqlEventQuery(queryString)); 
watcher.EventArrived += new EventArrivedEventHandler(ProcessStartEvent); 
watcher.Start(); 

ProcessStartEvent में:

int processId = int.Parse(e.NewEvent.Properties["ProcessId"].Value.ToString()); 
Process proc = Process.GetProcessById(processId); 

Out("Received process: " + proc.ProcessName); 

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

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

SELECT TargetInstance 
FROM __InstanceCreationEvent 
WITHIN 2 
WHERE TargetInstance ISA 'Win32_Process' 

(this Stack Overflow answer में दिखाई देता है)

वहाँ __InstanceCreationEvent और Win32_ProcessStartTrace का उपयोग कर के बीच किसी भी बड़े अंतर है? क्या यह मेरी समस्याओं का कारण हो सकता है?

वहाँ सभी प्रक्रिया शुरू करने के लिए मैं क्यों प्राप्त नहीं हो रहा घटनाओं के लिए के रूप में एक व्याख्या है? क्या कुछ और स्पष्ट है कि मैं यहाँ गलत कर रहा हूं?

+0

[निष्पादन योग्य प्रारंभ प्रक्रिया के लिए .NET घटनाक्रम] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/848618/net-events-for-process-executable-start) –

+0

@ डिमी मैं कहूंगा कि यह काफी है अलग-अलग सवाल, क्योंकि यह इस बात पर केंद्रित है कि क्यों कुछ घटनाएं गायब हो जाती हैं जबकि अन्य प्रक्रियाओं को पकड़ने के लिए अनुमानित "सही" विधि का उपयोग करते समय भी दूसरों को पकड़ा जाता है। – Xenon

उत्तर

6

दोनों विधियां मान्य हैं लेकिन differents तरीकों से काम करती हैं।

जब आप __InstanceCreationEvent WMI कक्षा का उपयोग करते हैं तो आप intrinsic ईवेंट का उपयोग कर रहे हैं जिसका अर्थ है कि आप मानक WMI डेटा मॉडल में परिवर्तनों की निगरानी कर रहे हैं (यह तालिका में ट्रिगर की तरह काम करता है)।

जब आप Win32_ProcessStartTrace का उपयोग करते हैं तो आप Extrinsic ईवेंट का उपयोग कर रहे हैं जिसका अर्थ है कि आप इस मामले में किसी विशिष्ट कार्य के लिए बनाई गई एक विशेष ईवेंट क्लास का उपयोग कर रहे हैं, प्रक्रिया निर्माण की निगरानी करें।

अब आपके मुद्दे पर, कुछ घटनाओं के "खोए" से बचने का सबसे अच्छा तरीका permanent event consumer बना रहा है।

+0

क्या सी #/.NET का उपयोग कर एक स्थायी घटना उपभोक्ता बनाना संभव है? – Xenon

+0

मानक एमओएफ का उपयोग कर रहा है, इस आलेख को जांचें [एमओएफ का उपयोग कर डब्लूएमआई स्थायी घटना सदस्यता बनाना] (http: //www.codeproject।कॉम/आलेख/28226/निर्माण-डब्ल्यूएमआई-स्थायी-घटना-सदस्यता-उपयोग-एम) – RRUZ

+0

एमओएफ का उपयोग करने में समस्या यह है कि मुझे अपने सी # सेवा ऐप में ईवेंट प्राप्त करने में सक्षम होना चाहिए। – Xenon

3

मुझे पता चला है कि एक प्रक्रिया शुरू होने पर आपको एक घटना मिलती है - उदाहरण के लिए बूस्ट थ्रेड के साथ उस घटना को अलग थ्रेड में पास करें, आप प्रक्रिया आईडी को एक नए थ्रेड में पास कर सकते हैं।

इसका मतलब है कि डब्लूएमआई कॉम एक उलझन में नहीं आता है और खुद को काम करना बंद कर देता है।

कुछ काम कर रहे सी ++ कोड के लिए http://sourceforge.net/p/processhistory/code/HEAD/tree/trunk/PHLogger/COM_WMI_Consumer/

देखते हैं।

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