代码之家  ›  专栏  ›  技术社区  ›  shylent

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

  •  5
  • shylent  · 技术社区  · 17 年前

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

    我需要的是:确定文件/文件夹的权限(或者严格来说,DACL的特定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:])
    

    如果你做了任何细微的更改(比如,在访问列表中添加一个条目,应用更改并删除它),标志就会神奇地出现(不过,行为不会以任何方式改变,它之前有效,之后也有效)!我想找到INHERITED_ACE标志这种行为的来源,也许还能找到另一个

    1. 在那里)

    很抱歉这篇文章有点长,希望这至少有点道理。

    3 回复  |  直到 16 年前
        1
  •  0
  •   Massimiliano    16 年前

    System.Security.AccessControl
    

    这包括ACL、DACL和SACL。

        2
  •  1
  •   Mark Schultheiss    16 年前

    我认为原始海报中详细描述了行为

    This newsgroup posting

    进一步注意,使用微软的工具向DACL添加ACE也会更改控制标志。

    似乎控制继承的“旧”方法是将容器上的控制标志与继承相关的ACE标志结合使用。

    “新”方式不使用容器上的控制标志,而是使用重复的ACE;一个用于控制对对象的访问,第二个用于控制子对象继承的内容。

    ControlFlags : 0x8004
    Owner : BUILTIN\Administrators
    Group : WS1\None
    S-1-5-32-544 : BUILTIN\Administrators : 0x0 : 0x0 : 0x1F01FF
    S-1-5-32-544 : BUILTIN\Administrators : 0x0 : 0xB : 0x10000000
    S-1-5-18 : NT AUTHORITY\SYSTEM : 0x0 : 0x0 : 0x1F01FF
    S-1-5-18 : NT AUTHORITY\SYSTEM : 0x0 : 0xB : 0x10000000
    S-1-5-11 : NT AUTHORITY\Authenticated Users : 0x0 : 0x0 : 0x1301BF
    S-1-5-11 : NT AUTHORITY\Authenticated Users : 0x0 : 0xB : 0xE0010000
    S-1-5-32-545 : BUILTIN\Users : 0x0 : 0x0 : 0x1200A9
    S-1-5-32-545 : BUILTIN\Users : 0x0 : 0xB : 0xA0000000
    

        3
  •  1
  •   Gerry Hickman    16 年前

    我得到了这个堆栈跟踪:


    文件“C:\1.py”,第37行,in main(系统argv[1:])

    AttributeError:“NoneType”对象没有属性“GetAceCount”

    你能试着“推动”DACL的填补吗?

    更新。 我在我的工作机器上(用Win XP Prof)用C#程序做了一个实验,我必须告诉你,获取此安全信息的.net方式实际上是有效的。因此,当我创建一个新文件时,我的C#程序检测到ACE被继承,而你的python代码没有。

    以下是我运行的示例输出:

    C: >csharp_tricks.exe 2.txt

    完全控制-->我继承了:真的

    完全控制-->我继承了:真的


    2.txt

    我的C#类:

    public class InheritedAce
    {
        public static string GetDACLReport(string path)
        {
            StringBuilder result = new StringBuilder();
            FileSecurity fs = new FileSecurity(path, AccessControlSections.Access);
            foreach (var rule in fs.GetAccessRules(true, true, typeof(SecurityIdentifier)).OfType<FileSystemAccessRule>())
            {
                result.AppendFormat("{0}  -->  IsInherited:  {1}", rule.FileSystemRights, rule.IsInherited);
                result.AppendLine();
            }
    
            return result.ToString();
        }
    }