2013-01-08 31 views
6

हम एक सी # .NET विंडोज सेवा विकसित कर रहे हैं।उपयोगकर्ता का प्रतिरूपण

हमारी सेवा प्रणाली खाते के अंतर्गत चल रहा है, और हम USER उपयोगकर्ता में लॉग इन प्रतिरूपित करने के लिए कोशिश कर रहे हैं। प्रतिरूपण ठीक काम करता है, यानी प्रतिरूपण के बाद System.Security.Principal.WindowsIdentity.GetCurrent() पर कॉल करते समय हमें सही उपयोगकर्ता 'USER' मिलता है।

समस्या यह है कि जब हम उपयोगकर्ता प्रोफ़ाइल तक पहुँचने का प्रयास हम अपेक्षित परिणाम नहीं मिलता है। एक उदाहरण रजिस्ट्री CURRENT_USER तक पहुंच रहा है। हमें एक एक्सेस अस्वीकार त्रुटि मिलती है। किसी तीसरे पक्ष के फ़ंक्शन का उपयोग करते समय, जिसे हम मानते हैं कि रजिस्ट्री का उपयोग भाग में किया जाता है, हमें "असली" (प्रतिरूपण से पहले) उपयोगकर्ता के विवरण मिलते हैं। Environment.ExpandEnvironmentVariables("%TEMP%") पर कॉल करते समय भी हमें लॉग-इन उपयोगकर्ता प्रोफ़ाइल की बजाय सिस्टम प्रोफ़ाइल मिलती है।

वहाँ एक रास्ता पूरी तरह से एक अलग प्रयोक्ता का रूप धारण करने के लिए है ?. मुझे पता है कि हम एक विशिष्ट उपयोगकर्ता प्रोफ़ाइल प्राप्त करने के लिए LoadUserProfile का उपयोग कर सकते हैं, लेकिन यह हमारे लिए अच्छा नहीं है, क्योंकि हम वर्तमान उपयोगकर्ता प्रोफ़ाइल का उपयोग करने वाले तृतीय पक्ष डीएल चला रहे हैं।

हमारे प्रतिरूपण कोड this

+1

सबसे पहले, आपको System.IO.Path.GetTempPath() का उपयोग करना चाहिए; और यदि वह अभी भी काम नहीं करता है तो यह आपकी समस्या हो सकती है: http://stackoverflow.com/questions/944483/how-to-get- समकालीन- फ़ोल्डर-for-current-user स्वीकृत उत्तर देखें और यह कैसे काम करता है। – lahsrah

+0

मुझे और अधिक विशिष्ट होने दें। हम किसी तीसरे पक्ष के डीएल को कॉल का उपयोग कर रहे हैं जिसे हम नहीं बदल सकते हैं। इसलिए यदि वे एक विशिष्ट उपयोगकर्ता प्रोफ़ाइल का निष्पादन कर रहे हैं तो हमें उस उपयोगकर्ता प्रोफ़ाइल के साथ प्रक्रिया को चलाना होगा। – user844541

+0

@ user844541 कृपया मेरे लिंक को दोबारा पढ़ें। – lahsrah

उत्तर

2

मैं ध्यान दें कि कोड LoadUserProfile फोन नहीं करता है के आधार पर है, इसलिए उन प्रोफ़ाइल लोड नहीं है।

उस फ़ंक्शन की टिप्पणियों में नोट, HKEY_CURRENT_USER अभी भी प्रतिस्थापित नहीं किया गया है।

I सोचें RegOverridePredefKey पर कॉल करके आप इस समस्या को हल कर सकते हैं (तृतीय पक्ष DLL को कॉल करने से पहले)।

ध्यान दें कि यह सब काम करने के अधिकार में बहुत सारे वूडू शामिल हो सकते हैं - मैं यह सुनिश्चित करने की कोशिश करता हूं कि ओवरराइड तीसरे पक्ष के कॉल से पहले जितनी देर हो सके, और बाद में जल्द से जल्द वापस आ जाए (उम्मीद है यह लाइब्रेरी के लिए एकमात्र कॉल है)।

एक विकल्प के रूप में, मैं गंभीरता से एक अलग तृतीय पक्ष की पेशकश के लिए चारों ओर देखने की कोशिश करता हूं जिसके लिए यह सभी हुप्स के माध्यम से कूदने की आवश्यकता नहीं होती है।

+0

कॉलिंग 'RegOverridePredefKey' इस मामले में मदद नहीं करेगा क्योंकि यह प्रति-प्रक्रिया है और प्रतिरूपण प्रति-थ्रेड है। – Ben

2

आप की खोज की है के रूप में, प्रतिरूपण HKEY_CURRENT_USER या पर्यावरण की स्थापना नहीं होंगे।

इसका कारण यह है प्रतिरूपण टोकन प्रति-धागा है, और HKCU और पर्यावरण प्रति प्रक्रिया कर रहे हैं।

आप उपयोगकर्ता के सामान्य वातावरण का उपयोग करने की जरूरत है, तो आप और प्रतिरूपित उपयोगकर्ता का SID HKEY_USERS\SID का उपयोग करने की आवश्यकता होगी उदा उदाहरण के लिए HKEY_USERS\S-1-5-21-12345678-12345678-12345678-1234। कुंजी लोड होने के लिए LoadUserProfile पर कॉल करें। (यदि यह वर्तमान में लॉग-ऑन उपयोगकर्ता होना चाहिए, तो इसे पहले ही लोड किया जाना चाहिए, इसलिए आपको शायद ऐसा नहीं करना चाहिए, लेकिन यह जांचें और यदि कोई त्रुटि न हो तो)।

आप यह भी काम कर सकते हैं कि उनका सामान्य वातावरण क्या होगा, क्योंकि यह एचकेसीयू के भीतर महत्वपूर्ण "पर्यावरण" के तहत है। आपको केवल सिस्टम वातावरण के साथ गठबंधन करने की आवश्यकता है।

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

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

डीएलएल सिर्फ उपयोगकर्ता के अपने सत्र में सीधे क्यों नहीं चल सकता है? एक सेवा की आवश्यकता क्यों है? क्या आप अपने समाधान को पुन: आर्किटेक्ट कर सकते हैं, इसलिए उपयोगकर्ता-मोड भाग है जो लॉगऑन सत्र में चलता है और तीसरे पक्ष के डीएलएल होस्ट करता है, और यह सेवा के साथ संचार करता है ताकि सेवा केवल वही कार्य करे जो पूरी तरह से आवश्यक हो?

+0

+1 उपयोगकर्ता सत्र में कुछ चलने के सुझाव के लिए। लगभग हर बार मुझे सेवाओं और उपयोगकर्ता खातों के साथ एक ही समस्या मिलती है, यही वह तरीका है। – Basic