如何在需要时提升权限?

Hem*_*ant 83 .net c# privileges uac windows-vista

此问题适用于Windows Vista!

我有一个通常无需管理权限的应用程序.有一个活动确实需要管理权限但我不想以更高的权限启动应用程序本身,因为我知道大部分时间用户甚至不使用该功能.

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

如果用户单击此按钮,则会提示他使用UAC对话框或同意.我怎样才能做到这一点?

Nol*_*rin 57

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

此问题的典型解决方案是在启动提升的进程时指定命令行参数(abatishchev的建议是执行此操作的一种方法),以便启动的进程只知道显示某个对话框,然后在此操作之后退出完成.因此,用户几乎不会注意到新进程已经启动然后退出,而是看起来好像在同一个应用程序中打开了一个新对话框(特别是如果你有一些hackery来制作主窗口)提升过程父进程的子进程).如果您不需要UI来提升访问权限,那就更好了.

有关UAC在Vista上的完整讨论,我建议你看一下这篇关于这个主题的文章(代码示例在C++中,但我怀疑你需要使用WinAPI和P/Invoke来完成C#中的大部分工作)无论如何).希望你现在至少看到正确的方法,虽然设计一个符合UAC标准的程序远非微不足道......

  • Windows 7是否有任何变化或答案为"否,使用新进程"?谢谢... (4认同)
  • @NathanAdams从技术上讲,它首先打开新的任务管理器.否则,正在做什么呢?:-) (3认同)
  • 对Windows 7没有任何改变我很害怕,抱歉.(据我所知,我是Win7的常规用户/开发人员.) (2认同)
  • 这正是任务管理器的工作方式.当您单击按钮以显示所有用户的任务时,当前任务管理器将调用另一个具有管理员权限的任务管理器. (2认同)

aba*_*hev 15

正如有人说:

Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";
Run Code Online (Sandbox Code Playgroud)

将以管理员身份运行该过程以使用注册表执行您需要的任何操作,但使用正常权限返回到您的应用程序.

  • 您无法提升当前正在运行的进程. (27认同)
  • @ nightforce2:肯定这只会有效,如果你已经拥有管理权限(即你已经被提升).否则AdjustTokenPrivileges等会失败,不是吗? (4认同)

Fru*_*eak 13

以下MSDN知识库文章981778描述了如何"自我提升"应用程序:

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

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

这种方法绕过了启动单独进程的需要,但实际上它是重新启动的原始应用程序,以提升用户身份运行.然而,在某些情况下,这可能仍然非常有用,因为在单独的可执行文件中复制代码是不切实际的.

要删除高程,您需要退出该应用程序.

  • @Todd你可以在这里找到代码:[https://code.msdn.microsoft.com/windowsapps/CSUACSelfElevation-644673d3](https://code.msdn.microsoft.com/windowsapps/CSUACSelfElevation-644673d3) (3认同)

Ric*_*ard 5

您需要一个 UAC 名称和代码才能作为 COM 对象运行。

看到这个问题。

MSDN 上的文档。