【问题标题】:Checking File Permission on Windows for non elevated users在 Windows 上检查非提升用户的文件权限
【发布时间】:2012-03-14 23:46:11
【问题描述】:

我正在为 Windows(XP/7) 平台编写一些 C++ 代码来检查与文件关联的权限。我想验证我正在阅读的文件不能由具有非提升权限的帐户写入。这就是我目前正在做的事情:

  • 我得到了与调用 GetNamedSecurityInfo 的文件关联的 DACL
  • 我用众所周知的 Sid 调用 CreateWellKnownSid,例如 WinAuthenticatedUserSid(用户组)
  • 我调用 BuildTrusteeWithSid 以使用之前的 SID 构建受托人
  • 我用之前创建的受托人调用 GetEffectiveRightsFromAcl 以获取有效的 acl
  • 我检查 ACL 不包含写入标志集。

此代码非常适合用户组。对于可能对文件具有特定写入权限的其他组(例如所有人、访客或其他特定用户)呢?我想找到一个解决方案,我不需要枚举所有可能的 SID 并检查所有这些。是否有我可以使用的 SID,例如“除了管理员之外的任何东西”?

问候, 蚂蚁

【问题讨论】:

  • 该文件可以有一个允许单个用户的 ACL。如果您依赖GetEffectiveRightsFromAcl,这意味着您必须单独检查所有用户。另外,听起来你可以把所有的辛苦工作都交给AuthzAccessCheck()

标签: c++ windows file-permissions


【解决方案1】:

我会采取稍微不同的方法:

  1. 通过 GetExplicitEntriesFromAcl 获取文件及其所有父项的所有 ACE
  2. 选择GRANT_ACCESSSET_ACCESS ACE 的
  3. 从选定的 ACE 中获取受托人列表
  4. 为每个受托人执行访问检查。 GetEffectiveRightsFromAcl 可能是这里最简单的解决方案。

您需要具体考虑您想对 OWNER 做什么。他可以随时更改权限。

【讨论】:

  • 感谢您的完整回答。在这种情况下,如果我只想允许提升的帐户具有写入权限,对于每个受托人,我仍应检查它们是否属于 Admin 组或 Admin 组的任何其他组。对吗?
  • @user1230896:我不这么认为。 Windows 上的管理员不是 Unix 的 root。它的特殊地位在于它可以取得所有权。与 root 不同,它没有自动访问权限。
猜你喜欢
  • 2014-09-10
  • 2013-09-08
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多