2008-11-06 6 views
41

मैंने एक विंडोज सेवा लिखी है जो मुझे दूरस्थ रूप से चलाने और एप्लिकेशन को रोकने की अनुमति देती है। ये एप्लिकेशन CreateProcess का उपयोग करके चलाए जाते हैं, और यह मेरे लिए काम करता है क्योंकि उनमें से अधिकांश केवल बैकएंड प्रोसेसिंग करते हैं। हाल ही में, मुझे उन अनुप्रयोगों को चलाने की आवश्यकता है जो उपयोगकर्ता में वर्तमान लॉग में जीयूआई प्रस्तुत करते हैं। मैं अपनी सेवा को वर्तमान में सक्रिय डेस्कटॉप का पता लगाने और उस पर जीयूआई चलाने की अनुमति देने के लिए सी ++ में कोड कैसे करूं?विंडोज सेवा एक जीयूआई एप्लिकेशन कैसे निष्पादित कर सकती है?

+0

पर काम कर रहा है आप विंडोज का किस संस्करण को लक्षित कर रहे हैं? विस्टा और 7 विंडोज सेवाओं के साथ जीयूआई घटक नहीं मिल पा रहे हैं। मेरा शोध कुछ साल पहले से है, लेकिन यह छुपा/अक्षम प्रशासक खाता (सत्र 0) से संबंधित है जो सेवाओं में चलता है। उस समय मेरा समाधान सेवा के बीच संवाद करने के लिए एमएसएमक्यू का उपयोग करना था और एक अलग जीयूआई आवेदन। – gooch

उत्तर

49

रोजर Lipscombe का जवाब, WTSEnumerateSessions उपयोग करने का अधिकार डेस्कटॉप को खोजने के लिए है, तो CreateProcessAsUser कि डेस्कटॉप (आप इसे STARTUPINFO संरचना के भाग के रूप डेस्कटॉप के हत्थे पारित) पर आवेदन शुरू करने के लिए सही है।

हालांकि, मैं दृढ़ता से ऐसा करने के खिलाफ अनुशंसा करता हूं। कुछ वातावरण में, जैसे टर्मिनल सर्वर कई सक्रिय उपयोगकर्ताओं के साथ होस्ट करता है, यह निर्धारित करता है कि कौन सा डेस्कटॉप 'सक्रिय' है, यह आसान नहीं है, और यह भी संभव नहीं हो सकता है।

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

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

इसके अलावा, इस शॉर्टकट प्रशासकों द्वारा/विकलांग के रूप में वांछित ले जाया जा सकता है, जो आपके आवेदन की तैनाती बहुत आसान हो जाएगा, क्योंकि यह अन्य Windows ऐप्स द्वारा उपयोग के मानकों से विचलित नहीं करता है ...

+0

लेकिन इसे उपयोगकर्ता प्रमाण-पत्र लेना होगा, है ना? – Prakash

6

WTSENumerate सत्र और CreateProcessAsUser।

0

मुझे लगता है कि जब तक आपके पास केवल एक उपयोगकर्ता लॉग इन होता है, तो यह स्वचालित रूप से उस उपयोगकर्ता के डेस्कटॉप पर प्रदर्शित होगा।

वैसे भी, एक सेवा शुरू करने के दौरान बहुत सावधान रहें।

यदि exe के साथ फ़ोल्डर में लेखन पहुंच प्रतिबंधित नहीं है, तो कोई भी उपयोगकर्ता किसी अन्य प्रोग्राम के साथ उस exe को प्रतिस्थापित कर सकता है, जिसे तब sytem अधिकारों के साथ चलाया जाएगा। उदाहरण के लिए cmd.exe (सभी विंडोज sytems पर उपलब्ध) ले लो। अगली बार जब सेवा आपके exe शुरू करने का प्रयास करती है, तो आपको सिस्टम अधिकारों के साथ एक कमांड खोल मिलती है ...

0

यदि आप अपनी सेवा से जीयूआई लॉन्च करते हैं तो यह वर्तमान में सक्रिय डेस्कटॉप पर दिखाई देगा।

लेकिन केवल तभी जब आप सेवा अनुमतियों को समायोजित करते हैं: आपको इसे interact with the desktop पर जाने की आवश्यकता है।

1

पर Win2K, XP और Win2K3 कंसोल उपयोगकर्ता सत्र 0 में लॉग ऑन है, उसी सत्र में सेवाएं रहते हैं। यदि कोई सेवा इंटरैक्टिव के रूप में कॉन्फ़िगर की गई है, तो यह उपयोगकर्ता के डेस्कटॉप पर यूआई दिखाने में सक्षम होगी।

हालांकि, Vista पर, कोई उपयोगकर्ता सत्र 0 में लॉग ऑन नहीं किया जा सकता है। सेवा से यूआई दिखाकर थोड़ा सा ट्रिकियर होता है। आपको WTSEnumerateSessions API का उपयोग करके सक्रिय सत्रों की गणना करने की आवश्यकता है, कंसोल सत्र ढूंढें और उस उपयोगकर्ता को प्रक्रिया बनाएं। बेशक, आपको ऐसा करने में सक्षम होने के लिए एक टोकन या उपयोगकर्ता प्रमाण-पत्र की भी आवश्यकता है। आप इस प्रक्रिया here के बारे में अधिक जानकारी पढ़ सकते हैं।

+0

यह "आप" किस बारे में बात करते हैं? सत्र 0 में एकमात्र कारण यह है कि जब मैंने लॉग इन किया था तो यह पहला सत्र था ... – SamB

+0

Win2K, XP और Win2K3 पर, केवल एक कंसोल सत्र होता है, और यह हमेशा सत्र 0. में होता है। अन्य सत्र टीएस उपयोगकर्ताओं द्वारा उपयोग किया जाता है। –

5

कई लोगों ने WTSENumerate सत्र और CreateProcessAsUser का सुझाव दिया।मुझे आश्चर्य है कि किसी ने भी WTSGetActiveConsoleSessionId का सुझाव क्यों नहीं दिया, क्योंकि आपने कहा था कि आप केवल एक लॉग इन उपयोगकर्ता को लक्षित करना चाहते हैं।

कई लोगों को निश्चित रूप से CreateProcessAsUser का सुझाव देने का अधिकार है। यदि आप सादे पुराने CreateProcess को जिस तरह से कहते हैं, उसे कॉल करते हैं, तो एप्लिकेशन का जीयूआई उपयोगकर्ता के विशेषाधिकारों की बजाय आपके सेवा के विशेषाधिकारों के साथ चलाएगा।

16

संक्षिप्त उत्तर "आप नहीं करते", एक अन्य उपयोगकर्ता संदर्भ के तहत चल रहे एक जीयूआई प्रोग्राम खोलने के रूप में एक सुरक्षा भेद्यता आमतौर पर Shatter Attack के रूप में जाना जाता है।

इस एमएसडीएन आलेख पर एक नज़र डालें: Interactive Services। यह किसी उपयोगकर्ता के साथ बातचीत करने के लिए सेवा के लिए कुछ विकल्प देता है।

  • प्रदर्शन WTSSendMessage समारोह का उपयोग कर उपयोगकर्ता के सत्र में एक संवाद बॉक्स:

    संक्षेप में आप इन विकल्प हैं।

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

    यदि यह सेवा एक बहुउद्देशीय प्रणाली पर चलती है, तो निम्न कुंजी में एप्लिकेशन जोड़ें ताकि यह प्रत्येक सत्र में चलाया जा सके: HKEY_LOCAL_MACHINE \ सॉफ़्टवेयर \ Microsoft \ Windows \ CurrentVersion \ Run। यदि एप्लिकेशन आईपीसी के लिए नामित पाइप का उपयोग करता है, तो सर्वर प्रत्येक आईडी को सत्र आईडी के आधार पर एक अद्वितीय नाम देकर एकाधिक उपयोगकर्ता प्रक्रियाओं के बीच अंतर कर सकता है।

0

महत्वपूर्ण सेवाएं सीधे विंडोज विस्टा के रूप में उपयोगकर्ता के साथ बातचीत नहीं कर सकती हैं। इसलिए, इंटरएक्टिव सेवा का उपयोग करके शीर्षक वाले अनुभाग में वर्णित तकनीकों का उपयोग नए कोड में नहीं किया जाना चाहिए।

इस से लिया जाता है: http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx

2

समस्याओं सत्र 0, इंटरएक्टिव सेवा, Windows सेवा की अनुमति दें कि सेवा Windows 7 या Windows Vista पर डेस्कटॉप के साथ बातचीत करने के लिए

आप इस लेख http://www.codeproject.com/KB/vista-security/SubvertingVistaUAC.aspx

पढ़ सकते हैं

मैं यहां बताया गया है कि यह विंडोज 7

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

  • कोई संबंधित समस्या नहीं^_^