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

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

# $vData is the root path
Get-Item $vData | foreach { $_ ; $_ | Get-ChildItem -directory -Force -Recurse }| foreach {   $currentDir = $_;  $acl = ($_ | Get-Acl).Access;    $IDs = $acl | select identityreference ;   foreach ($ID in $IDs)      {   if (($ID.ToString()).endswith('-admin')) {      $acesToRemove = $acl | where{ $_.IsInherited -eq $false -and $_.IdentityReference -eq $ID };       $acl.RemoveAccessRuleAll($acesToRemove);        Set-Acl -AclObject $acl $currentDir.ToString();   }    }    }

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

Get-Item $vData |`
foreach {`
 $_ ; $_ | Get-ChildItem -directory -Force -Recurse `
}`
| foreach {`
   $currentDir = $_;`
   $acl = ($_ | Get-Acl).Access; `
   $IDs = $acl | select identityreference ;`
   foreach ($ID in $IDs)      {   `
     if (($ID.ToString()).endswith('-admin')) {`
        $acesToRemove = $acl | where{ $_.IsInherited -eq $false -and $_.IdentityReference -eq $ID };`
        $acl.RemoveAccessRuleAll($acesToRemove); `
        Set-Acl -AclObject $acl $currentDir.ToString(); `
           }`
     }`
    }

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

0
задан 6 August 2021 в 17:16
2 ответа

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

Get-ChidItem -Path $root -Directory -Force -Recurse |
  ForEach-Object -Process {
    $path = $_.FullName
    Write-Output "Working on '$path'"
    $acl = Get-Acl -Path $path
    if ($aclsToRemove = $acl.Access | Where-Object -FilterScript { $_.IdentityReference -like '*-admin' }) {
      Write-Output "  Found $($aclsToRemove.Count) ACLs to remove:"
      foreach ($aclToRemove in $aclsToRemove) {
        Write-Output "    Removing $($aclToRemove.IdentityReference) - $($aclToRemove.FileSystemRights) - $($aclToRemove.AccessControlType) from ACL list"
        $acl.RemoveAccessRule($aclToRemove)
      }
      Write-Output "  Setting new ACL on filesystem"
      Set-Acl -Path $_.FullName -AclObject $acl
    }
  }
0
ответ дан 10 August 2021 в 03:39

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

из https://www.reddit.com/r/PowerShell/comments/p19br8/bulk_removing_direct_access_to_a_folder_через/ PS_Alex

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

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

#Assuming $vdata is your root path

foreach ($folder в Get-ChildItem -Path $vdata -Directory -Recurse -Force) {

#Get the current ACL of the folder
$acl = Get-Acl -Path $folder.FullName

#Uncomment to explore the $acl object
#$acl | fl

#Filter the ACEs to identify the ones to remove, and remove them
foreach ($aceToRemove in $acl.Access.Where({$psitem.IdentityReference -match "-admin$" -and $psitem.IsInherited -eq $false})) {
    $acl.RemoveAccessRule($aceToRemove)
}

#Uncomment to explore the $acl object
#$acl | fl

#Apply the ACL
Set-Acl -AclObject $acl -Path $folder.FullName

}

0
ответ дан 10 August 2021 в 20:06

Теги

Похожие вопросы