Список разрешений на доступ к папке пользователя

14

У меня есть пользователь в домене, который имеет доступ к нескольким подпапкам в нескольких папках. Его права были определены довольно детально. Теперь он покидает компанию, но продолжит работать на фирму в качестве контрактного ресурса.

Мне нужно найти все папки, к которым он имел доступ, и отозвать его разрешения, а затем настроить его с другим набором прав доступа.

Существует ли какой-либо инструмент (желательно бесплатный), в котором перечислены все разрешения NTFS для данного пользователя? Я пытался с AccessEnum от Sysinternals, но список не может быть отфильтрован по имени пользователя и бесполезен для меня. Я тоже посмотрел CACLS, но насколько я могу судить, он отображает разрешения, упорядоченные по файлам, а не по пользователям.

Есть идеи?

imagodei
источник
1
Вот почему вы всегда должны предоставлять членство на основе групп, даже если в группе только один пользователь. Вы могли бы просто удалить его из группы. А пока вы ждете ответа, вы можете просто отключить его аккаунт в AD.
MDMarra
Вы пробовали этот инструмент: AccessChk v5.0? В качестве гарантии того, что они создали безопасную среду, администраторам Windows часто необходимо знать, какие виды доступа имеют определенные пользователи или группы к ресурсам, включая файлы, каталоги, ключи реестра, глобальные объекты и службы Windows. AccessChk быстро отвечает на эти вопросы благодаря интуитивно понятному интерфейсу и выводу. Найдено здесь: technet.microsoft.com/en-us/sysinternals/bb664922.aspx
Luke99
@MarkM: Так верно ... Просто, когда пользователю нужен доступ к одной папке, вы добавляете его. Затем через несколько месяцев ему нужен еще один доступ к совершенно другой акции. И через несколько месяцев снова на 2 или 3 папки. Как создать группу со значимым именем для такого пользователя? "Username_granular_access_group"? Это, вероятно, сделает свое дело. @ Luke99: Интересный инструмент от Sysinternals. Как я мог пропустить это. В любом случае, я вижу, что отображаются все папки, к которым у пользователя есть прямой или косвенный доступ. Есть ли способ отображать только папки, где пользователь явно указан в ACL (исключая доступ через группы)?
имагодеи

Ответы:

13

Похоже, что это делает хитрость (возможно, предостережение), чтобы найти все папки, к которым у пользователя «someuser» есть доступ, в этом примере на диске C, с помощью встроенной команды Windows icacls:

icacls c:\*. /findsid someuser /t /c /l

Параметр / t необходим для того, чтобы указывать его для повторения каталогов. / C необходим, чтобы он продолжал работать, даже если он обнаружит ошибки. / L заставляет его работать с символическими ссылками (если есть). (Последний является L, и эти флаги могут быть в верхнем или нижнем регистре.)

*.Будет признано DOS старожилов как способ сказать «взгляд для каталогов, а не файлы». Конечно, если вы хотите найти файлы, а не папки, измените его на*.* , и, конечно, вы можете указать его на любом диске, или запустить его из любой папки и оставить путь к диску / папке и позволить ему искать относительно этого только папка.

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

И я подтвердил, что он работает в Windows Server 2012, 2008 и Windows 7, поэтому я подозреваю, что он также будет работать в Server 2003, Windows 8 и так далее.

Результирующий список будет отображаться папками строка за строкой, например:

Найден SID: c: \ somedir \ somesubdir.

Обратите внимание, что если вы запустите его как пользователь, который сам не имеет прав доступа к некоторым просматриваемым каталогам, вы получите ошибки, чередующиеся в таких результатах, как:

c: \ System Volume Information: доступ запрещен.

И если вы ищете весь диск, это может привести к сотням таких ошибок, что затруднит поиск в них результатов.

Некоторые могут подумать, что ответом является запуск командной строки от имени администратора, но это просто вызовет появление гораздо большего количества таких ошибок, поскольку теперь вы будете проходить через ранее скрытые папки.

Теперь, если вы заинтересованы в сокрытии этих ошибок, вы не сможете использовать команду поиска для передачи только тех результатов, которые МОГУТ быть успешными (те, которые ДОЛЖНЫ обратиться к «найден SID»), потому что ошибки НЕ будут отфильтрованы по трубе к команде поиска. Вместо этого, если вы хотите удалить все ошибки, вам нужно использовать довольно неясный прием перенаправления потока ошибок (stderr) в «битовую корзину» с помощью 2>nul:. Таким образом, приведенный выше пример станет:

icacls c:\*. /findsid someuser /t /c /l 2>nul:

Просто имейте в виду, что некоторые из папок, которые генерировали такие ошибки, ошибки которых теперь скрыты, вполне могут быть папками, к которым у «someuser» есть доступ, но к которым вы не имеете доступа. Таким образом, вы можете подумать дважды, просто игнорируя эти ошибки. но если вы хотите, вот как вы можете это сделать.

Я понимаю, что эта возможность потенциально ограничивает ценность этого ответа. Если кто-то, более знакомый с вещами, хотел бы расширить или исправить мой ответ, я бы приветствовал это.

оборота Чарли Арехарт
источник
Кажется, это должно быть очевидно, но стоит отметить: поиск *. НЕ равняется только поисковым каталогам или всем каталогам. Имена каталогов могут иметь расширения, а файлы не обязательно должны иметь расширения. Если вы хотите быть тщательным, позвольте ему искать все.
Скотт Э
6

Вы можете использовать PowerShell без необходимости загружать что-либо еще. Это будет работать с версией 2.0 и позже:

$ReferenceAccountName = 'DOMAIN\Username'
[string[]]$SearchDirectories = @('X:\SomeDirectory', 'F:\AnotherDirectory')

foreach ($RootDir in $SearchDirectories) {
    $DirACL = Get-Acl -Path $RootDir
    foreach ($ACL in $DirACL.Access){
        if ($ACL.IdentityReference -like $ReferenceAccountName){
            Write-Output $RootDir
        }
    }
    foreach ($Directory in (Get-ChildItem -Path $RootDir -Recurse | `
                            Where-Object -FilterScript {$_.Attributes `
                            -contains 'Directory'})){
        $DirACL = Get-Acl -Path $Directory.FullName
        foreach ($ACL in $DirACL.Access){
            if ($ACL.IdentityReference -like $ReferenceAccountName){
                Write-Output $Directory.FullName
            }
        }
    }
}

Это не так чисто, как то, что доступно с PowerShell v3 и выше, но это будет работать. Это выведет список каталогов, найденных в строковом формате.

Вы можете легко вывести их в виде объектов и продолжить работу с ними (экспортировать их в CSV-файл, удалять записи по мере их нахождения, обновлять заявку с информацией ... и т. Д.), Манипулируя объектом ввода объекта Write- Выходные звонки.

Джон
источник
Возможно ли также «исключить» унаследованные разрешения? (то есть поиск в каждой папке, где «DOMAIN \ Username» был добавлен явным образом?
dognose
1
Да, вы можете:if ($ACL.IdentityReference -like $ReferenceAccountName -and !$ACL.IsInherited){
Dognose
3

Я нашел решение своего собственного вопроса. Это, я считаю, очень просто и чисто. Вам нужно только установить subinacl и запустить одну строку из командной строки.

Вы можете скачать subinacl здесь . Хотя он официально поддерживается только в Windows 2000, Windows XP и Windows Server 2003, он также должен работать в Windows Vista, Windows Server 2008 и Windows 7.

Затем вы запускаете следующее из командной строки:

subinacl /testmode /noverbose /outputlog=c:\TEXTFILENAME.TXT /subdirectories=directoriesonly X:\*.* /findsid=DOMAIN\username

Где X: диск, который вы сканируете, и имя пользователя - это пользователь, чьи права вы хотите перечислить. Сканирование может занять некоторое время, и вы получите результаты в TEXTFILENAME.TXT.

Если вы используете переключатель / noverbose, вы получаете компактный список разрешений доступа - в основном вы видите, к каким каталогам имеет доступ пользователь (с масками доступа и некоторыми другими вещами, которые иногда могут пригодиться).

Я использовал OpenOffice Calc для импорта списка, а затем применил пользовательский фильтр и фильтровал только те строки, которые начинаются с + FILE . Эти строки содержат каталоги, к которым пользователь имеет доступ. Таким образом, используя простые инструменты, вы получаете только соответствующую информацию.

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

imagodei
источник