我想能够授权或拒绝写访问一个特定的目录在WindowsXP和更多。在
我尝试了以下方法,但都不起作用:
os.chmod()
:只能指定文件只读属性,请参见Python's docwin32api.SetFileAttribute()
FILE_ATTRIBUTE_READONLY:只读的文件。[…]此属性在目录上不适用,请参见MSDN's SetFileAttribute看起来我唯一的选择是访问和更新目录的“Security info”,我已经尝试了几个小时来完成这项工作,但没有取得太大成功(我真的不熟悉Win32 API)。在
有什么办法吗?在
所以,我四处打探,试图了解到底发生了什么,我设法找到了与@Vyktor之前发布的内容非常相似的东西。在
我用this example找到了一些帮助。在
所以,我做的第一件事就是试图理解Windows设置的标志,当我用GUI手动更改安全信息时,我构建了一组函数来帮助我:
从那里,我得到了以下信息:
^{pr2}$这个例子显示了我系统上的默认ACL+第一个ACL,它是我自己创建的,它拒绝在目录中写入。在
所以,使用前面的例子,我构建了这个:
与@Vyktor解决方案相反,我使用了一个“拒绝”ACE,拒绝写访问(而Vyktor添加了一个“允许只读”ACE)。在
我会错过一个合适的方法来删除这个ACE,这样我就可以在这个目录中再写一次了,但是我还没有真正去看。有一点很重要,“Denied”ACE的优先级高于“Allowed”ACE,因此我尝试了一种简单的方法,即使用与在},但后者的优先级高于前一个,因此我仍然无法写入目录。在
dacl.AddAccessDeniedAceEx()
完全相同的参数使用{这是一件很有挑战性的事情。我从this really great answer开始,它可以帮助您处理类似的问题。在
您可以先列出目录的ACL,这可以使用以下代码完成:
您可以找到方法^{} ,它返回ACE的数量。在
^{} 函数将^{} header 作为
tuple
返回:AceType
,AceFlags
-反复试验表明,AceFlags
设置为11
意味着继承特权,3
不是继承的SID
现在您可以阅读旧的ACE,并且deleting old ones非常简单:
^{pr2}$然后,您可以通过调用^{} [MSDN]来添加特权:
我从脚本前半部分的列表中获取了编号}(在运行脚本之前,我在Explorer->;右键单击->;Properties->;Security->;Advanced中设置了权限):
3
、2032127
和{{1美元^
只是借用了http://technet.microsoft.com/的说明性图片
但它对应于:
OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE
FILE_ALL_ACCESS
(实际上是con.FILE_ALL_ACCESS = 2032639
,但是一旦你把它应用到文件中并读回它,你就会得到2032127;区别是512-0x0200——我在^{FILE_GENERIC_READ
你也可以删除访问,更改或删除它,但这应该是一个非常坚实的开始。在
TL;DR-代码
完整ACE列表的迷你实用程序
我刚刚写了一个小脚本来解析所有的文件ace:
它打印出这样的字符串:
相关问题 更多 >
编程相关推荐