ネットワーク共有を介してアクセスされる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])
2番目のブール引数が$false
になっていることに注意してください。これは、継承ルールを返さないことを示しています。