Вопрос или проблема
Мне нужно запретить группе доступ к папке/файлам C:\Windows\Installer
Я пробую использовать следующий код, но он применяется только к папке, а не ко всем файлам, он применяется только к некоторым файлам
$path = "C:\Windows\Installer"
$acl = Get-Acl $path
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("YourUsers","FullControl", "ContainerInherit,ObjectInherit", "None", "Deny")
$acl.AddAccessRule($AccessRule)
Set-Acl -AclObject $acl -Path $path
Чего-то не хватает в моем скрипте?
ИЗМЕНЕНИЕ:
После проверки разрешений на файлы, которые я могу удалить, похоже, что наследование отключено
Как я могу проверить, отключено наследование или нет, и если оно отключено, как его включить
Мне нужно применить это к 5000 машинам, поэтому я делаю это через скрипт
Вы применяете изменение ACL только к папке, указанной в $path
, чтобы применить ACL ко всему в папке, вам нужно перечислить каждый элемент рекурсивно:
$path = "C:\Windows\Installer"
$items = Get-ChildItem -Recurse $path
# Включает наследование для всех элементов в папке
foreach ($item in $items)
{
$acl = Get-acl $item.FullName
$acl.SetAccessRuleProtection($false,$true)
Set-Acl -AclObject -Path $item.FullName
}
# Устанавливает разрешения файла/папки в нужное состояние
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("YourUsers","FullControl", "ContainerInherit,ObjectInherit", "None", "Deny")
foreach ($item in $items)
{
$acl = Get-acl $item.FullName
# Сравнивает разрешения элемента с разрешениями корневой папки, если они отличаются, применяет ACL
if ((Compare-Object -ReferenceObject (Get-ACL $path) -DifferentObject (Get-ACL $item) -Property access) -ne $null)
{
$acl.AddAccessRule($AccessRule)
Set-Acl -AclObject $item.FullName
}
}
Ответ или решение
Ограничение доступа к папке и файлам в C:\Windows\Installer
Теория
Управление доступом к файлам и папкам в операционной системе Windows осуществляется через списки управления доступом (ACL). Эти списки позволяют назначать определенные права чтения, записи, исполнения или отказа в праве доступа. В вашей ситуации необходимо запретить группе пользователей полный доступ к папке C:\Windows\Installer, включая все её вложенные файлы и папки.
При использовании PowerShell для управления ACL, важно понимать, что изменения прав должны применяться рекурсивно ко всем файлам и папкам. В противном случае, вы можете столкнуться с ситуацией, когда права применяются выборочно, что похоже и произошло в вашем случае. Наследование прав является ключевым аспектом в этом процессе.
Пример
Давайте рассмотрим ваш скрипт и поправим его:
$path = "C:\Windows\Installer"
$group = "YourUsers"
# Получение всех элементов в папке с рекурсивным обходом.
$items = Get-ChildItem -Recurse $path
# Включение наследования прав доступа для всех элементов
foreach ($item in $items) {
$acl = Get-Acl $item.FullName
$acl.SetAccessRuleProtection($False, $True) # Обеспечивает, что права наследуются
Set-Acl -AclObject $acl -Path $item.FullName
}
# Установка правила отказа в доступе
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "FullControl", "ContainerInherit,ObjectInherit", "None", "Deny")
foreach ($item in $items) {
$acl = Get-Acl $item.FullName
# Проверка различий в ACL между элементом и корневой папкой
if ((Compare-Object -ReferenceObject (Get-ACL $path) -DifferenceObject (Get-ACL $item) -Property Access) -ne $null) {
$acl.AddAccessRule($AccessRule)
Set-Acl -AclObject $acl -Path $item.FullName
}
}
Применение
Скрипт позволяет рекурсивно применить правило отказа в доступе ко всем файлам и папкам внутри указанной директории. Это гарантирует, что права доступа наследуются корректно и применяются ко всем элементам, даже если изначально наследование было отключено.
Важно выполнять такие операции с осторожностью, так как действия скрипта могут повлиять на критически важные системные файлы. Перед применением на 5000 машинах, рекомендуется протестировать скрипт на ограниченном наборе устройств, чтобы удостовериться в отсутствии негативного влияния на систему.
Помните также о возможных правах администратора, которые могут быть необходимы для изменения ACL в системных директориях. Убедитесь, что вы выполняете скрипт от имени пользователя с нужными правами.