2009-04-07 21 views
5

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

क्या उपयोगकर्ता टोकन हमेशा ओपनप्रोसेस टोकन नामक प्रक्रिया में मान्य है?

क्या ऐसा कुछ और तरीका हो सकता है? मैं नहीं चाहता कि उपयोगकर्ता को लॉगऑनसर के साथ एप्लिकेशन पर "लॉग ऑन" करना पड़े। वह सिर्फ मूर्खतापूर्ण होगा। मुझे लगता है कि मैं ऐप से सेवा में "explorer.exe" के लिए एक प्रोसेस हैंडल सौंप सकता हूं, जो सेवा उपयोगकर्ता टोकन प्राप्त करने के लिए उपयोग कर सकती है, लेकिन उसे प्रोसेस डप हैंडल एक्सेस की आवश्यकता होगी। मैं उस समाधान के बारे में रोमांचित नहीं हूं, लेकिन शायद यह करने का तरीका है?

उत्तर

2

यहाँ एक नज़र डालें:

+0

धन्यवाद, मैं पहले लेख के साथ जा रहा हूं, ZwCreateToken के साथ एक टोकन बना रहा हूं। संदेश में मुझे आवश्यक सभी चीजों को पैक करने के लिए यह थोड़ा गन्दा है, लेकिन जाहिर है कि दूसरों के लिए काम किया है .. –

+0

पहला आलेख कुछ त्रुटियों में प्रतीत होता है, दूसरा काफी अच्छा लगता है।लेकिन मुझे यकीन नहीं है कि आप ZWCreateToken (एक अनियंत्रित, असमर्थित और पूरी तरह से स्थिर विधि) का उपयोग क्यों करेंगे, जब आप जो चाहते हैं उसे दस्तावेज करने के तरीके हैं। –

+0

क्षमा करें, मेरा मतलब दूसरा था। पहले भी नहीं मिला। मैं कुछ ऐसा कर रहा हूं जैसे http://www.apnilife.com/E-Books_apnilife/Windows%20Programming_apnilife/Windows%20NT%20Undocumented%20APIs/1996%20Ch08_apnilife.pdf। क्या आप CreateToken को रेफर कर रहे हैं? –

3

आप कई मुद्दों पर यहाँ तो मैं उन्हें अलग से संबोधित करने के लिए कोशिश करता हूँ और तुम मुझे सही कर सकते हैं अगर मैं गलत समझा है:

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

  2. क्या उपयोगकर्ता टोकन हमेशा केवल उस प्रक्रिया में मान्य है जिसे OpenProcessToken कहा जाता है? हां, आपके द्वारा प्राप्त टोकन हैंडल प्रक्रिया की हैंडल तालिका में एक सूचकांक है, यह सीधे हस्तांतरणीय नहीं है। आपको डुप्लिकेट हैंडल का उपयोग करने की आवश्यकता होगी जो आप चाहते हैं लेकिन गन्दा हो सकता है।

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

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

+0

1. एक डिजाइन दोष की तरह लग सकता है। बात यह है कि सेवा एप्लिकेशन को अपग्रेड करना चाह सकती है: यह एक ही एप्लीकेशन भी नहीं हो सकता है जिसे लॉन्च किया जाना चाहिए। 2. सहमत, यह है। मैं इसके बजाए एक नया टोकन बनाने की कोशिश करूंगा। 3. 2000 पर काम करना चाहिए, यह उल्लेख करना भूल गया कि ... –

+0

सेवा केवल सेवा को कुछ भेजने के बजाय ओपनप्रोसेस टोकन और डुप्लिकेट टोकनएक्स को क्यों कॉल नहीं करती है? –

+0

क्या उस प्रक्रिया में बनाई गई प्रक्रिया को स्थानीय सिस्टम के रूप में नहीं चलाया जाएगा? अगर मैं ऐसा करता हूं तो मैं बस CreateProcess को कॉल कर सकता हूं और उपयोगकर्ता टोकन से परेशान नहीं हूं। –

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