Le service Windows Python pour accorder automatiquement des permissions de dossier crée des entrées de contrôle d’access dupliquées

J’ai écrit un service Windows en Python qui parsing un répertoire donné pour trouver de nouveaux dossiers. Chaque fois qu’un nouveau dossier est créé, le service crée 4 sous-dossiers et accorde à chacun un ensemble d’permissions différent. Le problème est que, dans ces sous-dossiers, les dossiers créés (essentiellement de niveau tertiaire ou de sous-sous-dossiers) présentent l’erreur suivante lors de l’access aux permissions (par clic droit-> propriétés-> sécurité):

“Les permissions sur le dossier de test sont incorrectement commandées, ce qui peut rendre certaines entrées inefficaces”

Pour réitérer, nous avons le dossier A qui est scanné. Lorsque je crée le dossier B dans le dossier A, les dossiers 1,2,3,4 sont créés dans B, avec les permissions fournies par le script. Tous les dossiers créés dans (1,2,3,4) ont l’erreur ci-dessus lors de l’ouverture des permissions de répertoire. De plus, les entrées de sécurité pour SYSTEM, Administrators et Authenticated Users apparaissent deux fois en cliquant sur advanced.

La partie pertinente du code est la suivante:

import win32security import ntsecuritycon for rw_user in rw: sd=win32security.GetFileSecurity(in_dir+"\\"+dir_,win32security.DACL_SECURITY_INFORMATION) dacl=sd.GetSecurityDescriptorDacl() dacl.AddAccessAllowedAceEx(sec.ACL_REVISION_DS,sec.OBJECT_INHERIT_ACE|sec.CONTAINER_INHERIT_ACE,con.FILE_GENERIC_READ|con.FILE_ADD_FILE,p_dict[rw_user][0]) sd.SetSecurityDescriptorDacl(1,dacl,0) win32security.SetFileSecurity(in_dir+"\\"+dir_,win32security.DACL_SECURITY_INFORMATION,sd) 

Ceci est basé sur l’exemple trouvé dans la définition des permissions de dossier dans Windows en utilisant Python

Toute aide est grandement appréciée.

*** ÉDITÉ À AJOUTER:

Ceci est la sortie de icacls.exe sur le dossier créé par le service:

 PS C:\> icacls "C:\directory monitor\main\center\test\request" C:\directory monitor\main\center\test\request PNIM\jmtzlilmi:(OI)(CI)(R,WD) PNIM\jmtzlilmi:(OI)(CI)(W,Rc) PNIM\jmtzlilmi:(OI)(CI)(R,WD) PNIM\jmtzlilmi:(OI)(CI)(W,Rc) BUILTIN\Administrators:(I)(F) BUILTIN\Administrators:(I)(OI)(CI)(IO)(F) NT AUTHORITY\SYSTEM:(I)(F) NT AUTHORITY\SYSTEM:(I)(OI)(CI)(IO)(F) BUILTIN\Users:(I)(OI)(CI)(RX) NT AUTHORITY\Authenticated Users:(I)(M) NT AUTHORITY\Authenticated Users:(I)(OI)(CI)(IO)(M) 

Ceci est la sortie de icacls sur le répertoire que j’ai créé dans le dossier créé automatiquement, celui qui a des entrées en double:

 PS C:\> icacls "C:\directory monitor\main\center\test\request\test folder" C:\directory monitor\main\center\test\request\test folder PNIM\jmtzlilmi:(OI)(CI)(R,WD) PNIM\jmtzlilmi:(OI)(CI)(W,Rc) PNIM\jmtzlilmi:(OI)(CI)(R,WD) PNIM\jmtzlilmi:(OI)(CI)(W,Rc) BUILTIN\Administrators:(F) BUILTIN\Administrators:(I)(OI)(CI)(IO)(F) NT AUTHORITY\SYSTEM:(F) NT AUTHORITY\SYSTEM:(I)(OI)(CI)(IO)(F) BUILTIN\Users:(OI)(CI)(RX) NT AUTHORITY\Authenticated Users:(M) NT AUTHORITY\Authenticated Users:(I)(OI)(CI)(IO)(M) 

Le dossier surveillé par le service est appelé centre, le dossier que j’ai créé est appelé test. Le service crée alors une “requête” dans le test, et j’ai créé “dossier de test” dans la requête (oui, je sais que je suis génial pour nommer les dossiers, il est un peu plus cohérent dans la production).

EDITED AGAIN:

Copié le mauvais bit de code. J’ai utilisé AddAccessAllowedAceEx et NOT AddAccessAllowedAce. Beaucoup d’excuses…

Le problème réside donc dans la fonction win32security.SetFileSecurity (). Selon MSDN, cette fonction est obsolète (voir: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379577(v=vs.85).aspx ) et a été remplacée par SetNamedSecurityInfo. J’ai changé et tout semble fonctionner correctement. Merci quand même!