Рейтинг:0

массовое удаление прямого доступа к папке через PowerShell ACL

флаг cn

На ряде серверов, на которых я работаю, права доступа к общим папкам загромождены прямыми разрешениями для некоторых наших технических специалистов из-за того, что им необходимо взять на себя ответственность. Я понял, как решить проблему с владением, чтобы этого больше не происходило, но я застрял на очистке этих разрешений. к сожалению, когда я запускаю эту команду, ничего не происходит, даже ошибка. Я предполагаю, что это какая-то логическая ошибка с моей стороны, но я не могу ее обнаружить. Любая помощь будет оценена по достоинству.

# $vData - это корневой путь
Get-Item $vData | по каждому { $_ ; $_ | Get-ChildItem -directory -Force -Recurse }| foreach { $currentDir = $_; $acl = ($_ | Get-Acl).Access; $IDs = $acl | выберите ссылку на личность ; foreach ($ID в $ID) { if (($ID.ToString()).endswith('-admin')) { $acesToRemove = $acl | где { $_.IsInherited -eq $false -и $_.IdentityReference -eq $ID }; $acl.RemoveAccessRuleAll($acesToRemove); Set-Acl -AclObject $acl $currentDir.ToString(); } } }

так как это 1 вкладыш, я разделил его ниже для удобства чтения.

Get-Item $vData |`
foreach {`
 $_ ; $_ | Get-ChildItem -directory -Force -Recurse `
}`
| foreach {`
   $текущий_каталог = $_;`
   $acl = ($_ | Get-Acl).Access; `
   $IDs = $acl | выберите идентификационную ссылку ;`
   foreach ($ID в $ID) { `
     если (($ID.ToString()).endswith('-admin')) {`
        $acesToRemove = $acl | где { $_.IsInherited -eq $false -and $_.IdentityReference -eq $ID };`
        $acl.RemoveAccessRuleAll($acesToRemove); `
        Set-Acl -AclObject $acl $currentDir.ToString(); `
           }`
     }`
    }

код для удаления разрешений основан на коде, который я нашел здесь Полностью удалить пользователя из ACL с помощью PowerShell

Рейтинг:0
флаг cn

Нашел ответ ниже от Reddit, и, похоже, он выполняет то, что мне нужно.

от https://www.reddit.com/r/PowerShell/comments/p19br8/bulk_removing_direct_access_to_a_folder_via/ PS_Алекс

Я думаю, что ваша проблема здесь $acl = ($_ | Get-Acl).Access. Ваш объект $acl содержит только ACE. Командлет Set-Acl ожидает полный объект ACL в качестве входных данных для аргумента -AclObject.

Вы можете попробовать это вместо этого:

# Предполагая, что $vdata - это ваш корневой путь

foreach (папка $ в Get-ChildItem -Path $vdata -Directory -Recurse -Force) {

#Получить текущий ACL папки
$acl = Get-Acl-путь $folder.FullName

#Раскомментируйте, чтобы изучить объект $acl
#$acl | фл

# Отфильтруйте записи ACE, чтобы определить те, которые нужно удалить, и удалите их.
foreach ($aceToRemove в $acl.Access.Where({$psitem.IdentityReference -match "-admin$" -and $psitem.IsInherited -eq $false})) {
    $acl.RemoveAccessRule($aceToRemove)
}

#Раскомментируйте, чтобы изучить объект $acl
#$acl | фл

#Применить ACL-список
Set-Acl -AclObject $acl -Путь $folder.FullName

}

Рейтинг:0
флаг in

Я считаю, что RemoveAccessRuleAll (и RemoveAccessRule) работают с ACL, а не со свойством Access. Вместо этого попробуйте что-то вроде этого:

Get-ChidItem -Path $root -Directory -Force -Recurse |
  ForEach-Object -Process {
    $путь = $_.Полное имя
    Запись-вывод «Работа над ‘$path’»
    $acl = Get-Acl-путь
    if ($aclsToRemove = $acl.Access | Where-Object -FilterScript { $_.IdentityReference -like '*-admin'}) {
      Write-Output "Найдено $($aclsToRemove.Count) ACL для удаления:"
      foreach ($aclToRemove в $aclsToRemove) {
        Write-Output "Удаление $($aclToRemove.IdentityReference) - $($aclToRemove.FileSystemRights) - $($aclToRemove.AccessControlType) из списка ACL"
        $acl.RemoveAccessRule($aclToRemove)
      }
      Запись-вывод "Установка нового ACL в файловой системе"
      Set-Acl -Путь $_.FullName -AclObject $acl
    }
  }
Robyn H avatar
флаг cn
На самом деле я опубликовал тот же вопрос на Reddit, так как думал, что мой вопрос застрял здесь. Я использовал это решение https://www.reddit.com/r/PowerShell/comments/p19br8/bulk_removing_direct_access_to_a_folder_via/h8c4wcv?utm_source=share&utm_medium=web2x&context=3 и только что вернулся, чтобы обновить его. Все же разрешите поблагодарить вас!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.