【发布时间】:2017-02-14 01:28:46
【问题描述】:
我用 Python 编写了一个 Windows 服务,用于扫描给定目录中的新文件夹。每当创建新文件夹时,该服务都会创建 4 个子文件夹并授予每个子文件夹一组不同的权限。问题是在这些子文件夹中,创建的任何文件夹(基本上是第三级或子子文件夹) 访问权限时出现如下错误(通过右键->属性->安全):
“test文件夹的权限排序错误,可能导致部分条目无效”
重申一下,我们有已扫描的文件夹 A。当我在文件夹 A 中创建文件夹 B 时,会在 B 中创建文件夹 1、2、3、4,并使用脚本提供的权限。在(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)
服务监控的文件夹叫center,我在里面创建的文件夹叫test。然后服务在测试中创建“请求”,我在请求中创建了“测试文件夹”(是的,我知道我很擅长命名文件夹。它在生产中更加连贯。)
再次编辑:
复制了错误的代码。我使用了 AddAccessAllowedAceEx 而不是 AddAccessAllowedAce。多多道歉……
【问题讨论】:
-
rw中是否有 SYSTEM、管理员和经过身份验证的用户? Windows 子文件夹倾向于继承其父文件夹的权限。如果这些设置是继承的,并且您再次添加它们,那可能是双打的来源。 -
@CAB 不,它们不在 rw 中。
-
请显示已创建子文件夹之一的 icacls.exe 的输出。
-
@eryksun 我已将您要求的输出添加到主帖中。
-
您的问题是什么?您似乎知道如何设置 ACL - 您是在问为什么会发生错误吗? NT 只希望每个安全主体有一个 Allow 或 Deny ACL,并且任何 Deny ACL 都应该在所有 Allow ACL 之前。我通常使用来自 Python 的安全描述符的字符串版本(有 win32security API 可以来回转换)。
标签: python windows file-permissions pywin32