正在运行时请求管理员权限
Requesting administrator privileges at run time
是否可以让运行在Windows中的C++应用程序在运行时向操作系统请求管理员权限?
我知道它可以在编译时完成,但似乎找不到是否可以在运行时完成。
谢谢你的帮助!
编辑:如果我希望当前实例具有提升的权限,该怎么办?例如,我可能在内存中存储了要保留的数据。
如果您希望应用程序始终提升,可以通过在中构建清单(技术上不编译)或将外部清单与exe放在同一文件夹中来为其提供清单。如果您想以个人身份决定以提升方式运行它,请右键单击exe或快捷方式,然后选择"以管理员身份运行"。如果您是从代码启动它,那么作为@vcsjones注释,在启动该进程时使用runas
谓词。例如:
ShellExecute( NULL,
"runas",
"c:\windows\notepad.exe",
" c:\temp\report.txt",
NULL, // default dir
SW_SHOWNORMAL
);
您只能在创建过程中提升流程。当一个进程已经运行时,无法更改其安全令牌:它要么以提升的方式运行,要么不以提升的身份运行。
如果您的应用程序需要执行管理任务,并且它通常在非提升状态下运行,则必须创建另一个.exe,该.exe将使用其清单请求提升。要启动提升的进程,必须使用ShellExecute
或ShellExecuteEx
函数。从您的主进程中,您将需要一种方法将命令传递给将提升运行的新进程。
有关UAC的更多信息,请阅读为Windows Vista设计UAC应用程序系列。
不完全如此,但您可以做相反的事情——如果您已经拥有特权,则可以放弃这些特权。因此,您可以使用Kate Gregory列出的方法之一,以管理员身份启动程序。然后,放弃你不需要的特权;请参阅在Windows上的C++中删除权限以了解如何执行此操作。
如这里所述,将清单文件添加到EXE中。
http://msdn.microsoft.com/en-us/library/bb756929.aspx
您的进程(和线程)有一个分配给它们的令牌。该令牌已经设置了您的所有组。在UAC下,Administrator组被禁用。UAC将删除该禁用的组,以便您最终获得完整的管理员令牌。
要获得相同的权限,您必须具有TCB特权。换句话说,要在运行时提升进程,您需要在SYSTEM帐户下运行的进程的帮助,而Microsoft既没有提供,也没有提供API来控制当前的UAC实现。否则,它将违背目的。
为了完整性,有一个进程白名单,可以在没有提示的情况下执行一些提升的操作。简而言之,您的可执行文件需要:
- 由Microsoft签名
- 执行预定义的操作,如IFileOperation
我找到的最好的解释就是这个破解。从那时起,它就被修复了,但它为整个事情提供了一些线索。
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 具有管理员权限的外壳执行不会结束
- 如何在Qt中请求管理员权限?
- CreateProcess() 可以授予管理员权限吗?
- 如何使用管理员权限运行 EXE
- QSettings没有管理员权限不保存ini更改
- 在没有管理员权限的情况下安装 Vulkan SDK
- 如何使用 c++ 在 cmd 中使用管理员权限执行命令
- 在没有管理员权限的情况下安装C++编译器
- 如何在不使用 C++ 中的管理员权限的情况下设置 AD 属性值
- 以 Windows 服务身份运行应用程序是否需要管理员权限
- Windows 7如何确定您是否需要管理员权限?(vc60)
- 是否可以调整令牌权限提升为管理员权限
- 管理员权限2个应用程序
- 如何运行需要管理员权限的应用程序
- >使用 RegCreateKeyEx() 的 Windows 可执行文件不会提示输入 UAC 管理员权限并失败?
- 如何在 c++ 中启动具有管理员权限的应用程序
- 如何在C++中以管理员权限运行 ShellExecute
- 如何通过C++检查我的程序是否在管理员权限下运行