2009-05-22 13 views
9

Como el título de la pregunta podría sugerir, me gustaría saber la manera de comprobar los permisos ntfs del archivo o carpeta dados (sugerencia: esos son los que ve en el pestaña "seguridad"). Básicamente, lo que necesito es tomar una ruta a un archivo o directorio (en una máquina local, o, preferiblemente, en un recurso compartido en una máquina remota) y obtener la lista de usuarios/grupos y los permisos correspondientes para este archivo/carpeta . En definitiva, la aplicación va a atravesar un árbol de directorios, leyendo permisos para cada objeto y procesándolos en consecuencia.Comprobando permisos de ntfs de carpeta/archivo usando python

Ahora, puedo pensar en un número de maneras de hacer eso: la salida cacls.exe

  • análisis sintáctico - fácil de hacer, pero, a menos que im falta algo, cacls.exe sólo da los permisos en el forma de R | W | C | F (lectura/escritura/cambio/completo), que es insuficiente (necesito obtener permisos como "Mostrar contenido de la carpeta", permisos extendidos también)
  • xcacls.exe o xcacls.vbs salida - sí, me dan todos los permisos que necesito, pero funcionan terriblemente lento, se necesita xcacls.vbs alrededor de UN SEGUNDO para obtener permisos en un archivo de sistema local. Dicha velocidad es inaceptable
  • win32security (que se envuelve alrededor de winapi, ¿verdad?) - Estoy seguro de que puede ser manejado como este, pero prefiero no reinventar la rueda

¿Hay algo más que soy falta aquí?

+2

Creo que win32security es lo que quieres. De hecho, es una envoltura alrededor de la API de Windows. ¿Te preocupa que sea de muy bajo nivel? –

+0

Bueno, si es la única forma en que podría hacerlo usando win32security, pero eso sería como rodar mis propios cucos, es por eso que me he referido a ello como reinventar la rueda. – shylent

+0

Bueno, en primer lugar, cacls no hace todo lo que hace la API de Windows (incluido, aparentemente, lo que quiere hacer). En segundo lugar, llamar a la API (incluso a través de enlaces) probablemente será mucho más rápido que desgranar a otro programa y analizar el resultado. –

Respuesta

16

A menos que desee enrollar el suyo, win32security es el camino a seguir. Hay los inicios de un ejemplo aquí: (!)

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

Si quieres vivir un poco peligrosamente mi en curso WINSYS paquete está diseñado para hacer exactamente lo que está buscando. Usted puede obtener un MSI de la versión dev aquí:

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

o simplemente puede pago y envío el tronco SVN:

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

Para hacer lo que usted describe (adivinando un poco ante los requisitos exactos) que podría hacer esto:

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, muchas gracias! Iba a decir que ya había descubierto cómo hacerlo (usando win32security, sí), pero me acabo de dar cuenta de que lo hice usando los ejemplos en _tu_sitio. ¡Qué tipo de coincidencia es eso! :) – shylent

Cuestiones relacionadas