起因
实际上这个问题在我的Windows权限挣扎之cygwin复活记中已经给出了可以做到理论完美解决的办法。问题是我还没有搞懂Windows权限的一些复杂概念,以及其与Linux权限的映射关系。
背景
Linux权限好像学过的人都知道都理解的。Windows权限对大部分人好像根本不存在,实际上Windows的权限我粗略看了下,好像要比Linux复杂得多。自从默认使用NTFS格式之后,权限就变得非常的复杂了。
其中有一个命令是icacls,利用其备份和还原以及重置,基本上就可以修改成需要的任何权限了。问题是其备份的问题,一般人还是看不懂,也不知道怎么修改的。
实际问题
对应到cygwin中就是在重装系统后用takeown取得管理员权限,然后icacls删除所有不认识的ssid似乎就好了。但是我发现今天无意中发现还是有较多的某些文件夹及其中的文件带有一串数字账户。
首先我找到的是Remove orphaned SIDs from File/Folder ACL (PowerShell),不过非常可惜的是,在Win8.1上面,即使-ExecutionPolicy ByPass
好像都不能解决问题。简单点说就是无法执行,或者不能递归执行。(如果有谁在WIn8.1上面执行成功欢迎留言告诉我,谢谢!)
这里要说明一个问题,一定要disable inheritance(右键,安全,高级,弹出的那个窗口左下角按钮). 可以使用如下命令进行递归禁用权限继承。
1. ICACLS *.* /inheritance:d /T (禁用继承)
2. ICACLS *.* /remove:g Users /T (这个似乎不工作)
3. ICACLS *.* /inheritance:e /T (启用继承)
比如我用的就是在cygwin目录下执行icacls *.* /inheritance:d /T
,就可以批量保证几十万的文件都禁用了继承。
然后我发现SubInACL这个玩意。这个subinacl对于删除ssid好像特别有效。
具体到步骤是这样的:
-
获取所有的权限列表保存到文本文件
subinacl /subdirectories C\*.* /display >d:\out.txt
-
排序去重
cd d: sort out.txt /o out2.txt uniq out2.txt > out3.txt
说明下我的out.txt有2.46G,out2.txt有1.23G,而out3.txt只有33.2M,这样编辑器打开或者grep都容易得多了。
另外sort是用的Windows内置的命令,uniq是用的cygwin的bin目录下面的,我常年把cygwin/bin放在系统path的system32后面。
如果没有uniq只是大一点,还是可以找到的。
-
查找
pace =S-1
开头的。由于我重装系统非常频繁,基本一两个月就一次,已经是惯例了,所以在存在继承的情况下,实际上会遗留非常多的ssid账户。这里的ssid用icacls删除不容易,因为如果只删除一个小括号内部的话,icacls执行的时候会拒绝的。但是如果系统已经全面禁止继承了,则应该不会有此风波。
-
对每个ssid执行下面的命令
subinacl /subdirectories *.* /suppresssid=S-1-5-21-56246481-4602087933-3644394174-1001
换S-1-*部分
至此权限修复完毕。 然后删除etc下面passwd和group,重新打开mintty,然后执行
mkpasswd -l > /etc/passwd
mkgroup -l > /etc/group
这样再执行ls -al
的时候就不会出现???
用户组了,全部显示的就是正常的了。