使用ICACLS将文件权限设置为"只读"

Kyl*_*lla 0 powershell command-line batch-file chmod icacls

我有一点时间从简单,直观转换chmod 400到尝试在Windows命令提示符中使用相同的东西ICACLS.与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-c​​ommand-can-give-user-read-only-permission.html)

我相信:R在最后允许我替换当前的权限,这是我想要的.但我不知道应该为该"DOMAIN\USERNAME"细分市场提供什么.有什么建议?

Fro*_* F. 7

Unix和Windows中的权限以不同的方式工作.在Windows中,默认情况下您具有继承权,并且权限更加精细,因为您拥有ACE(每个身份的权限),而不仅仅是所有者/组/其他.所有者的权限仅在创建时提供.如果您稍后更改了所有者,则需要在所有者修改文件之前手动更新ACE.

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

使用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
Run Code Online (Sandbox Code Playgroud)

如果要将其设置为等于chmod 400,则可以检查所有者是谁并为该帐户分配权限.请注意,这也可以是像管理员这样的组:

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

或者,您可以在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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。这仍然是相关的,并在经过相当多的搜索后救了我 (3认同)
  • 很好的答案,谢谢。第二个示例中的拼写错误,您没有修改所有者。第 3 行应该是 `icacls.exe $path /GRANT:R "$((Get-Acl -Path $path).Owner):(R)"` (2认同)