在运行时请求管理员权限

Jon*_*Gik 50 c++ windows uac

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

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

谢谢你的帮助!

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

Kat*_*ory 37

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

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

  • +1.您可以使用runas以管理员的身份生成应用程序的第二个副本,然后让原始终止. (3认同)
  • (实际上,runas 和管理员权限是一个红鲱鱼。无论如何,即使我以管理员身份运行调用应用程序,我也会遇到这个问题 - 所以在注销此方法之前我还有另一个问题需要解决) (2认同)
  • 使用“ShellExecute/Ex(runas)”让应用程序运行其自身的第二个副本对我来说一直工作得很好。 (2认同)

Ada*_*eld 8

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

  • @JonaGik避免UAC提示,不要开始运行提升.根据请求启动另一个应用程序(对应用程序进行分区),或者根据请求再次启动同一应用程序的另一个副本并关闭第一个应用程序. (5认同)
  • @hanshenrik我知道现在为时已晚,但其他人可能会发现它很有用:Windows 7中的任务管理器在运行时不会提升,因为它是不可能的.当您单击"显示所有用户的进程"时,它所做的就是重新启动自身.如果在任务管理器中显示PID列,则"taskmgr.exe"PID会在升高后发生变化.这里的神奇之处在于,您没有看到Microsoft对已知应用程序的提升请求,它在Windows 7中实现,以减少与Windows Vista相比的提升请求数. (3认同)
  • 我知道它是_POSSIBLE_,但我不知道如何,提升权限... Windows 7 taskmanager(taskmgr.exe)可以做到这一点,在运行时..内部如何?我不知道.以非管理员身份打开taskmgr.exe,然后转到进程选项卡并按"显示所有用户的进程"按钮,然后它将在运行时请求管理员访问权限. (2认同)

Ale*_*nov 8

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

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


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