背景故事:我的 Windows MFC C++ 应用程序的 Visual-Studio 2010 安装程序包创建了一个数据文件夹 C:\MyDataFolder。因为这是在安装过程中创建的,所以文件夹的所有者是NT AUTHORITY\SYSTEM
. 我希望我的应用程序的所有(非管理员)用户都拥有对该文件夹的完全访问权限,因此我添加了一些代码来为所有经过身份验证的用户授予完全权限(SetEntriesInAcl, SetNamedSecurityInfo
等)。当以管理员身份运行时,这可以正常工作。
为了让用户超级容易,我想允许他们以管理员身份安装,然后以受限用户身份运行程序,尝试设置这些权限,然后在必要时提示他们提升为管理员。(这也将涵盖尚未拥有这些权限的现有安装。)我也成功地做到了这一点(CredUIPromptForWindowsCredentials, CredUnPackAuthenticationBuffer, CredUIParseUserName, LogonUser, ImpersonateLoggedOnUser
)。这给了我一个提升的令牌。我已经尝试过,有没有最后一次调用ImpersonateLoggedOnUser
.
问题:重试调用SetNamedSecurityInfo
仍然失败,拒绝访问。我也尝试使用AdjustTokenPrivileges
为我提升的令牌SE_TAKE_OWNERSHIP_NAME
授予特权,但这失败了“并非所有引用的特权或组都分配给调用者”
我相信我需要拥有此文件夹的所有权,因为它归 SYSTEM 所有,但如果我的提升令牌还没有 SE_TAKE_OWNERSHIP_NAME 权限,我不确定如何授予它。
我对这一切都很陌生,所以我很可能错过了一些非常基本的东西。我也曾想过我应该只制作一个在安装过程中运行并执行此操作的小应用程序,但现在我已经走到了这一步,我很固执,想让海拔部分正常工作。谢谢你的帮助!