मैं अपने .NET अनुप्रयोग को व्यवस्थापक के रूप में चलाने के लिए कैसे बाध्य करूं?


875

एक बार जब मेरा प्रोग्राम क्लाइंट मशीन पर स्थापित हो जाता है, तो मैं अपने प्रोग्राम को विंडोज 7 पर एक प्रशासक के रूप में चलाने के लिए कैसे मजबूर करूं ?


3
इसके अलावा बाइनरी वॉरियर ने क्या लिखा है, आप परीक्षण के लिए कुछ कोड लिखना चाह सकते हैं यदि आपके पास व्यवस्थापक विशेषाधिकार हैं .. (यह है कि आप क्या पूछ रहे हैं?)
lexu

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

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

सही तरीका यह है कि आप अपने एप्लिकेशन में एक मैनिफ़ेस्ट फ़ाइल एम्बेड करें।
एल्म्यू

जवाबों:


1144

आप कार्यक्रम में एम्बेडेड प्रकट होने वाले बदलाव को संशोधित करना चाहते हैं। यह विजुअल स्टूडियो 2008 और उच्चतर पर काम करता है: प्रोजेक्ट + नया आइटम जोड़ें, "एप्लिकेशन मैनिफ़ेस्ट फ़ाइल" चुनें। <requestedExecutionLevel>तत्व को इसमें बदलें :

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

कार्यक्रम शुरू करने पर उपयोगकर्ता को UAC संकेत मिलता है । बुद्धिमानी से उपयोग करें; उनका धैर्य जल्दी से बाहर हो सकता है।


33
यदि आप संकलन करने का प्रयास करते समय एक ClickOnce त्रुटि प्राप्त करते हैं, तो यह उत्तर देखें: stackoverflow.com/questions/11023998/…
SSS

17
आपकी परियोजना को ऐप मैनिफ़ेस्ट का उपयोग करने के लिए भी सेट किया जाना है - प्रोजेक्ट प्रॉपर्टीज़ में, "एप्लिकेशन" टैब की जांच करें और सुनिश्चित करें कि "Manifest:" अंडर 'संसाधन' आपके ऐप के लिए सेट है। मैनिफ़ेस्ट फ़ाइल)
विक्टर चेलारू

7
मुझे प्रॉजेक्ट को फिर से लोड करना पड़ा, इससे पहले कि वीएस मुझे एडमिन मोड में फिर से शुरू करने के लिए प्रेरित करे।
जॉन

3
@ एलेजैंड्रो - हां, यूएसी को निष्क्रिय किया जा सकता है, लेकिन जब ऐसा होता है, तो एप्लिकेशन स्वचालित रूप से व्यवस्थापक के रूप में चलेगा (यह मानते हुए कि आपके उपयोगकर्ता के पास व्यवस्थापक विशेषाधिकार हैं), क्योंकि यूएसी को अक्षम करने का मतलब है कि उपयोगकर्ता को सबसे अधिक विशेषाधिकार प्राप्त होने पर चलने की अनुमति है। यह शिकायत करने जैसा है कि यदि आप दरवाजे पर फैंसी लॉक स्थापित करते हैं, तो यह काम नहीं करेगा यदि दरवाजा हटा दिया जाता है।
एरिक फनकेनबसच

4
@ErikFunkenbusch यह "व्यवस्थापक के रूप में स्वचालित रूप से नहीं चलेगा", यह उपयोगकर्ता की सामान्य अनुमतियों के तहत चलेगा (यदि उपयोगकर्ता मानक है तो उपयोगकर्ता व्यवस्थापक या मानक है)। उस विशेष मामले पर भरोसा करते हुए, भले ही वह डिफ़ॉल्ट हो, क्या अच्छा कार्यक्रम प्लेग की तरह से बचना होगा। आपकी सादृश्यता के बाद, फैंसी लॉक अच्छा है और सभी, लेकिन ठीक से डिज़ाइन किए गए सॉफ़्टवेयर को इस मामले का अनुमान लगाना चाहिए कि पूरा दरवाजा हटा दिया गया है, भले ही यह एक दुर्लभ घटना हो।
एलेजांद्रो

154

requestedExecutionLevelअपने प्रकट करने के लिए एक तत्व जोड़ना केवल आधी लड़ाई है; आपको याद रखना होगा कि UAC को बंद किया जा सकता है। यदि यह है, तो आपको पुराने स्कूल के तरीके की जांच करनी होगी और यदि उपयोगकर्ता प्रशासक नहीं है
( IsInRole(WindowsBuiltInRole.Administrator)अपने थ्रेड पर कॉल करें CurrentPrincipal) तो एक त्रुटि संवाद करना होगा ।


22
तुम भी इस्तेमाल कर सकते हैं <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> और साथ ही
मार्क Kram

18
@MarkKram: उच्चतम लाभ के साथ क्या करना है? यह सवाल प्रशासन को मजबूर करने के बारे में है, उच्चतमअनुरोधी आवश्यकता से कम प्रतिबंधात्मक है। एडिटिवेटर और गैर-व्यवस्थापक उपयोगकर्ता को ऐप को बिना यूएसी प्रॉम्प्ट के बिना ऊंचा शुरू करने देगा, केवल प्रवेश के लिए प्रेरित किया जाएगा ...
एंडर्स

3
यहाँ एक MSDN उदाहरण हैIsInRole , एंडर्स के बारे में बात करता है।
उवे कीम

मुझे अब सटीक विवरण याद नहीं है लेकिन मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप विकलांगों से क्या मतलब रखते हैं। "UAC स्लाइडर" को नीचे रखना सभी तरह से UAC को अक्षम करने (Vista को छोड़कर) के समान नहीं है। यदि UAC पूरी तरह से अक्षम है तो संपूर्ण अखंडता स्तर तंत्र अक्षम है और 2000 / XP से केवल क्लासिक runas.exe सुविधा उपलब्ध है। व्यवस्थापक भूमिका की जाँच runas.exe मामले को संभालती है।
एंडर्स

1
मैंने Server 2008 R2 पर EnableLUA को 0 पर सेट किया है और अपने आप को व्यवस्थापकों के समूह से निकाल दिया है, रिबूट किया गया है, और अब एक exe जो स्तर = "आवश्यकता को निर्दिष्ट करता है" बिना किसी संकेत के चलता है
Tal Aloni

86

विस्तृत चरण निम्नानुसार हैं।

  1. समाधान के लिए एप्लिकेशन मैनिफ़ेस्ट फ़ाइल जोड़ें
  2. एप्लिकेशन सेटिंग को "app.manifest" में बदलें
  3. आवश्यकता के लिए "RequestExecutionLevel" का टैग अपडेट करें।

समाधान में फ़ाइल जोड़ना

एप्लिकेशन मेनिफेस्ट फ़ाइल का चयन करें

मेनिफेस्ट विकल्प चुनें

मैनिफ़ेस्ट फ़ाइल अपडेट करें

ध्यान दें कि इस कोड का उपयोग करके आपको क्लिकऑन की सुरक्षा सेटिंग्स को बंद करने की आवश्यकता है, ऐसा करने के लिए, गुणों के अंदर जाएं -> सुरक्षा -> क्लिकऑन सुरक्षा


New Item...मेरी इंस्टॉलर सेवा परियोजना पर कोई विकल्प नहीं है। मैं ऐप मैनिफ़ेस्ट जोड़ने के बारे में कैसे जाऊँगा? मैं इसे अपने मुख्य प्रोजेक्ट में जोड़ सकता हूं लेकिन यह इंस्टॉलर नहीं है।
हैकलैश

61

मैंने इसे मैन्युअल रूप से करने के लिए कुछ कोड लागू किया है:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}

45
यह केवल तभी पता लगाता है यदि संदर्भ व्यवस्थापक के रूप में चल रहा है, यह ओपी के अनुरोध के अनुसार व्यवस्थापक के रूप में चलाने के लिए आवेदन को फोर्क नहीं करता है
मैट विलको

5
मुझे नहीं लगता कि किसी एप्लिकेशन को अपने स्वयं के परमिट को बढ़ाने के लिए मजबूर करने के लिए कोई प्रोग्रामेटिक तरीका है। अगर वहाँ थे, तो काफी सुरक्षा जोखिम होगा, नहीं?
मार्क रिचमैन

6
हालांकि आपका समाधान अच्छा है लेकिन सवाल अलग था। ;)
यश

इस पद्धति का एक परिष्कृत संस्करण देखें यहां stackoverflow.com/a/50186997 (व्यक्तिपरक)
हकन Fıstık

इस सवाल का जवाब नहीं है!
एल्म्यू

43

आप EXE फ़ाइल में एक मैनिफ़ेस्ट फ़ाइल को एम्बेड कर सकते हैं, जिससे विंडोज (7 या उच्चतर) हमेशा प्रोग्राम को व्यवस्थापक के रूप में चलाएगा।

आप चरण 6 में अधिक विवरण पा सकते हैं : एक एप्लिकेशन मेनिफेस्ट (यूएसी) और एमएसएमडीएन बनाएं और एम्बेड करें


19

विजुअल स्टूडियो 2008 पर काम करते समय, राइट क्लिक करें Project -> Add New Itemऔर फिर चुना गया Application Manifest File

मैनिफ़ेस्ट फ़ाइल में, आपको टैग मिलेगा requestedExecutionLevel, और आप तीन मानों का स्तर निर्धारित कर सकते हैं:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

या

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

या

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

व्यवस्थापक के रूप में चलाने के लिए अपने आवेदन को निर्धारित करने के लिए, आपको मध्य को चुनना होगा।


यह काम। हालाँकि, इसने CMD एप्लिकेशन (बैकग्राउंड में कुछ exe चलाने के लिए c # cmd ऐप का उपयोग करते हुए) एक खाली cmd विंडो दिखाई।
WM

13

के अनुसार

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

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

  • अगला, राइट क्लिक प्रोजेक्ट
  • नए सामान को जोड़ो
  • अंतिम, एप्लिकेशन मैनिफ़ेस्ट फ़ाइल ढूंढें और क्लिक करें

12

दृश्य स्टूडियो 2010 में अपने प्रोजेक्ट का नाम राइट क्लिक करें। हिट "विंडोज सेटिंग्स देखें", यह उत्पन्न करता है और "app.manifest" नामक एक फ़ाइल खोलता है। इस फ़ाइल के भीतर "asInvoker" को "आवश्यकताअनुकूलक" के साथ बदलें जैसा कि फ़ाइल के भीतर टिप्पणी अनुभागों में बताया गया है।


6
यह उत्तर VB.NET :-) के बारे में है, न कि वीएस 2010 सामान्य रूप से। "नया आइटम जोड़ें" उत्तर C # के बारे में हैं। C ++ में आप इसे प्रोजेक्ट सेटिंग्स में कर सकते हैं।
15

12

ऐसा करने का एक अन्य तरीका, केवल कोड में, यह पता लगाना है कि क्या प्रक्रिया @NG द्वारा उत्तर की तरह व्यवस्थापक के रूप में चल रही है। । और फिर एप्लिकेशन को फिर से खोलें और वर्तमान को बंद करें।

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

नीचे दिए गए कोड में नोट NeedsToRunAsAdminएक विधि है जो पता लगाती है कि क्या मौजूदा परिस्थितियों में व्यवस्थापक विशेषाधिकार की आवश्यकता है। यदि यह रिटर्न देता है falseतो कोड खुद को ऊंचा नहीं करेगा। यह दूसरों पर इस दृष्टिकोण का एक प्रमुख लाभ है।

हालांकि इस कोड में ऊपर बताए गए फायदे हैं, लेकिन इसे खुद को एक नई प्रक्रिया के रूप में फिर से लॉन्च करने की आवश्यकता है जो हमेशा वह नहीं है जो आप चाहते हैं।

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

1
कोड-केवल दृष्टिकोण के लिए +1। ध्यान दें कि आपको runasएक गैर-व्यवस्थापक उपयोगकर्ता से व्यवस्थापक के रूप में कुछ भी लॉन्च करने का मौका देने के लिए UAC सक्षम होना चाहिए , अन्यथा यह वर्तमान उपयोगकर्ता अनुमतियों (विंडोज़ 7 64 बिट पर जाँच) के साथ चुपचाप खुल जाएगा। जहाँ तक मैं केवल वही चीज़ बता सकता हूँ जो आप यूएसी विकलांगों के साथ कर सकते हैं और जो अधिकार सुरक्षित है वह एक उचित क्षण में निष्पादन को रोकना है।
15

9

आप क्लिकऑन सिक्योरिटी सेटिंग्स का उपयोग कर मैनिफ़ेस्ट बना सकते हैं, और फिर उसे अक्षम कर सकते हैं:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

आपके द्वारा इसे क्लिक करने के बाद, प्रोजेक्ट के गुण फ़ोल्डर के अंतर्गत एक फ़ाइल बनाई जाएगी, जिसे app कहा जाता है। इसे बनाते ही, आप Enable ClickOnce Security Settingsविकल्प को अनचेक कर सकते हैं

उस फ़ाइल को खोलें और इस लाइन को बदलें:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

सेवा:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

इससे प्रोग्राम को व्यवस्थापक विशेषाधिकारों की आवश्यकता होगी।


7

यह इस उत्तर का एक सरलीकृत संस्करण है , @NG द्वारा ऊपर

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

1
इस सवाल का जवाब नहीं है!
एल्म्यू

@ अपनी टिप्पणी में मूल उत्तर में अपनी टिप्पणी जोड़ने के लिए यह अधिक तर्कसंगत है कि मैंने अभी-अभी रिफलेक्ट किया है, आप खदान में उस उत्तर का लिंक पा सकते हैं।
हकन फिक्याक

-3

अपने निष्पादन योग्य पर क्लिक करें, गुण> संगतता पर जाएं और 'इस प्रोग्राम को व्यवस्थापक के रूप में चलाएं' बॉक्स को चेक करें।

यदि आप इसे सभी उपयोगकर्ताओं के लिए व्यवस्थापक के रूप में चलाना चाहते हैं, तो 'सभी उपयोगकर्ताओं के लिए सेटिंग बदलें' में समान कार्य करें।


4
इस सवाल का जवाब नहीं है। "एक बार जब मेरा प्रोग्राम क्लाइंट मशीन पर इंस्टॉल हो जाता है", तो "मैं कैसे करूँ"।
जो

अस्पष्ट होने के लिए क्षमा करें। एक बार आपका प्रोग्राम इंस्टॉल हो जाने के बाद, इस सेटिंग को अपने निष्पादन योग्य गुणों (आपका मुख्य प्रोग्राम, इंस्टॉलर नहीं) में बदल दें। वह अपने कार्यक्रम को व्यवस्थापक के रूप में चलाने के लिए बाध्य करना चाहता है।
स्लीकजायड

2
मेनिफ़ेस्ट में व्यवस्थापक आवश्यकता सेट करना बेहतर है। मैं तर्क देता हूं कि यह सवाल का जवाब देता है, लेकिन मुश्किल से ही।
ब्राडलीडॉटनेट

3
@ सही होने के लिए, स्वीकृत उत्तर ओपी प्रश्न का उत्तर नहीं देता है क्योंकि आपको आवेदन को फिर से स्थापित करने की आवश्यकता होती है। "एक बार मेरा कार्यक्रम स्थापित हो गया है" के लिए शायद ही कोई समाधान है। यदि कुछ भी इस अस्वीकृत उत्तर को स्वीकार किए गए उत्तर की तुलना में अधिक सही है, तो मुझे समझ नहीं आता कि उस उत्तर में 400+ वोट क्यों हैं।
NickG

दरअसल, यह दोनों सवालों का पूरी तरह से जवाब देता है। एक बार इंस्टॉल होने के बाद मैनिफ़ेस्ट को बदलने का अधिक मौका नहीं है और प्रोग्राम को एक बार चलने पर - कई वातावरणों में - अपनी अनुमतियों को बढ़ाने की कोशिश नहीं करनी चाहिए - यह मैलवेयर कहे जाने का एक अच्छा मार्ग है। अधिकांश कंपनियों में - यह उत्तर सबसे अच्छा है क्योंकि यह उपयोगकर्ता और उनकी अनुमतियों पर जोर डालता है। मैं बहुत सारे कोड लिखता हूं जो उत्पादन में एक बार न तो "देख" सकता हूं और न ही चला सकता हूं। अपने स्वयं के सुरक्षा चिंताओं की तुलना में अधिक चतुर नहीं होने का प्रयास करें।
jinzai
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.