在运行时请求管理员权限

时间:2011-06-20 23:41:16

标签: c++ windows uac

是否可以在Windows中运行C ++应用程序以在运行时从操作系统请求管理员权限?

我知道它可以在编译时完成,但似乎无法在运行时找到它。

感谢您的帮助!

编辑:如果我希望当前实例具有提升的权限怎么办?例如,我可能将数据存储在我希望保留的内存中。

5 个答案:

答案 0 :(得分:36)

如果您希望应用程序始终提升,您可以通过构建一个(不是技术上的编译)或将外部清单放在与exe相同的文件夹中来为它提​​供清单。如果您想作为一个人决定高架运行,请右键单击exe或快捷方式,然后选择“以管理员身份运行”。如果您是从代码启动它,那么当@vcsjones注释时,您在启动该进程时使用runas动词。例如:

ShellExecute( NULL, 
    "runas",  
    "c:\\windows\\notepad.exe",  
    " c:\\temp\\report.txt",     
    NULL,                        // default dir 
    SW_SHOWNORMAL  
); 

答案 1 :(得分:8)

不完全,但你可以做相反的事情 - 如果你已经拥有它们,你可以删除特权。因此,您可以使用Kate Gregory列出的方法之一让您的程序以管理员身份运行。然后,删除不需要的权限;请参阅Dropping privileges in C++ on Windows了解如何操作。

答案 2 :(得分:8)

您只能在创建过程中提升流程。当一个进程已经运行时,就无法更改其安全令牌:它是否运行升级。

如果您的应用程序需要执行管理任务,并且通常运行非提升,则必须创建另一个.exe,它将使用其清单请求提升。要启动升级过程,您必须使用ShellExecuteShellExecuteEx函数。从主进程中,您需要一种方法将命令传递给将运行升级的新进程。


有关UAC的更多信息,请阅读Designing UAC Applications for Windows Vista系列。

答案 3 :(得分:2)

按照此处的说明将清单文件添加到EXE中。

http://msdn.microsoft.com/en-us/library/bb756929.aspx

答案 4 :(得分:2)

您的进程(和线程)有一个令牌给它们。该令牌已经设置了所有组。在UAC下,管理员组已禁用。 UAC将删除该已禁用的组,以便您最终获得完整的管理员令牌。

要获得同样的效果,您必须拥有TCB特权。换句话说,要在运行时提升进程,您将需要来自在SYSTEM帐户下运行的进程的帮助,并且Microsoft不提供一个,也不提供API来控制当前的UAC实现。否则,它会破坏目的。

为了完整性,有一个进程的白名单可以在没有提示的情况下执行某些提升的操作。简而言之,您的可执行文件需要:

  • 由Microsoft签名
  • 执行预定义操作,例如IFileOperation

我找到的最佳解释是this hack。从那时起它就被修复了,但却对整个事情有所了解。