web-dev-qa-db-ja.com

PowerShellを使用したNTFSACL上の現在のACEの評価

ネットワーク共有を介してアクセスされるNTFSファイルシステム上に数百万のファイルがあるドキュメント管理システムがあります。単一のサービスアカウントには、これらすべてのファイルに対する完全なアクセス許可が必要であり、アプリケーションブローカーはこのサービスアカウントを使用してアクセスします。

データの移行中に何かが発生し、権限に一貫性がなくなりました。

PowerShellでスクリプトを作成して、適切なACEがないファイルを特定しようとしていますが、get-aclはやや...苦痛です。

私は次のようなさまざまな組み合わせを試しました:

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

ここで、$ Principalは、domain\user形式のアクセス許可が必要なユーザーです。

これを行う方法が必要ですよね?それは何ですか? PowerShellにネイティブのままにしておき、可能であればicaclsまたはcaclsを使用しないようにします。

7
MDMarra

あなたはこのようにそれを行うことができます(より多くのステートメントに分割すると読みやすくなります):

# 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])

2番目のブール引数が$falseになっていることに注意してください。これは、継承ルールを返さないことを示しています。

8