2012-02-26 8 views
11

मैं एक अलग उपयोगकर्ता खाते के तहत चल रहे किसी एप्लिकेशन को एक संदेश भेजने की कोशिश कर रहा हूं (एक उपयोगकर्ता जो कंप्यूटर पर किसी भिन्न खाते से लॉग इन होता है, XP पर और बाद में त्वरित उपयोगकर्ता स्विच का उपयोग करके, और एप्लिकेशन को निष्पादित किया गया)।उपयोगकर्ता खाते में द्वितीयक लॉग इन पर चल रहे किसी एप्लिकेशन को संदेश भेजना

पृष्ठभूमि यह है कि मेरा एप्लिकेशन स्वयं अपडेट हो सकता है, लेकिन ऐसा करने के लिए कि सभी चल रहे उदाहरण पहले बंद हो जाएं।
उदाहरणों को बंद करने की आवश्यकता है (केवल प्रक्रिया को मारने की बजाय), इसलिए अद्यतनकर्ता उन्हें एक कस्टम संदेश भेजकर (SendMessage के साथ) करता है। एक संदेश भेजने के लिए मुझे प्रक्रिया की मुख्य विंडो में एक हैंडल की आवश्यकता है।

यह EnumWindows का उपयोग करके ठीक काम करता है - जब तक कि एक ही उपयोगकर्ता खाते के तहत इंस्टेंस चल रहे हों, क्योंकि EnumWindows किसी भिन्न उपयोगकर्ता से संबंधित विंडो सूचीबद्ध नहीं करता है।

इसलिए मैंने एक अलग दृष्टिकोण की कोशिश की। मैंने सिस्टम पर सभी चल रही प्रक्रियाओं को पहली बार सूचीबद्ध करने के लिए CreateToolhelp32Snapshot का उपयोग किया, और फिर CreateToolhelp32Snapshot पर कॉल करने वाले धागे के माध्यम से फिर से शुरू किया। उन थ्रेड आईडी के साथ मैं EnumThreadWindows का उपयोग करके अपनी खिड़कियां सूचीबद्ध कर सकता था।

एक बार फिर यह ठीक काम करता है, लेकिन .. एक बार फिर केवल वर्तमान लॉग इन उपयोगकर्ता के लिए। यहां समस्या यह है कि भले ही CreateToolhelp32Snapshot किसी भिन्न उपयोगकर्ता से संबंधित प्रक्रिया आईडी सूचीबद्ध करता है, लेकिन यह उनके संबंधित थ्रेड आईडी सूचीबद्ध नहीं करता है। इसके लिए कोड थोड़ा लंबा है, लेकिन यदि यह आवश्यक है तो मैं इसे संपादित कर सकता हूं - कृपया इसके लिए एक टिप्पणी छोड़ दें।

तो, मैं अपने आवेदन के मुख्य विंडो हैंडल को एक अलग लॉग इन उपयोगकर्ता खाते पर कैसे चला सकता हूं?

+0

आप इन सुरक्षा प्रतिबंधों से बचने के लिए नामित पाइप की तरह कुछ उपयोग करना पड़ सकता है।आप जो करने की कोशिश कर रहे हैं वह इंटरैक्टिव डेस्कटॉप के साथ संचार करने वाली सत्र 0 सेवाओं के समान है और ऐसे समाधान जो आपके लिए काम करेंगे, आपके लिए काम करेंगे। –

+2

ऐसा लगता है कि मुझे ऑब्जेक्ट करने का मौका दिए बिना उपयोगकर्ता की प्रक्रियाओं को बंद करने का थोड़ा सा मतलब है। अधिकांश अपडेटर्स अगली बार जब ऐप अपडेट करने लगते हैं तब तक प्रतीक्षा करें। डेविड के –

+0

+1। यहां तक ​​कि विंडोज़ आपको अन्य लॉग ऑन उपयोगकर्ताओं के बारे में चेतावनी देता है यदि आप एक अन्य सक्रिय सत्र के दौरान शट डाउन करने का प्रयास करते हैं। सत्र सीमा में प्रक्रियाओं के लिए "बातचीत" करने वाली कुछ भी थोड़ा अजीब और डरावनी है। बस 'उपयोगकर्ता "प्रशासक जैसे कुछ पॉप-अप करने वाले एप्लिकेशन को इस दस्तावेज़ को खोला गया है, क्या आप मुझे उस प्रक्रिया को बंद करना चाहते हैं ताकि आप दस्तावेज़ पर काम कर सकें?' –

उत्तर

10

सत्रों में काम करने के लिए जाने जाने वाले किसी भी चीज़ का उपयोग करें; इस प्रकार की सामग्री अक्सर डेस्कटॉप-सेवा संचार के लिए उपयोग की जाती है, इसलिए यदि आप Google करना चाहते हैं तो उसे देखें। यहां मेरा सुझाव दिया गया है:

  1. ऐसी कोई ईवेंट बनाएं जिसका उपयोग केवल "बंद करने की आवश्यकता" स्थिति को ट्रिगर करने के लिए किया जाएगा। CreateEvent फ़ंक्शन का उपयोग करें सुनिश्चित करें कि आप अपना नाम Global\ से शुरू करें ताकि यह सत्रों में मान्य हो।
  2. एप्लिकेशन स्टार्टअप पर एक थ्रेड बनाएं जो नामित ईवेंट खोलता है (उसी CreateEvent फ़ंक्शन का उपयोग करता है, ERROR_ALREADY_EXISTS गैर-त्रुटि पर ध्यान दें)। उस धागे को बस घटना के लिए इंतजार करना चाहिए। जब ईवेंट ट्रिगर होता है, तो आवश्यक संदेश को अपनी मुख्य विंडो पर भेजें। वह धागा आसानी से और सुरक्षित रूप से ऐसा कर सकता है क्योंकि यह आपकी प्रक्रिया के अंदर चल रहा है। धागा ज्यादातर निष्क्रिय हो जाएगा, घटना को ट्रिगर करने की प्रतीक्षा कर रहा है, इसलिए सीपीयू जुर्माना के बारे में चिंता न करें।
  3. आपके एप्लिकेशन अपडेटर को केवल नामित ईवेंट ट्रिगर करना चाहिए।

यह सिर्फ एक विचार है, मुझे यकीन है कि अन्य भी हैं।

+1

+1 मेरा उत्तर हटा रहा है। पूरी तरह से घटनाओं के बारे में भूल गए जो इस मामले में सबसे अच्छा समाधान है। – kobik

+0

धन्यवाद, इसने मेरी समस्या को पूरी तरह हल किया। यह पहली बार थोड़ा मुश्किल था, क्योंकि मुझे एक सुरक्षा डिस्क्रिप्टर सेट करना था जिससे ईवेंट बनाने पर सभी को पहुंच मिल सके। अन्यथा जब मैंने एक अलग खाते के साथ ईवेंट खोलने का प्रयास किया तो मुझे एक एक्सेस अस्वीकार कर दिया गया। लेकिन अब यह काम करता है, इसलिए धन्यवाद :-) – Chris

+1

कृपया ध्यान दें कि ग्लोबल नेमस्पेस में ऑब्जेक्ट्स बनाने के लिए SeCreateGlobalPrivilege विशेषाधिकार की आवश्यकता होती है जब तक कि आप इसे कंसोल सत्र में नहीं कर रहे हों। केवल प्रशासकों के पास यह विशेषाधिकार है। यह व्यवहार यहां दस्तावेज (अंतिम पैराग्राफ) है: http://msdn.microsoft.com/en-us/library/windows/desktop/aa382954(v=vs.85).aspx – Remko

7

पाइप्स अधिक हैं। एक वैश्विक मैनुअल-रीसेट इवेंट (उदा। "ग्लोबल \ MyAplicationShutdownEvent") जो अनुप्रयोगों को खुद को मारने का कारण बनता है, वह पर्याप्त होना चाहिए।

+0

हालांकि मैं डेविड हेफ़र्नन से सहमत हूं। यह बल्कि कठोर है। – arx

+2

+1 मुझे संदेह है कि आप इससे कहीं अधिक सरल कर सकते हैं। –

0

पर हमला होने के जोखिम पर, आपने zeroMQ पर देखा है, यह इसके लिए एकदम सही उपयोग है और यह बहुत विश्वसनीय और स्थिर है।

एक Delphi wrapper

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