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

使用python检查文件夹/文件ntfs权限

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

    正如问题标题可能暗示的那样,我非常想知道如何检查给定文件或文件夹的ntfs权限(提示:这些是您在“安全”选项卡中看到的权限)。基本上,我需要的是获取一个文件或目录的路径(在本地机器上,或者最好是在远程机器上的共享上),并获取用户/组列表以及该文件/文件夹的相应权限。最终,应用程序将遍历目录树,读取每个对象的权限并相应地处理它们。

    • 解析cacls.exe输出——很容易完成,但是,除非我遗漏了什么,否则cacls.exe只以R | W | C | F(读/写/更改/完整)的形式提供权限,这是不够的(我还需要获得“列表文件夹内容”之类的权限,扩展权限)
    • xcacls.exe或xcacls.vbs输出——是的,它们为我提供了所需的所有权限,但它们的工作速度非常慢,xcacls.vbs大约需要一秒钟才能获得本地系统文件的权限。这样的速度是不能接受的
    • win32security(它围绕着winapi,对吗?)——我确信它可以像这样处理,但我不想重新发明轮子

    1 回复  |  直到 17 年前
        1
  •  16
  •   TJG    17 年前

    除非你喜欢自己动手,否则win32security就是一条出路。这里有一个例子的开头:

    http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

    如果你想过一种稍微危险的生活(!),我的winsys程序包就是为你设计的。您可以在此处获得开发版本的MSI:

    http://timgolden.me.uk/python/downloads/WinSys-0.4.win32-py2.6.msi

    或者您可以只签出svn主干:

    http://winsys.googlecode.com/svn/trunk

    要做到您所描述的(稍微猜测一下确切的要求),您可以这样做:

    import codecs
    from winsys import fs
    
    base = "c:/temp"
    with codecs.open ("permissions.log", "wb", encoding="utf8") as log:
      for f in fs.flat (base):
      log.write ("\n" + f.filepath.relative_to (base) + "\n")
      for ace in f.security ().dacl:
        access_flags = fs.FILE_ACCESS.names_from_value (ace.access)
        log.write (u"  %s => %s\n" % (ace.trustee, ", ".join (access_flags)))
    

    TJG