PowerShell ACL 経由でフォルダーへの直接アクセスを一括削除する

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(); `
           }`
     }`
    }

権限を削除するコードは、ここで見つけたコードに基づいています PowerShell を使用して ACL からユーザーを完全に削除する

答え1

RemoveAccessRuleAll (および RemoveAccessRule) は、Access プロパティではなく ACL で機能すると思います。代わりに次のようなものを試してください。

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
    }
  }

答え2

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 コマンドレットは、-AclObject 引数への入力として完全な ACL オブジェクトを想定しています。

代わりに以下を試すこともできます:

#Assuming $vdata is your root path

foreach ($folder in 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

}

関連情報