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

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

重申一下,我们有一个被扫描的文件夹A。当我在文件夹A中创建文件夹B时,将在B中创建文件夹1,2,3,4,并具有脚本提供的权限。在打开目录权限时,在(1,2,3,4)中创建的所有文件夹均出现上述错误。此外,单击“高级”时,“系统”,“管理员”和“经过身份验证的用户”的安全性条目会出现两次。

代码的相关部分是:

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)

服务监视的文件夹称为center,我在其中创建的文件夹称为test。然后,该服务在测试中创建“请求”,而我在请求中创建“测试文件夹”(是的,我很擅长命名文件夹,我知道。在生产中更加协调一致。)

再次编辑:

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

最佳答案

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

10-07 19:12
查看更多