使用Python检查文件夹/文件的NTFS权限

11
如问题标题所示,我非常想知道如何检查给定文件或文件夹的NTFS权限(提示:这些权限在“安全”选项卡中可见)。基本上,我需要获取文件或目录的路径(在本地计算机上或更好的是在远程计算机上共享)并获取用户/组列表以及相应的权限。最终,该应用程序将遍历目录树,读取每个对象的权限并相应地处理它们。
现在,我可以想到几种方法来实现这一点:
  • 解析cacls.exe输出--很容易做到,但是,除非我漏掉了什么,cacls.exe只以R|W|C|F(读/写/更改/完全控制)的形式给出权限,这是不足够的(我需要像“列出文件夹内容”这样的权限,也需要扩展权限)
  • xcacls.exe或xcacls.vbs输出--是的,它们给我所有我需要的权限,但它们工作得非常慢,xcacls.vbs需要大约一秒钟才能获取本地系统文件的权限。这样的速度是无法接受的
  • win32security(它包装了winapi,对吧?)--我确信可以像这样处理它,但我宁愿不要重复造轮子
还有其他我忽略的方法吗?

2
我认为win32security是你想要的。它确实是Windows API的包装器。你担心它太低级了吗? - Matthew Flaschen
好吧,如果这是唯一的方法,那我最好使用win32security完成它,但那就像是重复造轮子,所以我称之为重新发明轮子。 - shylent
首先,cacls并不能完成Win API所能完成的所有功能(包括你想要做的)。其次,调用API(即使是通过绑定)可能比运行另一个程序并解析输出要快得多。 - Matthew Flaschen
1个回答

17
除非你想自己编写代码,否则win32security是解决这个问题的途径。 这里有一个示例:http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html 如果你稍微冒险一点(!),我的winsys软件包正在进行中,它正是你要寻找的。你可以在这里获得dev版本的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


4
哦,Tim,非常感谢你!我本来要说的是,我已经想出了如何做到这一点(使用win32security),但我刚刚意识到,我是使用你网站上的示例完成的!这是什么巧合啊! :) - shylent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接