क्रमिक रूप से एलिवेटिंग प्रोसेस विशेषाधिकार?


147

मैं InstallUtil.exe का उपयोग करके एक सेवा स्थापित करने की कोशिश कर रहा हूं, लेकिन इसके माध्यम से आह्वान किया गया है Process.Start। यहाँ कोड है:

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

जहाँ m_strInstallUtilपूरी तरह से योग्य पथ है और "InstallUtil.exe" के लिए है और strExePathमेरी सेवा के लिए पूरी तरह से योग्य पथ / नाम है।

एक उन्नत कमांड प्रॉम्प्ट कार्यों से कमांड लाइन सिंटैक्स चलाना; मेरे ऐप से रन करना (उपरोक्त कोड का उपयोग करना) नहीं करता है। मुझे लगता है कि मैं कुछ प्रक्रिया उन्नयन मुद्दे के साथ काम कर रहा हूं, इसलिए मैं अपनी प्रक्रिया को एक उन्नत स्थिति में कैसे चलाऊंगा? क्या मुझे इसके लिए देखने की जरूरत है ShellExecute?

यह सब विंडोज़ विस्टा पर है। मैं विशेषाधिकार प्राप्त करने के लिए उन्नत VS2008 डिबगर में प्रक्रिया चला रहा हूं।

मैंने भी सेटिंग की कोशिश की startInfo.Verb = "runas";लेकिन यह समस्या हल करने के लिए प्रतीत नहीं हुई।


के बाद मैं startInfo.UseShellExecute = true;इसके अलावा जोड़ा गया है startInfo.Verb = "runas";मेरे लिए ठीक काम किया।
मैट

जवाबों:


172

आप यह संकेत कर सकते हैं कि नई प्रक्रिया को आपके रन-इन ऑब्जेक्ट की वर्ब प्रॉपर्टी को 'रनस' में सेट करके उन्नत अनुमतियों के साथ शुरू किया जाना चाहिए, इस प्रकार है:

startInfo.Verb = "runas";

यह विंडोज को ऐसा व्यवहार करने का कारण बनेगा जैसे कि "एक्सप्लोरर के रूप में रन करें" मेनू कमांड के साथ एक्सप्लोरर से प्रक्रिया शुरू की गई है।

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

संपादित करें: मैं देख रहा हूं कि आपने अपने प्रश्न को यह बताने के लिए संपादित किया है कि "रनस" आपके लिए काम नहीं करता। यह वास्तव में अजीब है, क्योंकि यह (और कई उत्पादन ऐप में मेरे लिए करना चाहिए)। अभिभावक प्रक्रिया को प्रकट करने के लिए उन्नत अधिकारों के साथ चलाने की आवश्यकता है, हालांकि निश्चित रूप से काम करना चाहिए।


9
"रनस" ने मेरे लिए भी काम नहीं किया। यह हो सकता है कि यह केवल यूएसी के साथ काम करता है बंद कर दिया?
डर्क वोल्मार

18
@LukePuplett मैं उन्हें धन्यवाद दूंगा। यह वास्तव में उपयोगकर्ता भूमिकाओं को पूरी तरह से अलग किए बिना रूट-किट इंस्टॉलेशन को कम करने का एक शानदार तरीका है।
कोल्टन

6
@ स्पार्किस, लेकिन देखने का एक और बिंदु भी है। जो लोग अपने ओएस का बचाव करना जानते हैं, वे जानते हैं कि यह यूएसी के बिना कैसे करना है। और डमी उपयोगकर्ता, जो नहीं जानते कि रक्षा क्या है, वे हर बार 'YES' पर क्लिक करते हैं जब वे UAC विंडो देखते हैं। इसके अलावा कुछ भी गलत हैकर्स-वायरस-लेखकों को इसे बाईपास करने के लिए उपयोग करने से नहीं रोक सकता;) इसलिए मैं ल्यूकपलेट =) से सहमत हूं
Jet

24
ऐसा लगता है कि आपको इसे काम करने के लिए सेट startInfo.ShellExecute=trueकरना होगा ... यह भी कि मैं निष्पादन योग्य फ़ाइलों के साथ काम करने के लिए इस पद्धति को प्राप्त करने में सक्षम नहीं हूं जो कि नेटवर्क साझा पर हैं (चलने से पहले उन्हें स्थानीय अस्थायी निर्देशिका में कॉपी करना होगा)। ..
TCC

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

46

यह कोड उपरोक्त सभी को एक साथ रखता है और व्यवस्थापक निजी के साथ वर्तमान wpf एप्लिकेशन को पुनरारंभ करता है:

if (IsAdministrator() == false)
{
    // Restart program and run as admin
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
    startInfo.Verb = "runas";
    System.Diagnostics.Process.Start(startInfo);
    Application.Current.Shutdown();
    return;
}

private static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}


// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)

अद्यतन: एप्लिकेशन प्रकट तरीका पसंद किया जाता है:

दृश्य स्टूडियो में राइट क्लिक प्रोजेक्ट, जोड़ें, नई एप्लिकेशन मैनिफ़ेस्ट फ़ाइल, फ़ाइल को बदलें ताकि आपको आवश्यकता हो।

मूल तरीके से एक समस्या: यदि आप पुनरारंभ कोड app.xaml.cs OnStartup में रखते हैं, तो यह अभी भी मुख्य विंडो को संक्षिप्त रूप से शुरू कर सकता है, भले ही शटडाउन कहा गया था। अगर app.xaml.cs init चलाया नहीं गया था और कुछ दौड़ की स्थिति में ऐसा होगा तो मेरी मुख्य खिड़की को उड़ा दिया।


सुधार के लिए नीचे देखें।
JCCyC

आवश्यकताअनुसूचक मेरे मामले में काम नहीं किया। तो मुझे इसे अपने तरीके से करना था। इससे मेरी समस्या हल हो गई! धन्यवाद। लेकिन मुझे झूठे के लिए सिंगल इंस्टेंस एप्लिकेशन सेट करना पड़ा।
क्रिस

इसने मेरे लिए काम किया। मैंने मूल string[] argsको भी रिस्पॉन्स की प्रक्रिया में पास कर दिया।
डॉटनेटपैडवान

21

लेख के अनुसार क्रिस कोरियो: टीच योर एप्स टू प्ले नीली विद विंडोज विस्टा यूजर अकाउंट कंट्रोल, एमएसडीएन मैगज़ीन, जनवरी , 2007 , केवल ShellExecuteएम्बेडेड प्रकट की जाँच करता है और ज़रूरत पड़ने पर उपयोगकर्ता को उत्थान के लिए संकेत देता है, जबकि CreateProcessअन्य एपीआई नहीं करते हैं। आशा करता हूँ की ये काम करेगा।

यह भी देखें: .chm रूप में एक ही लेख


7
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

यह यूएसी के बिना कर देगा - एक नई प्रक्रिया शुरू करने की कोई आवश्यकता नहीं है। यदि चल रहा उपयोगकर्ता मेरे मामले के लिए व्यवस्थापक समूह का सदस्य है।


3
इस कोड का उपयोग करने पर मुझे एक अनुमति त्रुटि मिलती है: "सुरक्षा इकाई की अनुमति के लिए अनुरोध विफल।" :(
लियोनार्डो

शायद "यदि चलने वाला उपयोगकर्ता व्यवस्थापक का
मेमबर है

1
दिलचस्प है - यह किसी भी विधि पर जा सकता है, न केवल एक एक्शन विधि (मैंने इसे ASPX पृष्ठ में परिभाषित विधि पर भी आज़माया)
सिमोन_विवर

1

आपको राज्य को ऊंचा करने के लिए प्रतिरूपण का उपयोग करना चाहिए।

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

जब आप किया जाता है तब प्रतिरूपण संदर्भ को पूर्ववत् करना न भूलें।


28
आपने कहा नहीं है कि कैसे पहुँच प्राप्त करें। UAC सक्षम होने पर LogonUser उपयोगकर्ता का प्रतिबंधित सुरक्षा संदर्भ प्रदान करेगा।
cwa

यदि आप VSTS का उपयोग कर रहे हैं, तो आप वेब पोर्टल में सेटिंग्स से एक व्यक्तिगत एक्सेस टोकन प्राप्त कर सकते हैं। (उपयोगकर्ता चित्र के आगे सेटिंग आइकन देखें।) MSDocs
Su Llewellyn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.