在Windows上使用C++降低权限

20

一个在Windows上运行的C++应用程序是否能在运行时放弃权限呢?

例如,如果用户以管理员身份启动我的应用程序,但没有理由以管理员身份运行我的应用程序,我是否可以以某种方式放弃管理员权限?

简而言之,我想在main()函数中编写代码,放弃我不需要的权限(例如,对Windows目录的写入访问权限)。

1个回答

18

是的,您可以使用AdjustTokenPrivileges来从您的令牌中删除不必要和危险的权限。您可以在不立即需要时禁用它(该特权稍后可以启用),或者完全从您的令牌中移除一个权限。

您还可以通过CreateRestrictedToken创建受限制的令牌,并使用该受限制的令牌重新启动运行。CreateRestrictedToken可用于禁用权限并从令牌中删除组(例如Administrators组)。

您可能能够使用AdjustTokenGroups从正在运行的进程的令牌中删除管理员组,但我从未尝试过在已经运行的进程上进行此操作。

请注意,对Windows目录的写访问权限不属于特权。系统中的资源具有ACL(Access Control List)来管理谁具有访问权限。系统和管理员拥有对Windows目录的写访问权限。


你知道哪些WinAPI调用通常会受到令牌的影响吗?我刚刚注意到,如果我使用AdjustTokenPrivelegies()通过将DisableAllPrivileges的值设置为TRUE来删除所有令牌权限,它并不会“应用”到我调用的所有API。例如,如果我放弃所有特权,然后调用标准的Windows文件打开对话框,我仍然可以右键单击对话框窗口并选择“以管理员身份运行”,它将使用管理员权限打开所选文件。访问令牌只对某些API产生影响吗? - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接