2009-05-22 1 views
9

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

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

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

Есть ли что-нибудь еще я отсутствует здесь?

+2

Я думаю, что win32security - это то, что вы хотите. Это действительно обертка вокруг Windows API. Вы обеспокоены тем, что он слишком низкоуровневый? –

+0

Ну, если это единственный способ, которым я мог бы это сделать, используя win32security, но это было бы похоже на то, чтобы катить мои собственные cacls, вот почему я назвал это как изобретать колесо. – shylent

+0

Ну, во-первых, cacls не делает все, что делает Win API (в том числе, по-видимому, то, что вы хотите сделать). Во-вторых, вызов API (даже с помощью привязок), вероятно, будет намного быстрее, чем обход другой программы и анализ вывода. –

ответ

16

Если вы не любите кататься самостоятельно, 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:

СВН совместно 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

+4

О, Тим, спасибо тебе! Я собирался сказать, что я уже понял, как это сделать (используя win32security, да), но я только что понял, что сделал это, используя примеры на _your_ сайте! Какое это совпадение! :) – shylent