Windows

使用 PowerShell 評估 NTFS ACL 上的目前 ACE

  • March 28, 2015

我們有一個文件管理系統,它在 NTFS 文件系統上通過網路共享訪問數百萬個文件。單個服務帳戶需要對所有這些文件和應用程序代理使用此服務帳戶進行訪問的完全權限。

在數據遷移期間,發生了一些事情,權限現在不一致。

我一直在嘗試在 PowerShell 中編寫一個腳本來辨識哪些文件沒有適當的 ACE,但get-acl有點……痛苦。

我嘗試了各種類似的組合:

get-childitem -recurse | get-acl | select -expandproperty access | 
where { $_.$_.IdentityReference -notcontains $principal

其中 $Principal 是需要domain\user格式權限的使用者。

一定有辦法做到這一點,對吧?它是什麼?我想將其保留在 PowerShell 中,並且盡可能不icacls使用cacls

您可以這樣做(將其分解為更多語句有助於提高可讀性):

# Go to the directory and find the files
Push-Location "C:\MDMarrasFiles"
$Files = Get-ChildItem -Recurse

# Create an IdentityReference and a FullControl FileSystemAccessRule for said identity
$Principal = New-Object System.Security.Principal.NTAccount("DOMAIN\user")
$FullControlACERule = New-Object System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($Principal,"FullControl","Allow")

# Go through the files
foreach($File in $Files)
{
   # Get the current ACL on the file
   $ACL = Get-ACL $File

   # Extract the ACEs, both explicit on the file and inherited 
   $ACEs = $ACL.GetAccessRules($true,$true,[System.Security.Principal.NTAccount])

   # Filter the ACEs to extract those giving FullControl to your target user
   $ACEsMatching = $ACEs |Where {`
       $_.FileSystemRights -eq "FullControl" -and `
       $_.IdentityReference -eq $objUser -and `
       $_.AccessControlType -eq "Allow"` 
   }

   # Test if there where no such ACE to be found
   if($ACEsMatching.Count -eq 0)
   {
       # Add the FullControl Rule to the current ACL
       $ACL.AddAccessRule($FullControlACERule)

       # Write the new ACL back to the file
       Set-ACL $File -AclObject $ACL 
   }
}
Pop-Location

請在生產中執行之前對較小的文件子集進行測試;-)

如果您想確保添加新的顯式 ACE,即使該帳戶可能已經繼承了權限,請過濾掉繼承的訪問規則,如下所示:

$ACEs = $ACL.GetAccessRules($true, $false ,[System.Security.Principal.NTAccount])

請注意第二個布爾參數現在如何$false指示不應返回繼承的規則

引用自:https://serverfault.com/questions/589467