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

Поиск всех файлов в NTFS с определенным пользователем или группой в ACL

Резюме: я хочу найти все каталоги и файлы, к которым имеет доступ конкретный пользователь или группа.

Более подробно: я ищу инструмент командной строки для рекурсивного поиска в каталоге NTFS всех файлов и каталогов, где ACE в DACL содержит данного пользователя или группу. Если бы я хотел изменить разрешения, я бы использовал субинакл или SetACL. Я думал, что смогу использовать один из этих инструментов для поиска и отображения, но у меня возникли проблемы с поиском простого решения.

Я мог бы использовать SetACL так:

   setacl -on C:\SOME_DIR -ot file -actn list -lst "f:tab;w:d;i:y;" -rec cont

а затем grep для интересующего пользователя, но мне бы хотелось более элегантного решения. Я, наверное, что-то здесь упускаю. Любые идеи?

Спасибо, "неизвестно". Ваш сценарий PowerShell для меня не работает, но я собрал кое-что, что работает. Я тоже новичок в этом, но после некоторых проб и ошибок:

Get-ChildItem "C:\SOME\DIR" -recurse | 
    ForEach-Object { 
        $fname = $_.FullName
        $acl = Get-Acl $fname
        foreach ($e in $acl.Access) {
            If ( -not $e.IsInherited -and
                 $e.AccessControlType -eq "Allow" -and 
                 $e.IdentityReference -eq "SOMEDOMAIN\Somegroup") 
            {
                Write-Host $fname
                break
            }
        }
    }

Кто-нибудь с PowerShell kungfu, вероятно, мог бы немного это исправить. Обратите внимание, что у меня он игнорирует унаследованные записи, потому что меня интересует только то, где начинается доступ.

Непроверенный и немного новый для PowerShell, но что-то в этом роде записывает его на экран. Оттуда вы можете сбросить его в файл или что-то еще.

Get-ChildItem "RootFolderPath" -recurse | 
    ForEach-Object { 
        $acl = Get-Acl $_.FullName
        If $acl.ContainsKey "User/Group" {Write-Host $_.FullName}
    }

однострочный, но без фильтра наследования, потому что он проверяет свойство AccessToString.

Get-ChildItem "C:\SOME\DIR" -recurse|foreach{if((Get-Acl $_.FullName).AccessToString -like "*DOMAIN\username*"){write-host $_.FullName}}

Вот модифицированный выше сценарий PowerShell, который работал у меня:

$files = @()
Get-ChildItem "d:\some\path" -recurse | 
    ForEach-Object { 
        $fname = $_.FullName
        if ($fname -notlike "*_vti*") {
            $acl = Get-Acl $($fname)
            foreach ($e in $acl.Access) {
                If ( $e.FileSystemRights -like "*Modify*" -and 
                     $e.IdentityReference -eq "domain\user") 
                {
                    $files += $fname
                    break
                }
            }
        }
    }
$files > d:\out.txt

Бы accessenum интересно, работает для вашего варианта использования?