给应用程序提高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()); } 

在debugging我发现它首先执行

进程p = Process.Start(startInfo);

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

但是然后它去了

Application.Run(new Form1());

在main()中再次打开应用程序。

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

我是新来的这是有什么我做错了,我需要closuresUAC一旦打开..

谢谢

您不需要干涉所有这些,以确保您的应用程序始终以提升的权限运行。 您可以简单地添加一个应用程序清单 ,指示Windows运行您的应用程序提升,UAC提示将出现,而不需要编写一行代码。

有一个相关的问题的答案也描述了如何在这里添加一个清单: 我如何将应用程序清单embedded到使用VS2008的应用程序?

提升您的权限总是会开始一个新的过程。 除此之外没有任何办法,除了首先通过将应用程序设置为需要pipe理权限来提升权限。 你可以做的是在升级过程开始后立即结束应用程序,这样你只有一个应用程序在运行。

此场景适用于只需要提升某些function部分的应用程序,例如需要访问程序文件的自动更新安装程序,而不是一直需要pipe理访问的应用程序。

http://www.aneef.net/2009/06/29/request-uac-elevation-for-net-application-managed-code/

当您的应用程序从一开始就知道需要pipe理员权限时,这是一个更好的方法。

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

  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()); }