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

11 投票
1 回答
11629 浏览
提问于 2025-04-15 11:46

根据问题的标题,我想知道如何检查给定文件或文件夹的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

撰写回答