Использование 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"

делай что хочешь?

Другие вопросы по тегам