У нас есть система управления документами, в которой миллионы файлов в файловой системе 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
указывая, что унаследованный правила не должны быть возвращены