Giving application elevated UAC

2019-01-05 05:38发布

I have an application which needs the UAC elevation.

I have the code which lets me give that but the application opens twice.. which is the issue..

so here is the code in Form1:

 public Form1()
    {
        InitializeComponent();

        WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
        bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);           

        if (!hasAdministrativeRight)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.UseShellExecute = true;
            startInfo.WorkingDirectory = Environment.CurrentDirectory;
            startInfo.FileName = Application.ExecutablePath;
            startInfo.Verb = "runas";
            try
            {
                Process p = Process.Start(startInfo);
            }
            catch (System.ComponentModel.Win32Exception ex)
            {
                return;
            }

        }

    }

and this is the code programs.cs

       static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

on debugging i find out that first it executes

Process p = Process.Start(startInfo);

which opens the application UAC elevation dialog and then opens the application

but then it goes to the

Application.Run(new Form1());

in main() and opens the application again.

i dont want it to open the app again...

i am new to this is there anything i am doing wrong and do i need to close the UAC once its open..

thanks

5条回答
\"骚年 ilove
2楼-- · 2019-01-05 05:58

You don't need to meddle with all that to make sure that your application always runs with elevated privileges. You can simply add an application manifest which instructs Windows to run your app elevated, and the UAC prompt will appear without you needing to write a single line of code.

There's a related question with an answer that also describes how to add a manifest here: How can I embed an application manifest into an application using VS2008?

查看更多
Ridiculous、
3楼-- · 2019-01-05 06:01

Elevating your privileges is always going to start a new process. There is no way around that, other than starting with elevated privileges in the first place by setting your application to require administrative privileges. What you can do is end the application right after the elevated process starts, so that you only have one application running.

This scenario is usable for applications that only require certain parts of their function to be elevated - such as an automatically self-updating installer that needs access to Program Files - and not one that requires administrative access all the time.

查看更多
\"骚年 ilove
4楼-- · 2019-01-05 06:04

Move the WindowsPrincipal code from your Form to Program.cs as in the example below. This will prompt the user for UAC authority prior to launching any forms and will only launch the form if UAC authority has been granted.

        static void Main()
        {
            WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);

            if (!hasAdministrativeRight)
            {
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                startInfo.FileName = Application.ExecutablePath;
                startInfo.Verb = "runas";
                try
                {
                    Process p = Process.Start(startInfo);
                    Application.Exit();
                }
                catch (System.ComponentModel.Win32Exception ex)
                {
                    MessageBox.Show("This utility requires elevated priviledges to complete correctly.", "Error: UAC Authorisation Required", MessageBoxButtons.OK);
//                    Debug.Print(ex.Message);
                    return;
                }
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
查看更多
爷、活的狠高调
5楼-- · 2019-01-05 06:12

This is a much better approach when your application is known to require Admin privileges from the start.

查看更多
神经病院院长
6楼-- · 2019-01-05 06:17

There is an example from Microsoft that demonstrates how to check the privilege level of the current process, and how to self-elevate the process by giving explicit consent with the Consent UI.

UAC self-elevation (CSUACSelfElevation)

查看更多
登录 后发表回答