python - 确定是否继承 ntfs 权限的可靠方法

标签 python winapi acl ntfs file-permissions

我在这里有一个有点晦涩的问题。

我需要的是:确定文件/文件夹的权限(或者,严格来说,DACL 的特定 ACE)是否被继承。

我是如何尝试解决这个问题的:使用 python 的 winapi 绑定(bind)(准确地说是 win32security 模块)。这是精简版,它就是这样做的,它只是将文件路径作为参数,并一个一个地打印出 ACE,指示设置了哪些标志。

#!/usr/bin/env python
from win32security import *
import sys

def decode_flags(flags):
    _flags = {
        SE_DACL_PROTECTED:"SE_DACL_PROTECTED",
        SE_DACL_AUTO_INHERITED:"SE_DACL_AUTO_INHERITED",
        OBJECT_INHERIT_ACE:"OBJECT_INHERIT_ACE",
        CONTAINER_INHERIT_ACE:"CONTAINER_INHERIT_ACE",
        INHERIT_ONLY_ACE:"INHERIT_ONLY_ACE",
        NO_INHERITANCE:"NO_INHERITANCE",
        NO_PROPAGATE_INHERIT_ACE:"NO_PROPAGATE_INHERIT_ACE",
        INHERITED_ACE:"INHERITED_ACE"
    }
    for key in _flags.keys():
        if (flags & key):
            print '\t','\t',_flags[key],"is set!"


def main(argv):
    target = argv[0]
    print target

    security_descriptor = GetFileSecurity(target,DACL_SECURITY_INFORMATION)

    dacl = security_descriptor.GetSecurityDescriptorDacl()

    for ace_index in range(dacl.GetAceCount()):
        (ace_type,ace_flags),access_mask,sid = dacl.GetAce(ace_index)
        name,domain,account_type = LookupAccountSid(None,sid)
        print '\t',domain+'\\'+name,hex(ace_flags)
        decode_flags(ace_flags)


if __name__ == '__main__':
    main(sys.argv[1:])

足够简单 - 获取安全描述符,从中获取 DACL,然后遍历 DACL 中的 ACE。这里真正重要的一点是 INHERITED_ACE 访问标志。它应该在继承 ACE 时设置,而不是显式设置。

当您创建文件夹/文件时,其 ACL 会根据父对象(文件夹)的 ACE 填充 ACE,这些 ACE 设置为传播给子对象。但是,除非您对访问列表进行任何更改,否则不会设置 INHERITED_ACE 标志!但是继承的权限在那里并且它们确实有效。

如果您做了任何细微的更改(例如,向访问列表添加一个条目,应用更改并删除它),该标志会神奇地出现(但是行为不会以任何方式改变,它之前有效并且之后有效)!我想要的是找到 INHERITED_ACE 标志的这种行为的来源,也许找到另一种可靠方法来确定 ACE 是否被继承。

如何重现:

  1. 创建对象(文件或文件夹)
  2. 检查 Windows 资源管理器中的权限,查看它们是否已从父对象传播(例如,使用 Windows 资源管理器的文件属性对话框的安全选项卡)。
  3. 使用例如我使用的脚本检查标志(不会在任何 ACE 上设置 INHERITED_ACE)。
  4. 更改对象的权限(应用更改),甚至将它们改回。
  5. 检查标志(INHERITED_ACE 在那里)
  6. ..难以置信地摇摇头(我知道我做到了)

抱歉,这篇文章有点冗长,希望这至少有一点意义。

最佳答案

你可以使用.Net框架

System.Security.AccessControl

这涵盖了 ACL、DACL 和 SACL。

关于python - 确定是否继承 ntfs 权限的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/910696/

相关文章:

python - python 中的 facebook 网络爬虫

android - 如何确定从后台恢复的 fragment

c# - 编辑 DisableTaskMgr 值时出现 "Cannot write to the registry key"错误

c++ - 获取 H.264 视频的解码器 MFT

c++ - 如何执行快速用户切换

windows - 如何在缺少用户权限的情况下获取正在运行的进程的路径

c# - 如何检查 Windows 文件是否可读/可写?

python - python的Web3端口是否完全实现了Web3 API?

python - 来自文本文件的 Argparse 自定义帮助

python - SQLite3 选择数据(Python 中)