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