Python Windows服务自动授予文件夹权限会创建重复的ACE

时间:2016-10-05 14:28:53

标签: python windows file-permissions pywin32

我在Python中编写了一个Windows服务,它扫描给定目录中的新文件夹。每当创建一个新文件夹时,该服务就会创建4个子文件夹,并为每个子文件夹授予一组不同的权限。问题是在这些子文件夹中,创建了任何文件夹(基本上是三级文件夹或子子文件夹) 访问权限时出现以下错误(通过右键单击 - > properties->安全性):

“测试文件夹的权限排序不正确,这可能会导致某些条目无效”

重申一下,我们有扫描的文件夹A.当我在文件夹A中创建文件夹B时,文件夹1,2,3,4在B中创建,并具有脚本提供的权限。打开目录权限时,在(1,2,3,4)内创建的任何文件夹都会出现上述错误。此外,单击高级时,SYSTEM,Administrators和Authenticated Users的安全性条目会出现两次。

代码的相关部分是:

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)

这是基于Setting folder permissions in Windows using Python

中的示例

非常感谢任何帮助。

***已编辑添加:

这是icacls.exe在服务创建的文件夹上的输出:

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)

这是我在自动创建的文件夹中创建的目录上的icacls输出,该文件夹具有重复的条目:

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)

服务监控的文件夹称为中心,我在其中创建的文件夹称为test。然后服务在测试中创建“请求”,我在请求中创建了“测试文件夹”(是的,我很擅长命名文件夹,我知道。在生产中它更加连贯。)

再次编辑:

复制了错误的代码。我使用AddAccessAllowedAceEx而不是AddAccessAllowedAce。许多道歉...

1 个答案:

答案 0 :(得分:0)

所以这里的问题出在win32security.SetFileSecurity()函数中。根据MSDN,此函数已过时(请参阅:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379577(v=vs.85).aspx)并已被SetNamedSecurityInfo替换。我切换了,一切似乎都运作良好。不管怎么说,还是要谢谢你!