使用 PowerShell 评估 NTFS ACL 上的当前 ACE

使用 PowerShell 评估 NTFS ACL 上的当前 ACE

我们有一个文档管理系统,该系统的 NTFS 文件系统上有数百万个文件,可通过网络共享进行访问。单个服务帐户需要所有这些文件的完全权限,应用程序代理使用此服务帐户进行访问。

在迁移数据期间,发生了一些事情,权限现在不一致。

我一直在尝试在 PowerShell 中编写一个脚本来识别哪些文件没有适当的 ACE,但get-acl有点......痛苦。

我尝试过类似的各种组合:

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

其中 $Principal 是需要格式权限的用户domain\user

一定有办法做到这一点,对吧?是什么方法?如果可能的话,我希望将其保留为 PowerShell 原生的,而不使用icaclscacls

答案1

您可以这样做(将其分解为更多语句有助于提高可读性):

# 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表示遗传规则不应该返回

相关内容