如何解决Python & win32security - 关于设置权限的崩溃
我创建了一个 python 工具来在我们的文件服务器上设置权限。 它正在工作 - 但不稳定。 如下所示,有功能“set_permission”和“delete_permission”。 “path_and_rights”参数是一个元组,包含路径为 str、权限为 int 和继承为 int。该函数被连续调用多次。
随机地,Python 进程的 CPU 和 RAM 运行很高,直到 os (Win Server 2012R2) 杀死该进程。 关键的地方是 dacl.SetEntriesInAcl([newacl,]) - 我在周围添加了一个“time.sleep(5)”,这有点帮助,所以我认为后台有一些非阻塞的东西,下一次访问会遇到麻烦 (?) 重新启动后,有问题的路径被顺利处理,并且在该函数的下一次调用之一上发生崩溃。 (1 到 10)。
附加信息: 代码在 Win10 下运行良好 - 可能是 Win Server 2012 下的错误?
解决这个问题的一些想法? 非常感谢!
import win32security
import time
def set_permission(path_and_rights,principal):
usr=win32security.LookupAccountName(None,principal)[0]
sd = win32security.GetNamedSecurityInfo(path_and_rights[0],win32security.SE_FILE_OBJECT,win32security.DACL_SECURITY_INFORMATION)
dacl=sd.GetSecurityDescriptorDacl()
newacl={
'AccessMode': win32security.GRANT_ACCESS,'AccessPermissions': path_and_rights[1],'Inheritance': path_and_rights[2],'Trustee':{
'TrusteeType': win32security.TRUSTEE_IS_GROUP,'TrusteeForm': win32security.TRUSTEE_IS_SID,'Identifier': usr}}
time.sleep(5)
dacl.SetEntriesInAcl([newacl,])
time.sleep(5)
win32security.SetNamedSecurityInfo(path_and_rights[0],win32security.DACL_SECURITY_INFORMATION |
win32security.UNPROTECTED_DACL_SECURITY_INFORMATION,None,dacl,None)
def delete_permission(path_and_rights,win32security.DACL_SECURITY_INFORMATION)
dacl=sd.GetSecurityDescriptorDacl()
for aclnum in range(dacl.GetAceCount()):
aacl=dacl.GetAce(aclnum)
if aacl[2] == usr and aacl[1] == path_and_rights[1] and aacl[0][1] == path_and_rights[2]:
dacl.DeleteAce(aclnum)
win32security.SetNamedSecurityInfo(path_and_rights[0],win32security.DACL_SECURITY_INFORMATION |
win32security.UNPROTECTED_DACL_SECURITY_INFORMATION,None)
return
这是 APPCRASH 上的消息:
Problemsignatur:
Problemereignisname: APPCRASH
Anwendungsname: python.exe
Anwendungsversion: 3.8.6150.1013
Anwendungszeitstempel: 5f6b7010
Fehlermodulname: StackHash_6776
Fehlermodulversion: 6.3.9600.19994
Fehlermodulzeitstempel: 60653cd2
Ausnahmecode: c0000374
Ausnahmeoffset: PCH_63_FROM_ntdll+0x0000000000090B9A
Betriebsystemversion: 6.3.9600.2.0.0.400.8
编辑: 我在另一台机器上测试 - 相同的操作系统,相同的 python 版本(3.8.6): 完美运行。
所以现在我必须找出还有什么可能是原因? 有关如何调试的任何建议?
解决方法
我完全改变了我的代码,现在使用“pythonnet”没有任何问题。 感谢阅读和帮助!
(也许有人知道使用 win32-libary 的解决方案,请随时在此处发布)
import clr
import System
from System.IO import Directory
from System.Security.AccessControl import (
AccessControlType,FileSystemAccessRule,FileSystemRights,PropagationFlags,)
def set_permission(path_and_rights,principal):
accessControl = Directory.GetAccessControl(path_and_rights[0])
accessRule = FileSystemAccessRule(principal,path_and_rights[1],path_and_rights[2],getattr(PropagationFlags,"None"),AccessControlType.Allow,)
accessControl.AddAccessRule(accessRule)
Directory.SetAccessControl(path_and_rights[0],accessControl)
def delete_permission(path_and_rights,)
accessControl.RemoveAccessRuleAll(accessRule)
Directory.SetAccessControl(path_and_rights[0],accessControl)```
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。