为应用程序提升UAC

时间:2011-06-20 14:35:37

标签: c# asp.net winforms uac

我有一个需要UAC提升的应用程序。

我有代码可以让我提供,但应用程序打开两次..这是问题..

所以这是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;
            }

        }

    }

这是代码programs.cs

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

关于调试我发现它首先执行

  

进程p = Process.Start(startInfo);

打开应用程序UAC提升对话框,然后打开应用程序

然后它转到

  

Application.Run(new Form1());

在main()中

并再次打开应用程序。

我不希望它再次打开应用程序......

我是新来的,有什么我做错了,我需要关闭UAC一旦打开..

感谢

5 个答案:

答案 0 :(得分:28)

您无需干涉所有这些以确保您的应用程序始终以提升的权限运行。您只需add an application manifest指示Windows运行您的应用程序,并且无需编写任何代码即可显示UAC提示。

有一个相关问题的答案也介绍了如何在此处添加清单:How can I embed an application manifest into an application using VS2008?

答案 1 :(得分:3)

提升您的权限总是会启动一个新流程。除了通过将应用程序设置为需要管理权限而首先从提升权限开始之外,没有办法解决这个问题。您可以做的是在提升的进程启动后立即结束应用程序,这样您只能运行一个应用程序。

此方案可用于仅需要提升其功能的某些部分的应用程序 - 例如需要访问Program Files的自动自动更新安装程序 - 而不是始终需要管理访问权限的应用程序。

答案 2 :(得分:3)

当您的应用程序从一开始就需要管理员权限时,

This是一种更好的方法。

答案 3 :(得分:2)

将WindowsPrincipal代码从Form移动到Program.cs,如下例所示。这将在启动任何表单之前提示用户获取UAC权限,并且只有在授予UAC权限的情况下才会启动该表单。

<script>
jQuery(function($) {
$(document).ready(function() {
$( "#regions1" ).select2({        
ajax: {
    url: "/ajax/connect.php",
    dataType: 'json',
    delay: 250,
    data: function (params) {
        return {
            q: params.term // search term
        };
    },
    processResults: function (data) {
        // parse the results into the format expected by Select2.
        // since we are using custom formatting functions we do not need to
        // alter the remote JSON data
        return {
            results: data
        };
    },
    cache: true
},
minimumInputLength: 2
  });
  });
   });
 </script>

答案 4 :(得分:0)

Microsoft提供了一个示例,演示了如何检查当前流程的权限级别,以及如何通过同意UI明确同意来自我提升流程。

UAC self-elevation (CSUACSelfElevation)