Использование 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-command-can-give-user-read-only-permission.html)
Я верю :R
в самом конце позволяет мне заменить текущие разрешения, что я и хочу. Но я не знаю, что поставить на "DOMAIN\USERNAME"
сегмент. Любой совет?
2 ответа
Разрешения в 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 .\test.txt).Owner):(R)"
icacls.exe $path /inheritance:r
Или вы можете использовать встроенные командлеты в PowerShell:
$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 A\Another Folder\File Name Here.ext"
делай что хочешь?