null

Определение прав доступа к файлу (на Windows Server) средствами PowerShell

Когда возникает задача определить права доступа к тому или иному файлу/каталогу на, скажем, сетевой шаре, в инфраструктуре Windows это может стать небольшой проблемой.
Встроенное графическое средство позволяет быстро и непринужденно увидеть список всех групп и пользователей, имеющих доступ к файлу. Сложности начинаются, когда Вы обнаруживаете, что права на доступ к файлу выданы группе из ActiveDirectory (или не одной группе). Тогда Вам приходится изучать списки соответствующих групп в AD. Дабы не делать это всё мышкой, (особенно если список пользователей нужно предоставить кому-то в человеко-читаемом виде) можно использовать предлагаемый код на PowerShell:

function Get-Perm ($dc, $ent=".")
{
    
    $acl = (Get-Acl "$ent").Access
    foreach ($identity in $acl)
    {
        $identity | Add-Member -MemberType NoteProperty -Name Path -Value $ent
        $prob_dc, $adgroup = ($identity.IdentityReference.Value -split "\\")[0,-1]
        if ($prob_dc -eq  $dc)
        {
            try
            {
                $members = (Get-ADGroupMember -Recursive $adgroup | Get-ADuser | Select samAccountName,name,enabled)
                $identity | Add-Member -MemberType NoteProperty -Name Members -Value $members
            }
            catch
            {
                $identity | Add-Member -MemberType NoteProperty -Name Members -Value $null
            }
        } else {
            $identity | Add-Member -MemberType NoteProperty -Name Members -Value $null
        }       
    }
    $acl
}

Get-Perm DOMAIN Controlling

Собственно скрипт реализован как функция, может использоваться непосредственно, так и встаиваться в другие скрипты (пример вызова в строке 27).
В качестве аргументов функция принимает костыль ($dc - имя домена, в котором следует искать объекты) и имя файла/каталога ($ent) для каторого вывести ACL-ы. Поиск пользователей в группах происходит в строке 13.

Результат работы скрипта следующий (sensetive data прикрыта чёрными дырами):

Path - имя файла. Поля Members содержат списки пользователей соответствующей группы. Остальные поля стандартны для cmdlet-а Get-ACL.
Для работы требуется модуль ActiveDirectory.