Вопрос: Оценка текущих 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 если возможно.


7
2018-04-16 14:42


Источник


То, что вы пытаетесь сделать, неясно: что вы имеете в виду «непоследовательно» точно и каков конечный результат, который вы хотели бы получить? Кроме того, почему бы вам не использовать внешние инструменты, если они выполняют эту работу? - Stephane
Что непонятно? Одной учетной записи нужен полный контроль над всеми файлами на общем ресурсе. Эта учетная запись не имеет полного контроля над всеми файлами на общем ресурсе. Приложение LOB нарушает наследование во многих местах, поэтому необходимо использовать явные ACE. - MDMarra
Неясно, в каком состоянии вы сейчас находитесь, что вы подразумеваете под «непоследовательным» и что именно вы требуете. Как ни странно, ваш комментарий добавил одну (важную) точность к тому, что вы хотите. - Stephane
Правильно, поэтому под «непоследовательным» я подразумеваю, что некоторые инженеры из EMC использовали какой-то процесс, который я не знаю, чтобы перетасовывать данные между акциями CIFS, и теперь эта учетная запись службы не указана в ACE каждого ACL на томе, который должен быть. Надеюсь, что это прояснится. - MDMarra
Часть проблемы с «непоследовательным» заключается в том, что я даже не знаю, что это значит на данный момент, и набор данных настолько массивен, что он не поддается ручному контролю. - 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])

Обратите внимание, как теперь второй логический аргумент $false что унаследованный правила не должны возвращаться


8
2018-04-16 14:57