2008-11-27 11 views
9

मैं "RunOnceEx" का एक व्यस्त संस्करण ढूंढ रहा हूं।विंडोज एक्सपी पर लॉगआउट से पहले अपना प्रोग्राम कैसे चलाएं?

उपयोगकर्ता के खोल (डेस्कटॉप & टास्कबार) से पहले, RunOnceEx कुछ प्रोग्राम चलाता है। रनोनसेक्स पूर्ण होने से पहले लॉगिन प्रगति जारी नहीं रहेगी।

मैं वही करना चाहता हूं लेकिन उपयोगकर्ता लॉगआउट पर करना चाहता हूं। जब वह/वह लॉगआउट करता है, तो सभी चल रहे प्रोग्राम शटडाउन, खोल छोड़कर (डेस्कटॉप & टास्कबार), फिर "" मेरी इच्छा है कि मेरा प्रोग्राम इस पल निष्पादित हो जाएगा "" अंततः लॉगआउट।

मुझे लगता है कि यह संभव है क्योंकि "mobsync.exe" ऐसा कर रहा है। लेकिन मुझे नहीं पता कि यह कहां और कैसे करें।

+0

मैं एक "प्रोग्राम" जिस तरह से करने के लिए पूछ रहा था -, मैं इसे अपने स्थापना या आवेदन पत्र में एक विकल्प के दौरान सेट अप कर सकते हैं। समूह नीति बहुत अच्छी है, लेकिन यह केवल आवश्यकता को ठीक नहीं करती है। माइक्रोसॉफ्ट "mobsync.exe" हार्डकोड कर रहे हैं? –

+1

@VonC ने कहा, बस कुछ रजिस्ट्री entires जोड़ें। वह कितना मुश्किल है! – TFD

+0

आप सी/सी में एक समाधान ++ या नेट के लिए देख रहे हैं? इसके अलावा, mobsync.exe एक माइक्रोसॉफ्ट कार्यक्रम और अधिक से अधिक होने की संभावना सभी जवाब है कि आप से इनकार कर रहे हैं की तरह रजिस्ट्री प्रविष्टियों का उपयोग करता है। –

उत्तर

4

इसे केवल वर्तमान उपयोगकर्ता के लिए चलाने के लिए, आप शटडाउन/लॉगआउट होने पर जानकारी प्राप्त करने के लिए WMI का उपयोग कर सकते हैं।

या तो आप एक छोटे से सी # (या किसी भी अन्य भाषा कि WMI का उपयोग कर सकते हैं) Win32_ComputerShutdownEvent WMI घटना पर सुनने के लिए आवेदन या vbs स्क्रिप्ट लिखने।

एक उदाहरण सी # अनुप्रयोग इस सवाल में यहां पाया जा सकता: Get Log off event from system

3

मुझे

के लिए गूगल पर पहले परिणाम में पाया एक कार्यक्रम आप इसे चलाते हैं और यह लागू करने के लिए समूह नीति का उपयोग करने के लिए एक स्क्रिप्ट बना सकते हैं पर अमल करने के लिए। ,> स्क्रिप्ट (लॉगऑन/लॉगऑफ़)

more information here

+0

जैसा कि मैं स्टैक ओवरफ्लो में पूछ रहा हूं, सुपरसियर नहीं, मैं प्रोग्रामिंग के लिए समाधान ढूंढ रहा हूं –

7

चेतावनी के रूप में कहा here, gpedit.msc आप के लिए एक logoff स्क्रिप्ट कॉन्फ़िगर करने की अनुमति देगा - विंडोज सेटिंग्स> - समूह नीति संपादक में उपयोगकर्ता विन्यास पर नेविगेट सभी उपयोगकर्ता

यदि आपको केवल एक उपयोगकर्ता के लिए उस स्क्रिप्ट की आवश्यकता है, तो आपको इसे सीधे HKCU और HKLM में रजिस्ट्री में घोषित करने की आवश्यकता है।

1

आपको GINA का कार्यान्वयन करने की आवश्यकता है। HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL

यहाँ एक कार्यान्वयन जो अपनी आवश्यकताओं फिट हो सकता है: आप WlxIsLogoffOk समारोह है, जो कहा जाता हो जाता है जब उपयोगकर्ता एक logoff

शुरू की एक बार जब आप उचित जीना बनाने DLL आप इसे यहाँ रजिस्टर कर सकते हैं में अपने कस्टम कमांड चलाने कर सकते हैं (यह एक लॉग ऑफ रजिस्ट्री कुंजी है जहाँ आप अपने आदेश निर्दिष्ट कर सकते हैं प्रदान करता है): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html

+0

क्या मुझे पता चल सकता है कि यह समर्पित क्यों है? –

+0

धन्यवाद! मैं सोच रहा था कि खुद:/ –

+1

+1 क्योंकि यह एक वैध उत्तर है, लेकिन मुझे लगता है कि यह व्यक्ति जो पूरा करना चाहता है उसके लिए एक जीआईएनए डीएल लागू करना शीर्ष पर है। –

1

VonC और TFD पहले से ही उल्लेख किया है, समूह नीति संपादक सिर्फ एक और तरीका रजिस्ट्री में हेरफेर करने के लिए है।

बस gpedit परिवर्तन (- विंडोज सेटिंग्स - userConfig में स्क्रिप्ट पर) के साथ बनाने के आप की तरह और बाद में [HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts] पर रजिस्ट्री में एक बार देख ले पता लगाने के लिए आपको लगता है कि सीधे कर सकते हैं।

मेरे पीसी (एक डोमेन में लटकना) पर उपयोगकर्ता और मशीन के लिए उपफोल्डर के साथ एक छिपी हुई फ़ोल्डर C:\WINDOWS\System32\GroupPolicy है। शटलडाउन और स्टार्टअप नामक अतिरिक्त उपफोल्डर दोनों हैं। शायद आप इनका उपयोग भी कर सकते हैं।

0

यदि आपको किसी एक (या किसी भी) उपयोगकर्ता के लिए कुछ आसान और काम करने की आवश्यकता है तो आप उदाहरण के लिए सी ++ या सी # में एक साधारण एप्लिकेशन बना सकते हैं।

सबसे आसान ट्रे में सी # (फॉर्म में ट्रे घटक जोड़कर) में सबसे आसान है और फॉर्मक्लोसिंग ईवेंट के लिए रजिस्टर और ईवेंट हैंडलर है।वह ऐसा दिखाई चाहते हैं:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason != CloseReason.UserClosing) 
     { 
      // It's not the user closing the application, 
      // Let's do whatever you want here, for example starting a process 
      Process notePad = new Process(); 

      notePad.StartInfo.FileName = "notepad.exe"; 
      notePad.StartInfo.Arguments = "ProcessStart.cs"; 

      notePad.Start(); 
     } 
    } 

तो आपके आवेदन विंडोज के साथ या उपयोगकर्ता के साथ शुरू कर दिया जाएगा। यह (स्मृति का एक छोटा सा प्रयोग करके) इंतजार करेंगे और कुछ करना होगा जब सिस्टम बंद हो जाता है, या उपयोगकर्ता बंद, आदि लोग इन ("CloseReason" ऊपर की जाँच करके)।

3

आप एक चल रहे प्रोग्राम ऑफ पर कोड निष्पादित करने के लिए चाहते हैं, तो आप WM_QUERYENDSESSION संदेश हुक और ENDSESSION_LOGOFF (0x80000000) के एक lParam मूल्य के लिए दिखना चाहिए। अर्थात अपनी प्रक्रिया अपने कोड भी चलाने के लिए अनुमति दी है पहले मारा जा सकता है -

यह है क्योंकि अन्य लोगों से संकेत मिलता है एक "बंद मजबूर" इस ​​lParam मूल्य के लिए परीक्षण करने के लिए महत्वपूर्ण है। वास्तव में, सबसे बंद/सत्र के अंत में संदेश केवल आप अंतिम क्षणों में सफाई कोड को चलाने के लिए एक अवसर प्रदान करना चाहता है और कहा कि लंबे समय से चल कार्यों के साथ करने के लिए प्रतिक्रिया करने के लिए सुरक्षित नहीं हैं कर रहे हैं; लेकिन यह विशेष संयोजन ठीक होना चाहिए।

नोट: मैं वास्तव में WM_QUERYENDSESSION संदेश के प्रत्युत्तर में एक अलग प्रक्रिया भागने की कोशिश की कभी नहीं किया है। यह संभव है कि विंडो प्रबंधक इसे अस्वीकार कर देगा, जैसे कि शटडाउन के दौरान होता है। इसे आज़माएं और देखें, मुझे लगता है।

यदि आप .NET वातावरण में हैं (आपने निर्दिष्ट नहीं किया है), तो Microsoft.Win32.SystemEvents.SessionEnding ईवेंट में ईवेंट हैंडलर जोड़ने का एक तेज़ तरीका है।

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