给应用程序提高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()); }
- ASP.Net错误:“types'foo'存在于”temp1.dll“和”temp2.dll“
- 将dependency injection到ASP.NET MVC 3操作filter中。 这种方法有什么问题?
- 多用户ASP.NET Web应用程序中静态variables的范围
- 用数据注释分配DateTime格式?
- 将IIS Express绑定到IP地址
- ScriptManager.RegisterStartupScript代码不工作 – 为什么?
- 为什么Response.Redirect会导致System.Threading.ThreadAbortException?
- 我可以更改FormsAuthentication cookie名称吗?
- 在ASP.NET中使用Messenger Connect客户端库时出现Javascript错误