我有一些模糊问题在这里。

我需要:如果确定的权限(或者,严格地说,一个特定的王牌的ACL)的文件是继承的。

我如何努力解决这个:使用winapi绑定python(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:])

简单的足够获得安全的描述,得到一个ACL从它那么迭代过Ace在ACL.真正重要的位这里是INHERITED_ACE访问标志。应当设定时的王牌是继承的而不是设定明确。

当你创建一个文件夹/文件,其ACL得到填充Ace根据Ace的父目(文件夹),这是设置传播给孩子。但是,除非你做任何改变的访问清单,INHERITED_ACE标志会不会设置!但继承权限的存在和他们做的工作。

如果你做任何轻微的变化(所说,添加一个条目访问清单,应用改动和删除),标志奇迹般地出现(行为不以任何方式改变,但是,它之前的工作和它的工作之后)!我想要的是要找到源的这种行为的INHERITED_ACE标志,也许找到另一个 可靠的 的方式来确定,如果ACE是继承或没有。

如何重现:

  1. 创建一个对象(文件或文件夹)
  2. 检查的权限,在windows资源管理器,看到,他们已经传播从父目(使说,安全选项的文件的性质对话的窗户资源管理器)。
  3. 检查的标志的使用,例如,脚本我是使用(INHERITED_ACE将不设置任何Ace)。
  4. 改变的权限的一个目(应用的变化),改变他们回来。
  5. 检查的标志(INHERITED_ACE 那)
  6. ..摇晃你的头在怀疑(我知道我做了)

对不起,有些冗长的职位,希望这使得至少一个小小的意义。

有帮助吗?

解决方案

在我赢XP家庭版本代码似乎不在所有的工作:-)

我得到这个堆栈跟踪:

回溯(最近的呼吁最后一次):
文件"C:\1.py"37行, 主(sys.argv[1:])
文件"C:\1.py"29行,在主 为ace_index在范围(acl.GetAceCount()):

AttributeError:'NoneType'象没有属性'GetAceCount'

你可以尝试"微调"的ACL是充满?我的意思是,如果你知道这是去工作后作出轻微的改变这...做一个轻微的改变编程方式,添加一个短ACE和其删除。你可以吗?

更新。 我做了一个实验C#程序在我的工作机(有赢XP教授)和我必须告诉你的.净的方式获得这种安全信息的实际工作。所以,当我创建一个新的文件,我的C#程序检测到的王牌是继承的,而你的代码没有。

这里是样本输出我的运行:

C:>csharp_tricks.exe 2.txt

完全控制-->IsInherited:真的

完全控制-->IsInherited:真的

ReadAndExecute,同步-->IsInherited:真的


C:>1.py2.txt

2.txt

系统管理员0x0

NT权力机构\系统0x0

系统的用户0x0

我的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();
    }
}

因此,这似乎是一个错误的蟒蛇pywin32安全的图书馆。也许他们不这样做的所有必要的系统的电话...

其他提示

你可以使用。净框架

System.Security.AccessControl

这涵盖了ACL和ACL和专.

我觉得原来的海报上看到详细的行为

这个新闻发布

请注意控制的标志设置的容器上可以改变简单地通过联合国-滴答作响和重新滴答作响的继承框在的图形用户界面。

进一步注意到,简单地添加一个王牌的ACL使用微软的工具也将改变控制的标志。

进一步注意到,GUI氯化钙和侵不能依赖的是当涉及到继承由于许多微妙的错误,讨论了在新闻发布。

它似乎是在"旧"的方式控制的继承物使用的控制的标志的容器组合与继承有关的王牌的标志。

"新"办法不使用控制标志的容器上,而不是使用了重复的王牌;一个为控制访问的对象和第二个控制什么是继承的儿童的对象。

但是,看来现有的Microsoft工具(例如Vista)不能工作的"新"办法,所以当你让一个简单的改变使用的工具,它采用老方法的使用的控制的标志的容器。

如果创建一个新的分区在Vista,然后创建一个新的文件夹,然后看看那的标志和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

注意ControlFlags和重复的王牌。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top