【问题标题】:Python windows service to automatically grant folder permissions creates duplicate ACEs自动授予文件夹权限的 Python Windows 服务会创建重复的 ACE
【发布时间】: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,我在里面创建的文件夹叫tes​​t。然后服务在测试中创建“请求”,我在请求中创建了“测试文件夹”(是的,我知道我很擅长命名文件夹。它在生产中更加连贯。)

再次编辑:

复制了错误的代码。我使用了 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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 2014-11-29
    • 2019-06-18
    • 1970-01-01
    • 2019-11-30
    • 2011-09-01
    • 1970-01-01
    • 2015-05-01
    • 2013-01-28
    相关资源
    最近更新 更多