Qui ho una domanda piuttosto oscura.Un modo affidabile per determinare se le autorizzazioni ntfs sono state ereditate
Cosa mi serve: per determinare se sono state ereditate le autorizzazioni (o, in senso stretto, un ACE specifico di un DACL) di un file/cartella.
Come ho provato a risolvere questo problema: utilizzando winapi binding per python (modulo win32security, per essere precisi). Ecco la versione ridotta, che fa proprio questo, - prende semplicemente un percorso per un file come argomento e stampa gli ACE uno per uno, indicando quali flag sono impostati.
#!/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:])
abbastanza semplice - ottenere un descrittore di protezione, ottenere un DACL da esso poi iterare attraverso le voci ACE nel DACL. Il bit davvero importante qui è il flag di accesso INHERITED_ACE. Dovrebbe essere impostato quando l'ACE viene ereditato e non impostato in modo esplicito.
Quando si crea una cartella/file, il relativo ACL viene popolato con voci ACE in base agli ACE dell'oggetto principale (cartella), che vengono impostati per propagarsi ai figli. Tuttavia, se non si apportano modifiche all'elenco di accesso, NON verrà impostato il flag INHERITED_ACE! Ma le autorizzazioni ereditate sono lì e funzionano.
Se si apportano piccole modifiche (ad esempio, aggiungere una voce all'elenco di accesso, applicare le modifiche ed eliminarlo), la bandiera appare magicamente (il comportamento non cambia in alcun modo, tuttavia, ha funzionato prima e funziona in seguito)! Quello che voglio è trovare la fonte di questo comportamento del flag INHERITED_ACE e, forse, trovare un altro affidabile modo per determinare se l'ACE è stato ereditato o meno.
come riprodurre:
- Creare un oggetto (file o una cartella)
- Verificare le autorizzazioni in Windows Explorer, vedere che sono state propagate dall'oggetto padre (utilizzando, per esempio, scheda di sicurezza del file di finestra di dialogo delle proprietà di Windows Explorer).
- Controllare i flag utilizzando, ad esempio, lo script che stavo usando (INHERITED_ACE NON sarà impostato su alcun ACE).
- Modificare i permessi di un oggetto (applicare le modifiche), cambiarli di nuovo anche.
- Controllare le bandiere (INHERITED_ACE sarà essere lì)
- ..shake la testa incredulo (so che ho fatto)
Scusate per un po 'lungo post, spero che questo rende almeno un po' senso.
Ho aggiornato la mia risposta. Questo sembra essere un problema con le librerie Python ... –