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



我正在花费大量时间从简单直观的chmod 400转移到尝试使用ICACLS在Windows命令提示符中执行相同的操作。与UNIX/LINUX chmod的圆滑八进制表示相比,ICACLS似乎是一场复杂的噩梦。

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

ICACLS "D:Folder AAnother FolderFile Name Here.ext" /GRANT:R "DOMAINUSERNAME":R
(在这里找到: https://www.experts-exchange.com/questions/27624477/What-command-can-give-user-read-only-permission.html(

我相信最后的:R允许我替换当前的权限,这就是我想要的。但我不知道该为"DOMAINUSERNAME"段放什么。有什么建议吗?

Unix 和 Windows 中的权限以不同的方式工作。在 Windows 中,默认情况下具有继承功能,并且权限更加精细,因为您具有 ACE(每个标识的权限(,而不仅仅是所有者/组/其他。所有者的权限仅在创建时授予。如果以后更改所有者,则需要手动更新 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 ,可以检查谁是所有者并为该帐户分配权限。请注意,这也可以是管理员等组:

$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

attrib +r "D:Folder AAnother FolderFile Name Here.ext"

做你想做的事?

最新更新