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
如果您想将其设置为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