在运行时请求pipe理员权限

是否有可能在运行时从Windows操作系统获取C ++应用程序的pipe理员权限?

我知道它可以在编译时完成,但似乎无法find任何地方是否可以在运行时完成。

谢谢你的帮助!

编辑:如果我想要当前实例具有提升的特权呢? 例如,我可能会将数据存储在我想保留的内存中。

不完全是,但是你可以做相反的事情 – 如果你已经拥有它们,你可以放弃特权。 因此,您可以使用Kate Gregory列出的方法之一开始以pipe理员身份运行您的程序。 然后,放弃你不需要的权限; 请参阅在Windows上的C ++中删除权限以了解如何执行此操作。

如果您希望应用程序始终提升,则可以通过构build一个清单(不是通过技术编译),也可以将外部清单放在与exe相同的文件夹中。 如果你想决定,作为一个人,运行它提升,你右键单击该exe或捷径,然后select以pipe理员身份运行。 如果你是从代码启动它,那么@vcsjones注释,你启动该进程时使用runas动词。 例如:

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

只有在创build过程中才能提升进程。 当一个进程已经运行,没有办法改变它的安全标记:它要么运行提升,要么不运行。

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


有关UAC的更多信息,请阅读为Windows Vista系列deviseUAC应用程序

按照此处所述将清单文件添加到EXE中。

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

你的进程(和线程)有一个令牌分配给他们。 这个令牌已经有了你所有的组织。 在UAC下,pipe理员组被禁用。 UAC将删除该禁用的组,以便最终获得完整的pipe理员令牌。

为了达到同样的目的,你必须拥有TCB的特权。 换句话说,要在运行时提升进程,您将需要在SYSTEM帐户下运行的进程的帮助,而Microsoft不提供一个,也没有API来控制当前的UAC实现。 否则,这将失败的目的。

为了完整起见,还有一个进程白名单,可以在不提示的情况下执行一些高级操作。 总之,您的可执行文件需要:

  • 由微软签署
  • 执行预定义的操作,如使用IFileOperation

我发现最好的解释是这个黑客 。 从那时起它已经被固定下来,但是整个事情还是有所了解的。