Проверка разрешений ntfs для папок / файлов с помощью python - PullRequest
9 голосов
/ 22 мая 2009

Как следует из названия вопроса, мне бы очень хотелось узнать, как проверить разрешения ntfs для данного файла или папки (подсказка: это те, которые вы видите на вкладке «безопасность»). По сути, мне нужно выбрать путь к файлу или каталогу (на локальном компьютере или, предпочтительно, на общем ресурсе на удаленном компьютере) и получить список пользователей / групп и соответствующие разрешения для этого файла / папки. , В конечном счете, приложение будет обходить дерево каталогов, разрешать чтение для каждого объекта и обрабатывать их соответствующим образом.

Теперь я могу придумать несколько способов сделать это:

  • парсинг вывода cacls.exe - легко сделать, НО, если только я что-то не упустил, cacls.exe дает разрешения только в виде R | W | C | F (чтение / запись / изменение / заполнение), что недостаточно (мне нужно получить разрешения, такие как «Список содержимого папки», расширенные разрешения тоже)
  • Вывод xcacls.exe или xcacls.vbs - да, они дают мне все необходимые мне разрешения, но они работают ужасно медленно, xcacls.vbs требуется ОДНА ВТОРАЯ, чтобы получить разрешения для локального системного файла. Такая скорость недопустима
  • win32security (оборачивается вокруг winapi, верно?) - я уверен, что с этим можно справиться, но я бы не стал изобретать велосипед

Есть ли что-то еще, что я здесь скучаю?

1 Ответ

16 голосов
/ 22 мая 2009

Если вы не хотите кататься самостоятельно, win32security - это путь. Здесь начало примера:

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

Если вы хотите жить немного опасно (!), Мой текущий пакет winsys предназначен именно для того, чтобы вы хотели. Вы можете получить MSI версии dev здесь:

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

...