如何仅在需要时提升权限?

这个问题适用于Windows Vista!

我有一个通常没有pipe理权限的应用程序。 有一个活动需要pipe理权限,但我不想用更高的权限启动应用程序本身,当我知道大部分时间用户将不会使用该function。

我正在考虑某些方法,通过这种方法我可以在某些事件(例如按下button)上提升应用程序的权限。 例:

替代文字http://i43.tinypic.com/mhy174.jpg

如果用户点击这个button,那么他会被UAC对话或同意提示。 我该怎么做?

我不认为有可能提升当前正在运行的进程。 它是内置于Windows Vista中的,pipe理员权限在启动时被赋予进程,据我所知。 如果您查看使用UAC的各种程序,您应该看到,每次执行pipe理操作时都会启动一个单独的进程(任务pipe理器是一个,Paint.NET是另一个,事实上.NET是另一个.NET应用程序)。

这个问题的典型解决scheme是在启动一个高级进程时指定命令行参数(abatishchev的build议是这样做的一种方法),以便启动的进程只知道显示一个特定的对话框,然后在此动作完成后退出完成。 因此,用户几乎不应该注意到一个新的进程已经启动,然后退出,而似乎在同一个应用程序内的一个新的对话框已经打开(特别是如果你有一些hackery做的主窗口父母的过程中的一个孩子的过程)。 如果你不需要用户界面的高架访问,甚至更好。

对于Vista上的UAC的全面讨论,我build议你看看这个主题的文章 (代码示例是用C ++编写的,但是我怀疑你需要使用WinAPI和P / Invoke来完成C#中的大部分工作)无论如何)。 希望你现在至less看到正确的方法,尽pipedevise符合UAC的程序远不是微不足道的…

以下MSDN知识库文章981778介绍了如何“自我提升”应用程序:

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

它包含Visual C ++,Visual C#,Visual Basic.NET中的可下载示例。

这种方法解决了启动一个单独进程的需求,但实际上它是原始应用程序重新启动,以高级用户身份运行。 尽pipe如此,在某些情况下,在单独的可执行文件中复制代码是不现实的,这仍然是非常有用的。

要移除高程,您需要退出应用程序。

正如那里所说:

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

将以pipe理员身份运行该进程,以便在registry中执行您所需的任何操作,但以普通权限返回到您的应用程序。

您需要一个UAC名字对象,并将代码作为COM对象运行。

看到这个问题。

MSDN上的文档。

我知道这是一个旧的post,但是这是对任何遇到MarcPbuild议的人的回应。 他引用的msdn文章确实会重新启动所有代码示例中的应用程序。 代码示例使用其他build议中已经提出的runas动词。

我下载了代码,以确保,但这是从最初的MSDN文章:

4.单击是批准高程。 然后,原始应用程序重新启动,以高级pipe理员身份运行。
5.closures应用程序。