Резюме: я хочу найти все каталоги и файлы, к которым имеет доступ конкретный пользователь или группа.
Более подробно: я ищу инструмент командной строки для рекурсивного поиска в каталоге 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 интересно, работает для вашего варианта использования?