2011-11-29 11 views
6

क्या यह उपयोगकर्ता के लिए पासवर्ड की आवश्यकता के बिना किसी अन्य उपयोगकर्ता का प्रतिरूपण करने के लिए स्थानीय सिस्टम या स्थानीय सेवा के रूप में चल रहे सी # विंडोज सेवा के लिए संभव है?क्या विंडोज सेवा के लिए पासवर्ड के बिना उपयोगकर्ता का प्रतिरूपण करना संभव है?

यह कैसे किया जाएगा?

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

+0

मुझे संदेह है कि यदि आप उपयोगकर्ता को प्रतिरूपित करने के बाद सेवा करना चाहते हैं तो आपको बेहतर भाग्य मिलेगा। AFAIK, जो आप पूछ रहे हैं वह क्रेडेंशियल्स को छेड़छाड़ किए बिना संभव नहीं है (जिसका अर्थ है कि उपयोगकर्ता किसी बिंदु पर पासवर्ड दर्ज कर रहा है) –

+0

@ क्रिसशैन, मैंने आपके द्वारा सुझाए गए प्रश्न को अपडेट किया है। – Eric

+0

इस प्रश्न के उत्तर देखें: http://stackoverflow.com/questions/559719/windows-impersonation-from-c-sharp –

उत्तर

7

सकता है मान लिया जाये कि आप केवल प्रतिरूपण शुरू की जरूरत है, जबकि प्रासंगिक उपयोगकर्ता लॉग ऑन है, तो आप:

  1. EnumProcesses का प्रयोग करके प्रासंगिक उपयोगकर्ता सत्र (जैसे http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx) [WinAPI]
  2. OpenProcessToken() प्रासंगिक उपयोगकर्ता प्रक्रिया पर [WinAPI]
  3. DuplicateToken() के साथ प्रतिरूपण विशेषाधिकार [WinAPI]
  4. एक नया WindowsIdentity() DuplicateToken
  5. काल का परिणाम बनाएं l। चरण 4

एक बार टोकन को डुप्लिकेट करने के बाद, इससे कोई फर्क नहीं पड़ता कि उपयोगकर्ता लॉग इन करता है - आपकी सेवा में प्रतिरूपण बनी हुई है।

स्पष्ट रूप से एपीआई अनियंत्रित ZwCreateToken winapi फ़ंक्शन इसे प्राप्त कर सकता है हालांकि, लेकिन मैंने कभी इसका उपयोग नहीं किया है और भविष्य में किसी भी समय तोड़ सकता है।

+0

# 1 के लिए, 'Process.GetProcesses() ' –

+0

का भी उपयोग कर सकते हैं वास्तव में S4U (उपयोगकर्ता के लिए सेवा) का उपयोग कर एक प्रकार की तकनीक है: https://blogs.msdn.microsoft.com/winsdk/2015/08/28/लॉगऑन-ए-ए-यूजर-बिना-पासवर्ड/ https://msdn.microsoft.com/en-us/library/windows/desktop/aa378128(v=vs.85).aspx –

-1

Topshelf विंडो सेवा API/टूल इसका समर्थन करता है और ओपन सोर्स है। [अपडेट] मुझे याद आया कि कम से कम एक बार कॉन्फ़िगरेशन के लिए आपको पासवर्ड की आवश्यकता है।

+0

यह कहता है कि यह बिना किसी उपयोगकर्ता के उपयोगकर्ता का प्रतिरूपण कर सकता है? – BlackICE

+0

टीएस दस्तावेज में यह कहां इस सुविधा के बारे में बात करता है? मैं उनके कार्यान्वयन को देखने में बहुत रुचि रखूंगा। –

+0

@ डेविड, बेशक आपको पासवर्ड चाहिए। – kenny

0

मेरे सर्वोत्तम ज्ञान के लिए, यह स्पष्ट सुरक्षा कारणों से नहीं किया जा सकता है। LogonUser को कॉल करने के लिए आपके पास पासवर्ड होना चाहिए, फिर WindowsIdentity.Impersonate।

एक अपवाद: यदि आपके पास एक मौजूदा WindowsIdentity रिमोटिंग कॉल के माध्यम से सेवा में पास हो गई है, तो आप सेवा में WindowsIdentity का प्रतिरूपण कर सकते हैं, लेकिन बहुत से ऐप्स इस तरह से काम नहीं करते हैं।

+1

सुरक्षा कारण स्पष्ट नहीं हैं - यदि आप स्थानीय सिस्टम खाते पर चल रहे एक सेवा हैं तो वास्तव में ऐसा कुछ भी नहीं है जिसे आप नहीं कर सकते हैं। – EFraim

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