Tengo una pregunta algo oscura aquí.Una forma confiable de determinar si los permisos ntfs se heredaron
Lo que necesito: determinar si los permisos (o, estrictamente hablando, un ACE específico de una DACL) de un archivo/carpeta se heredaron.
Cómo traté de resolver esto: usando enlaces de winapi para python (módulo win32security, para ser precisos). Aquí está la versión simplificada, que hace precisamente eso, simplemente toma una ruta a un archivo como argumento e imprime las ACEs una a una, indicando qué banderas están establecidas.
#!/usr/bin/env python
from win32security import *
import sys
def decode_flags(flags):
_flags = {
SE_DACL_PROTECTED:"SE_DACL_PROTECTED",
SE_DACL_AUTO_INHERITED:"SE_DACL_AUTO_INHERITED",
OBJECT_INHERIT_ACE:"OBJECT_INHERIT_ACE",
CONTAINER_INHERIT_ACE:"CONTAINER_INHERIT_ACE",
INHERIT_ONLY_ACE:"INHERIT_ONLY_ACE",
NO_INHERITANCE:"NO_INHERITANCE",
NO_PROPAGATE_INHERIT_ACE:"NO_PROPAGATE_INHERIT_ACE",
INHERITED_ACE:"INHERITED_ACE"
}
for key in _flags.keys():
if (flags & key):
print '\t','\t',_flags[key],"is set!"
def main(argv):
target = argv[0]
print target
security_descriptor = GetFileSecurity(target,DACL_SECURITY_INFORMATION)
dacl = security_descriptor.GetSecurityDescriptorDacl()
for ace_index in range(dacl.GetAceCount()):
(ace_type,ace_flags),access_mask,sid = dacl.GetAce(ace_index)
name,domain,account_type = LookupAccountSid(None,sid)
print '\t',domain+'\\'+name,hex(ace_flags)
decode_flags(ace_flags)
if __name__ == '__main__':
main(sys.argv[1:])
Bastante simple - obtener un descriptor de seguridad, obtener una DACL de ella a continuación, iterar a través de las ACE en la DACL. El bit realmente importante aquí es el indicador de acceso INHERITED_ACE. Se debe configurar cuando el ACE se hereda y no se establece explícitamente.
Cuando crea una carpeta/archivo, su ACL se rellena con ACEs de acuerdo con las ACE del objeto principal (carpeta), que están configuradas para propagarse a los elementos secundarios. Sin embargo, a menos que realice algún cambio en la lista de acceso, NO se establecerá el indicador INHERITED_ACE. Pero los permisos heredados están ahí y funcionan.
Si hace un cambio leve (por ejemplo, agrega una entrada a la lista de acceso, aplica cambios y la elimina), la bandera aparece mágicamente (el comportamiento no cambia de ninguna manera, sin embargo, funcionó antes y funciona después)! Lo que quiero es encontrar el origen de este comportamiento de la bandera INHERITED_ACE y, tal vez encontrar otra forma confiable para determinar si el ACE fue heredado o no.
cómo reproducir:
- crear un objeto (archivo o carpeta)
- Compruebe los permisos en el Explorador de Windows, ver que se han propagado desde el objeto padre (usando, por ejemplo, ficha de seguridad del archivo diálogo de propiedades del explorador de Windows).
- Revise las banderas usando, por ejemplo, la secuencia de comandos que estaba usando (INHERITED_ACE NO se establecerá en ninguna ACE).
- Cambie los permisos de un objeto (aplique los cambios), cámbielos nuevamente.
- comprueba los indicadores (INHERITED_ACE se estar allí)
- ..shake su cabeza con incredulidad (Sé que lo hice)
Lo siento por un tanto extenso post, espero que esto hace al menos un poco sentido.
He actualizado mi respuesta. Esto parece ser un problema con las bibliotecas de Python ... –