使用Python检查文件夹/文件的NTFS权限
根据问题的标题,我想知道如何检查给定文件或文件夹的NTFS权限(提示:这些权限在“安全”选项卡中可以看到)。简单来说,我需要一个文件或目录的路径(可以是在本地计算机上,或者更好的是,在远程计算机上的共享文件夹),然后获取这个文件/文件夹的用户/组列表以及对应的权限。最终,这个应用程序会遍历一个目录树,读取每个对象的权限并进行相应的处理。
现在,我能想到几种方法来实现这个目标:
- 解析cacls.exe的输出——这很简单,但如果我没有搞错的话,cacls.exe只提供R|W|C|F(读取/写入/更改/完全访问)这样的权限形式,这不够全面(我还需要像“列出文件夹内容”这样的权限,以及扩展权限)
- xcacls.exe或xcacls.vbs的输出——是的,它们提供了我需要的所有权限,但运行速度非常慢,xcacls.vbs获取本地系统文件的权限大约需要一秒钟。这样的速度是不可接受的
- win32security(它是对winapi的封装,对吧?)——我相信可以这样处理,但我不想重新发明轮子
还有其他我遗漏的东西吗?
1 个回答
17
如果你不想自己动手做的话,使用win32security是个不错的选择。这里有个简单的例子:
http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
如果你想尝试一些新东西,我正在开发的winsys包正好可以满足你的需求。你可以在这里下载开发版本的安装包:
http://timgolden.me.uk/python/downloads/WinSys-0.4.win32-py2.6.msi
或者你也可以直接查看svn的主干:
svn co http://winsys.googlecode.com/svn/trunk winsys
要实现你所描述的功能(虽然我对具体需求有点猜测),你可以这样做:
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