【问题标题】:How can I correctly check for effective read/write access to a file using Windows API?如何使用 Windows API 正确检查对文件的有效读/写访问?
【发布时间】:2012-06-06 07:19:00
【问题描述】:

我已尝试使用 GetEffectiveRightsFromAcl 执行此操作,但它没有为由于我所属的组而拒绝我的文件返回正确的访问掩码。

例如,我有一个文件,unreadable.txt。如果我拒绝当前用户对unreadable.txt 的写访问权,访问掩码会正确显示我没有写访问权。但是,如果我改为拒绝“已验证用户”组的写入访问权限,则访问掩码意味着我拥有完全访问权限(我没有)。

我的替代方法是手动迭代 Ace 列表并将我的 SID 与每个条目进行比较,但我无法找到一种简洁或简单的方法来检查 Ace 是否用于组,以及当前用户是否属于那个组。

作为扩展,该文件可能不存在(即它是一个新文件,即将被写入),在这种情况下需要检查对目录的访问。

有什么好的解决办法吗?似乎应该存在一种更简单的方法来执行此操作,而无需实际尝试读取/写入相关文件。

【问题讨论】:

  • 如果有其他权限/ACL 覆盖某个组,则拒绝该组不一定会拒绝该组的成员。
  • 我的印象是更具体的(用户权限)覆盖不太具体的(组权限)。不过我可能错了。

标签: c++ winapi acl file-permissions


【解决方案1】:

按照Limitations of the GetEffectiveRightsFromAcl API 上的知识库文章的建议,改用AccessCheck

【讨论】:

    【解决方案2】:

    只需尝试使用CreateFile 以所需模式打开文件 - 如果成功,您就知道您拥有访问权限。您实际上不必向文件中写入任何内容,只需立即将其关闭即可。

    【讨论】:

    • 该文件可能不存在,在这种情况下它取决于包含文件夹。我应该澄清这一点。
    • 如果另一个应用程序尝试同时访问该文件,这可能会产生竞争条件,从而导致不稳定的用户体验。我有很多不受欢迎的经历,我无法编辑或删除文件,因为某些应用程序会暂时打开它们。
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多