Назад | Перейти на главную страницу

Оценка текущих ACE в списках ACL NTFS с помощью PowerShell

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