2009-05-22 8 views
9

Wie der Titel der Frage vorschlagen könnte, würde ich sehr gerne wissen, wie die ntfs Berechtigungen der angegebenen Datei oder Ordner (Hinweis: das sind diejenigen, die Sie in der Registerkarte "Sicherheit"). Grundsätzlich brauche ich einen Pfad zu einer Datei oder einem Verzeichnis (auf einer lokalen Maschine oder vorzugsweise auf einer Freigabe auf einem entfernten Rechner) und erhalte die Liste der Benutzer/Gruppen und die entsprechenden Berechtigungen für diese Datei/diesen Ordner . Letztendlich wird die Anwendung einen Verzeichnisbaum durchqueren, Berechtigungen für jedes Objekt lesen und sie entsprechend verarbeiten.Überprüfen von Ordner/Datei ntfs Berechtigungen mit Python

Nun, ich von einer Reihe von Möglichkeiten denken können, das zu tun:

  • Parse cacls.exe Ausgang - leicht gemacht, aber, es sei denn, im etwas fehlt, cacls.exe gibt nur die Berechtigungen in der Form von R | W | C | F (lesen/schreiben/ändern/voll), was ungenügend ist (Ich brauche die Berechtigungen wie "Ordnerinhalt auflisten", erweiterte Berechtigungen)
  • xcacls.exe oder xcacls.vbs Ausgabe - ja, sie geben mir alle Berechtigungen, die ich brauche, aber sie arbeiten schrecklich langsam, es dauert xcacls.vbs über eine Sekunde, um Berechtigungen für eine lokale Systemdatei zu erhalten. Eine solche Geschwindigkeit ist nicht akzeptabel
  • win32security (es umschlingt winapi, nicht wahr?) - Ich bin sicher, kann es so gehandhabt werden, aber ich möchte lieber das Rad nicht neu erfinden

Gibt es etwas, was ich bin hier fehlt?

+2

Ich denke, win32security ist was du willst. Es ist in der Tat ein Wrapper um die Windows API. Sind Sie besorgt, dass es zu niedrig ist? –

+0

Nun, wenn es der einzige Weg ist, den ich mit win32security machen könnte, aber das wäre so, als würde ich meine eigenen cabls rollen, deshalb habe ich es als das Rad neu erfinden bezeichnet. – shylent

+0

Nun, vor allem tut cacls nicht alles, was die Win API tut (einschließlich, anscheinend, was Sie tun wollen). Zweitens wird das Aufrufen der API (selbst durch Bindungen) wahrscheinlich viel schneller sein, als wenn sie auf ein anderes Programm verteilt wird und die Ausgabe analysiert. –

Antwort

16

Wenn Sie keine Lust haben, Ihre eigenen zu rollen, ist win32security der richtige Weg. Es gibt die Anfänge eines Beispiels hier: (!)

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

Wenn Sie etwas gefährlich leben wollen meine in-progress WINSYS Paket genau das tun konzipiert ist, was Sie wollen. Sie können ein MSI der Entwickler-Version erhalten Sie hier:

http://timgolden.me.uk/python/downloads/WinSys-0.4.win32-py2.6.msi

oder Sie können nur die svn Stamm Kasse:

svn co http://winsys.googlecode.com/svn/trunk WINSYS

zu tun, was Sie beschreiben (erraten leicht an die genauen Anforderungen), könnten Sie dies tun:

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

Oh, Tim, vielen Dank! Ich würde sagen, dass ich bereits herausgefunden habe, wie man es macht (mit win32security, yeah), aber ich habe gerade gemerkt, dass ich es mit den Beispielen auf _ihr_Seite gemacht habe! Was für ein Zufall ist das! :) – shylent