Windows 文件访问控制权限
基本语法
修改文件访问控制权限的命令行工具是 icacls
,其使用语法是这样的:
icacls FILE # 查看文件的访问权限
icacls FILE /grant SID:(PERM) # 为用户显式授予权限
icacls FILE /deny SID:(PERM) # 为用户显式拒绝权限
icacls FILE /remove SID # 删除用户的权限
icacls FILE /setowner SID # 设置文件所属者
其中,FILE
是你要修改权限的文件,SID
是用户的安全标识符(Security Identifier),或者也可以是用户名,PERM
是权限。
有以下几种权限:
F
- 完全访问M
- 修改访问权限RX
- 读取和执行访问权限R
- 只读访问W
- 只写访问
关于命令的更多用法可以查阅 icacls | Microsoft Learn,或者使用命令 icacls /?
查看帮助。
示例
向管理员组和系统组添加完全访问权限
icacls FILE /inheritance:r /grant Administrators:(F) /grant SYSTEM:(F)
/inheritance:r
: 移除从父目录继承的权限。通过这种方法确保FILE
只拥有我们赋予它的权限。
向所有人添加读权限
icacls FILE /grant Every:(R)
向其他用户和用户组添加完全访问权限
如果不是为 Administrators
、Administrator
、SYSTEM
、Everyone
这种系统自带用户(组)添加权限,建议使用用户的 SID 而不是用户名来添加权限。
首先查询该用户的 SID:
$ Get-LocalUser | Select-Object Name, SID
Name SID
---- ---
Administrator S-1-5-21-479362186-2444553748-1039381088-500
DefaultAccount S-1-5-21-479362186-2444553748-1039381088-503
Guest S-1-5-21-479362186-2444553748-1039381088-501
WDAGUtilityAccount S-1-5-21-479362186-2444553748-1039381088-504
MyUser S-1-5-21-479362186-2444553748-1039381088-1001
这里看到我的用户名 MyUser
的 SID 为 S-1-5-21-479362186-2444553748-1039381088-1001
或者查找用户组的 SID:
$ Get-LocalGroup | Select-Object Name, SID
Name SID
---- ---
docker-users S-1-5-21-479362186-2444553748-1039381088-1010
__vmware__ S-1-5-21-479362186-2444553748-1039381088-1013
Access Control Assistance Operators S-1-5-32-579
Administrators S-1-5-32-544
Backup Operators S-1-5-32-551
Cryptographic Operators S-1-5-32-569
Device Owners S-1-5-32-583
Distributed COM Users S-1-5-32-562
Event Log Readers S-1-5-32-573
Guests S-1-5-32-546
Hyper-V Administrators S-1-5-32-578
IIS_IUSRS S-1-5-32-568
Network Configuration Operators S-1-5-32-556
Performance Log Users S-1-5-32-559
Performance Monitor Users S-1-5-32-558
Power Users S-1-5-32-547
Remote Desktop Users S-1-5-32-555
Remote Management Users S-1-5-32-580
Replicator S-1-5-32-552
System Managed Accounts Group S-1-5-32-581
Users S-1-5-32-545
找到你的用户(组)的 SID,拷贝下来,然后运行命令:
icacls FILE /inheritance:r /grant "*S-1-5-21-479362186-2444553748-1039381088-1001:(F)"
注意 SID 前面要有一个
*
号表示这是一个 SID 而不是用户名
如果你没有使用 SID 而是使用用户名来添加权限,可能会遇到这种 bug,添加的用户名变成一串 SID: