使用 ICACLS 将文件权限设置为 'read-only'

Using ICACLS to set file permission to 'read-only'

我从简单、直观的 chmod 400 转移到尝试使用 ICACLS 在 Windows 命令提示符中做同样的事情,这让我很费时间。与 UNIX/LINUX 的 chmod 的圆滑的八进制表示相比,ICACLS 似乎是一场复杂的噩梦。

我有一个 SSH .pem 密钥,我正试图将其设置为只读。我想用这个新的只读权限替换当前的旧权限。我最接近找到答案的是:

ICACLS "D:\Folder A\Another Folder\File Name Here.ext" /GRANT:R "DOMAIN\USERNAME":R
(在此处找到:https://www.experts-exchange.com/questions/27624477/What-command-can-give-user-read-only-permission.html

我相信最后的 :R 允许我替换当前权限,这正是我想要的。但我不知道要为 "DOMAIN\USERNAME" 段添加什么。有什么建议吗?

attrib +r "D:\Folder A\Another Folder\File Name Here.ext"

做你想做的事?

Unix 和 Windows 中的权限以不同的方式工作。在 Windows 中,您默认继承并且权限更细化,因为您拥有 ACE(每个身份的权限),而不仅仅是 owner/group/other。所有者的权限仅在创建时授予。如果稍后更改所有者,则需要在所有者修改文件之前手动更新 ACE。

正因为如此,您需要知道您要将权限授予谁。如果你想只给你登录的用户读取权限,你可以在 PowerShell 中使用 $env:username 或在 cmd 中使用 %USERNAME%

使用 PowerShell 的示例:

$path = ".\test.txt"
#Reset to remove explict permissions
icacls.exe $path /reset
#Give current user explicit read-permission
icacls.exe $path /GRANT:R "$($env:USERNAME):(R)"
#Disable inheritance and remove inherited permissions
icacls.exe $path /inheritance:r

如果您想将其设置为 chmod 400,您可以检查谁是所有者并为该帐户分配权限。请注意,这也可以是像 Administrators 这样的组:

$path = ".\test.txt"
icacls.exe $path /reset
icacls.exe $path /GRANT:R "$((Get-Acl -Path $path).Owner):(R)"
icacls.exe $path /inheritance:r

或者您可以使用 PowerShell 中的内置 cmdlet:

$path = ".\test.txt"

#Get current ACL to file/folder
$acl = Get-Acl $path

#Disable inheritance and remove inherited permissions
$acl.SetAccessRuleProtection($true,$false)

#Remove all explict ACEs
$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) }

#Create ACE for owner with read-access. You can replace $acl.Owner with $env:UserName to give permission to current user
$ace = New-Object System.Security.AccessControl.FileSystemAccessRule -ArgumentList $acl.Owner, "Read", "Allow"
$acl.AddAccessRule($ace)

#Save ACL to file/folder
Set-Acl -Path $path -AclObject $acl