2009-07-23 14 views
24

मैं एक प्रक्रिया का उपयोग करने से व्यवस्थापक विशेषाधिकार के साथ एक प्रक्रिया शुरू करने के लिए कैसे पता करने के लिए डे-तरक्की विशेषाधिकार कार्य करें:कैसे आप एक बच्चे की प्रक्रिया

proc.StartInfo.UseShellExecute = true; 
proc.StartInfo.Verb = "runas"; 

जहां proc एक System.Diagnostics.Process है। लेकिन कोई विपरीत कैसे करता है?

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

शीर्षक को बेहतर तरीके से बदलने के लिए स्वतंत्र महसूस करें, मैं एक अच्छे विवरण के साथ नहीं आ सकता था।

+3

से लिया गया कोड वही प्रश्न: http://stackoverflow.com/questions/196949/how-to-run-not-elevated-in-vista-net उत्तर डरावना दिखता है एच। – weiqure

+3

न केवल यह डरावना है, यह सही नहीं है। यूएसी ऊंचाई एक तरीका है और वापस जाने के लिए कोई दस्तावेज नहीं है (explorer.exe में इंजेक्शन करना या टास्क शेड्यूलर का उपयोग करना हैकी और शायद एक अच्छा विचार नहीं है) – Anders

उत्तर

8

हम इस संहिता परियोजना लेख से नमूना का उपयोग कर समाप्त हो गया: High elevation can be bad for your application: How to start a non-elevated process at the end of the installation

यह अब तक काम करने के लिए लगता है, मैं इसे Rundll32.exe में injects इकट्ठा होते हैं, मेरी सी ++/Win32 तो मैं नहीं था काफी कमजोर है वास्तविक कार्यान्वयन में बहुत अधिक नहीं दिखता है, बस इसका उपयोग होता है। पुष्टि की है कि यह Vista और Win7 दोनों में x86 और x64 दोनों में काम करता है (कम से कम हमारे लिए, x86 और x64 को विभिन्न डीएल की आवश्यकता होती है जिसे इंस्टॉल समय पर चेक किया जाता है और उचित उपयोग किया जाता है)।

0

आप जिस खाते को अपनी प्रक्रिया को चलाने के लिए चाहते हैं उसे निर्दिष्ट करने के लिए आप ProcessStartInfo.UserName और ProcessStartInfo.Password का उपयोग कर सकते हैं।

class Program 
{ 
    static void Main(string[] args) 
    { 
     var psi = new ProcessStartInfo(@"c:\windows\system32\whoami.exe"); 
     var password = new SecureString(); 
     password.AppendChar('s'); 
     password.AppendChar('e'); 
     password.AppendChar('c'); 
     password.AppendChar('r'); 
     password.AppendChar('e'); 
     password.AppendChar('t'); 
     psi.Password = password; 
     psi.UserName = "username"; 
     psi.UseShellExecute = false; 
     psi.RedirectStandardOutput = true; 

     var p = new Process(); 
     p.StartInfo = psi; 
     p.Start(); 
     p.WaitForExit(); 

     Console.WriteLine(p.StandardOutput.ReadToEnd()); 
    } 
} 
+12

यदि उपयोगकर्ता नाम/पासवर्ड अज्ञात है तो आप यह कैसे करेंगे? किसी भी अज्ञात मशीन के लिए काम करने की आवश्यकता – Davy8

15

आपके लिए समाधान EXPLORER.exe प्रक्रिया का उपयोग करना है।

विचार विंडोज़ की फाइल एक्सप्लोरर प्रक्रिया explorer.exe (info) का उपयोग करके संयुक्त राष्ट्र-ELEVATED मोड में प्रक्रिया को चलाने का है। आइए कहें कि जिस प्रक्रिया को हम लॉन्च करना चाहते हैं वह $TEMP\MyUnElevatedProcess.exe पर है।

तो, NSIS कोड के लिए, मैं सिर्फ लिखेंगे: (लेकिन किसी भी भाषा में चलाया जा सकता है)

Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

उदाहरण कोड (NSIS संस्थापक का उपयोग कर)

Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

*** http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

+1

यह एक अनूठी प्रक्रिया शुरू करने के लिए मैंने देखा है सबसे अच्छा जवाब है ... दुख की बात है, मैं इसका उपयोग नहीं कर सकता मैं MyUnElevatedProcess.exe के stdout या stderr को कैप्चर नहीं कर सकता। – Kenn

+2

मैं इस समाधान का उपयोग करने की कोशिश कर रहा हूं, लेकिन एप्लिकेशन Temp फ़ोल्डर के बजाय Windir फ़ोल्डर के तहत चलता है .. इसके लिए कोई समाधान? (यानी फ़ाइलें विंडिर फ़ोल्डर के सापेक्ष हैं) – sebas

+1

एक आधुनिक यूआई इंस्टॉलर में फिनिश पेज पर चेक बॉक्स के लिए इसका उपयोग करने के लिए, दो लाइनों का उपयोग करें। पहली पंक्ति: '! MUI_FINISHPAGE_RUN" $ WINDIR \ explorer.exe "और दूसरी पंक्ति परिभाषित करें:' MUI_FINISHPAGE_RUN_PARAMETERS "$ TEMP \ MyUnElevatedProcess.exe" को परिभाषित करें। –