आवश्यकता होने पर ही विशेषाधिकार कैसे बढ़ाएं?


85

यह प्रश्न विंडोज विस्टा पर लागू होता है!

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

मैं कुछ विधि के बारे में सोच रहा हूं जिसके द्वारा मैं किसी घटना पर आवेदन के विशेषाधिकारों को बढ़ा सकता हूं (जैसे कि एक बटन दबाएं)। उदाहरण:

यदि उपयोगकर्ता इस बटन पर क्लिक करता है तो उसे UAC संवाद या सहमति से संकेत दिया जाता है। मैं यह कैसे कर सकता हूँ?

जवाबों:


58

मुझे विश्वास नहीं है कि वर्तमान में चल रही प्रक्रिया को बढ़ाना संभव है। यह विंडोज विस्टा में बनाया गया है कि प्रशासक विशेषाधिकार स्टार्टअप पर एक प्रक्रिया को दिया जाता है, जैसा कि मैं समझता हूं। यदि आप यूएसी का उपयोग करने वाले विभिन्न कार्यक्रमों को देखते हैं, तो आपको यह देखना चाहिए कि वे वास्तव में एक अलग प्रक्रिया का शुभारंभ करते हैं जब प्रत्येक बार एक प्रशासनिक कार्रवाई करने की आवश्यकता होती है (कार्य प्रबंधक एक है, पेंट.नेट एक और है, बाद में एक .NET अनुप्रयोग है। )।

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

विस्टा पर UAC की पूरी चर्चा के लिए, मैं आपको इस विषय पर लेख के माध्यम से इसे देखने की सलाह देता हूं (कोड उदाहरण C ++ में हैं, लेकिन मुझे संदेह है कि आपको C # में अधिकांश चीजें करने के लिए WinAPI और P / Invoke का उपयोग करना होगा। वैसे भी)। उम्मीद है कि अब आप कम से कम लेने के लिए सही दृष्टिकोण देखते हैं, हालांकि यूएसी आज्ञाकारी कार्यक्रम डिजाइन करना तुच्छ से दूर है ...


4
क्या विंडोज 7 के साथ कोई बदलाव है या उत्तर "नहीं, नई प्रक्रिया का उपयोग करें" पकड़ है? धन्यवाद ...
रेडिम वंस

2
विंडोज 7 के साथ कोई बदलाव नहीं, मुझे डर है, क्षमा करें। (जहां तक ​​मुझे पता है, और मैं Win7 पर एक नियमित उपयोगकर्ता / डेवलपर हूं।)
नोल्डोरिन

2
यह ठीक उसी तरह है जैसे कार्य प्रबंधक करता है। जब आप सभी उपयोगकर्ताओं के लिए कार्यों को दिखाने के लिए बटन पर क्लिक करते हैं तो यह वर्तमान कार्य प्रबंधक में मौजूद होता है तब व्यवस्थापक अधिकारों के साथ किसी अन्य कार्य प्रबंधक को आमंत्रित करता है।
नेटली एडम्स

3
@NathanAdams तकनीकी रूप से, यह पहले नए कार्य प्रबंधक को खोलता है। अन्यथा, उद्घाटन क्या कर रहा है? :-)
wizzwizz4

16

जैसा कि वहां कहा गया था :

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

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


जिसमें एक नई प्रक्रिया शामिल है। सही? मैं स्वयं वर्तमान प्रक्रिया के विशेषाधिकारों को बढ़ा रहा था।
हेमंत

प्रक्रिया का उपयोग करने की कोशिश करें।
GetCurrentProcess

27
आप वर्तमान में चल रही प्रक्रिया को बढ़ा नहीं सकते।
जैकब प्रोफिट

1
यह सच नहीं है। आप प्रक्रिया के मालिक को बदल सकते हैं और उपयोगकर्ता को प्रशासनिक अधिकार देने के लिए DACL और ACL मान सेट कर सकते हैं ....
नाइटफोर्स 2

4
@ नाइटफोर्स 2: निश्चित रूप से यह केवल काम करेगा, अगर आपके पास पहले से ही प्रशासनिक अधिकार हैं (यानी आप पहले से ही उन्नत हैं)। अन्यथा AdjustTokenPrivileges आदि बस विफल हो जाएगा, नहीं?
बेन श्वेन

13

निम्न MSDN KB आलेख 981778 वर्णन करता है कि किसी एप्लिकेशन को 'स्वयं-उन्नत' कैसे करें:

http://support.microsoft.com/kb/981778

इसमें विजुअल C ++, विजुअल C #, विजुअल Basic.NET में डाउनलोड करने योग्य नमूने हैं।

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

ऊंचाई को हटाने के लिए, आपको आवेदन छोड़ने की आवश्यकता है।


1
एक बटन के लिए आसान है, लेकिन जब आप एक मेनू आइटम के लिए एक ही चाहते हैं, तो आप एक बहुत जटिल गड़बड़ के लिए हैं।
Nyerguds

3
@ कोड आप यहां कोड पा सकते हैं: https://code.msdn.microsoft.com/windowsapps/CSUACSelfElevation-644673d3
Matthiee

उत्तरदाता की लिंक मृत है और टिप्पणी के लिंक 2608 आइटम लंबी सूची में हैं।
DonBoitnott

आप इसे यहां
मिर्ह


2

शायद किसी को यह सरल उदाहरण काम में आता है:

using System;
using System.Linq;
using System.Reflection;
using System.Diagnostics;
using System.Security.Principal;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    internal static class Program
    {
        private class Form1 : Form
        {
            internal Form1()
            {
                var button = new Button{ Dock = DockStyle.Fill };
                button.Click += (sender, args) => RunAsAdmin();
                Controls.Add(button);

                ElevatedAction();
            }
        }

        [STAThread]
        internal static void Main(string[] arguments)
        {
            if (arguments?.Contains("/run_elevated_action") == true)
            {
                ElevatedAction();
                return;
            }

            Application.Run(new Form1());
        }

        private static void RunAsAdmin()
        {
            var path = Assembly.GetExecutingAssembly().Location;
            using (var process = Process.Start(new ProcessStartInfo(path, "/run_elevated_action")
            {
                Verb = "runas"
            }))
            {
                process?.WaitForExit();
            }
        }

        private static void ElevatedAction()
        {
            MessageBox.Show($@"IsElevated: {IsElevated()}");
        }

        private static bool IsElevated()
        {
            using (var identity = WindowsIdentity.GetCurrent())
            {
                var principal = new WindowsPrincipal(identity);

                return principal.IsInRole(WindowsBuiltInRole.Administrator);
            }
        }

    }
}

1

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन यह किसी और के जवाब में है जो मार्कप के सुझाव पर आता है। Msdn पोस्ट वह वास्तव में संदर्भित कोड के सभी उदाहरणों में अनुप्रयोगों को पुनः आरंभ करता है। कोड नमूने runasअन्य सुझावों में पहले से ही प्रस्तावित क्रिया का उपयोग करते हैं।

मैंने यह सुनिश्चित करने के लिए कोड डाउनलोड किया है, लेकिन यह मूल msdn लेख से है:

4. ऊँचाई मंजूर करने के लिए हाँ पर क्लिक करें। फिर, मूल अनुप्रयोग पुनरारंभ होता है, एक उन्नत व्यवस्थापक के रूप में चल रहा है।
5. एप्लिकेशन को बंद करें।


1
क्या आप प्रश्न में MSDN लिंक जोड़ सकते हैं? मुझे MarcP नामक उपयोगकर्ता नहीं मिल रहा है।
अल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.