POSIX permission mapping to Windows DACL

在我接触Windows之前,对Windows的文件权限是不屑一顾。要用的时候才发现,Windows文件权限的组合远多于POSIX的rwx。这个坑花了三四天的时间。一句话总结:Windows虽然有更多的组合,但是不能实现全部的rwx组合。

首先是权限本身的转换,这里有个自认为完美的实现,只用一个掩码变量实现x, w, r等3种权限和OTH, GRP,USR等3个用户组的遍历,根据掩码得到的结果保存Windows下对应的权限。

创建3个sid时要特别注意其SID_IDENTIFIER_AUTHORITY 和RID。SID_IDENTIFIER_AUTHORITY分别是SECURITY_CREATOR_SID_AUTHORITY, SECURITY_CREATOR_SID_AUTHORITY, SECURITY_WORLD_SID_AUTHORITY; RID分别是SECURITY_CREATOR_OWNER_RID, SECURITY_CREATOR_GROUP_RID, SECURITY_WORLD_RID。

如果SID创建函数的输入参数有误,在创建时并不会有任何提示,但是用错误的SID创建了新的EXPLICIT_ACCESS,再将EXPLICIT_ACCESS通过SetEntriesInAcl写入DACL时,就会出现莫名的错误,而且没法调试,SetEntriesInAcl后的若干行都跳过了根本不显示其返回值或者错误代码。

看起来权限设置没问题,实际上acl的顺序乱了,而acl是严重依赖于顺序的,乱了就是废了。

创建文件后再修改显得不够专业,也有可能有不常见的坑。因此接下来通过CreateFile直接在创建时指定权限。

CREATOR跟posix中的owner没有关系,现在还不明白CREATOR是什么用途。

总之这个方案是失败。失败是成功之母,成功快出生了。详情见续篇

This entry was posted in tittle tattle. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *