【发布时间】:2010-12-04 17:13:15
【问题描述】:
在 Windows 上运行的 C++ 应用程序是否可以在运行时放弃权限?
例如,如果用户以管理员身份启动我的应用程序,但没有理由以管理员身份运行我的应用程序,我可以通过某种方式放弃管理员权限吗?
简而言之,我想在 main() 函数中编写代码,以删除我不需要的权限(例如,对 Windows 目录的写入权限)。
【问题讨论】:
标签: c++ permissions uac
在 Windows 上运行的 C++ 应用程序是否可以在运行时放弃权限?
例如,如果用户以管理员身份启动我的应用程序,但没有理由以管理员身份运行我的应用程序,我可以通过某种方式放弃管理员权限吗?
简而言之,我想在 main() 函数中编写代码,以删除我不需要的权限(例如,对 Windows 目录的写入权限)。
【问题讨论】:
标签: c++ permissions uac
是的,您可以使用AdjustTokenPrivileges 从您的令牌中删除不需要和危险的权限。如果不是立即需要,您可以禁用(稍后可以启用该权限)或完全从您的令牌中删除一个权限。
您还可以通过CreateRestrictedToken 创建一个受限令牌并重新启动使用该受限令牌运行的应用程序。 CreateRestrictedToken 可用于禁用权限并从令牌中删除组(如管理员组)。
您也许可以使用AdjustTokenGroups 从您正在运行的进程的令牌中删除管理员组,但我从未在已经运行的进程上尝试过此操作。
请注意,对 Windows 目录的写访问权限不包括在权限范围内。系统中的资源有ACL's,它控制谁可以访问。系统和管理员对 Windows 目录具有写入权限。
【讨论】:
AdjustTokenPrivelegies() 通过将DisableAllPrivileges 的值设置为TRUE 来删除所有令牌特权,它不会“应用于”我调用的所有API。例如,如果我删除所有权限,然后调用标准窗口对话框打开文件,我仍然可以在对话框窗口中右键单击并选择“以管理员身份运行”,它将以管理员权限打开所选文件。访问令牌是否仅对某些 API 有效?