29 августа 2020 г.

Как получить список пользователей AD имеющих доступ к папк

Самый удобный вариант, это взять скрипт на PowerShell, подправить его под себя и запустить.

Хороший скрипт нашел тут: https://itbru.ru/index.php/2017/08/02/powershell-sozdanie-spiska-userov/.

Есть у него недостатки:
  • структура имеет наследование через несколько групп;
  • нужно просмотреть не только указанную папку, но и подпапки в этой папке.

Т.е. есть группа, в группе есть другие группы, а уже в этих подгруппах есть пользователи.
Мне повезло и у меня дерево состоит всего-лишь из 2-х ветвей. Т.е. группа - подгруппа - пользователи.

Есть возможность сделать просмотр всех папок в указанной папке, но это займет довольно много времени, поэтому не рекомендую.
#
#Скрипт для получения списка доменных учетных записей которые имеют права на папку. Список выгружается в CSV файл. 
#
#Указываем папку по которой нужен отчет
$path = “Z:\FTP\”
#Содержимое (подпапки) папки по которой нужен отчет, можно добавить ключ -Recurse и тогда будут просмотрены все подпапки вгубь, но это займет очень много времени.
$folder_path = dir -Directory -Path $path -Force
#путь куда клать CSV
$datafile = "c:\Temp\AccessRights.csv"
#Создаем файл по пути $datafile
Set-Content -Value 'Папка;Группа;Подгруппа;Пользователь;Права доступа;Тип' -Path $datafile -Encoding UTF8
#Получаем имя домена
$domain = (Get-ADDomain).name.ToUpper()
#Получаем списки безопасности целевой папки
$Acl = Get-Acl $path
$acl = $acl.Access
#Перебираем список доступа
foreach ($a in $acl)
{
#Берем только доменные учетки
if ($a.IdentityReference -match $domain)
{
#Переводим уровень доступа на человеческий)
if ($a.FileSystemRights.ToString() -eq "ReadAndExecute, Synchronize") {$AccessType = "Только Чтение"}
elseif ($a.FileSystemRights.ToString() -eq "Modify, Synchronize") {$AccessType = "Чтение и Запись"}
elseif ($a.FileSystemRights.ToString() -eq "FullControl") {$AccessType = "Полный доступ"}
else {$AccessType = "Custom"}
#Убираем из имени наименование домена
$name = $a.IdentityReference.Value.ToString().Replace($domain+"\",'')
#Выясняем группа или пользователь
$ADObject = Get-ADObject -filter{SamAccountName -eq $name}
if ($ADObject.ObjectClass.ToString() -eq "user") 
{
$data = $path+";;;"+$name+";"+$AccessType+";Пользователь"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8
}

#Если группа - получаем список пользователей в группе
if ($ADObject.ObjectClass.ToString() -eq "group") 
{
$group = $name
            $data = $path+";"+$group+";;;"+$AccessType+";Группа"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8

            $gusers = Get-ADGroupMember $name
foreach ($u in $gusers)
{
if ($u.ObjectClass.ToString() -eq "user") 
{
$name = $u.SamAccountName
$data = $path+";"+$group+";;"+$name+";"+$AccessType+";Пользователь"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8
}
                
#Если группа в группе - получаем список пользователей в группе
if ($u.ObjectClass.ToString() -eq "group") 
{
                    $name = $u.SamAccountName
                    $pgroup = $name
$data = $path+";"+$group+";"+$pgroup+";;"+$AccessType+";Группа"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8

                    $userss = Get-ADGroupMember $u
foreach ($uu in $userss)
{
$name = $uu.SamAccountName
$data = $path+";"+$group+";"+$pgroup+";"+$name+";"+$AccessType+";Пользователь"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8
}
}
}
}
}

}

Foreach ($folder in $folder_path) 
{    
#Получаем списки безопасности целевой папки
$Acl = Get-Acl $folder.FullName
$acl = $acl.Access
#Перебираем список доступа
foreach ($a in $acl)
{
#Берем только доменные учетки
if ($a.IdentityReference -match $domain)
{
#Переводим уровень доступа на человеческий)
if ($a.FileSystemRights.ToString() -eq "ReadAndExecute, Synchronize") {$AccessType = "Только Чтение"}
elseif ($a.FileSystemRights.ToString() -eq "Modify, Synchronize") {$AccessType = "Чтение и Запись"}
elseif ($a.FileSystemRights.ToString() -eq "FullControl") {$AccessType = "Полный доступ"}
else {$AccessType = "Custom"}
#Убираем из имени наименование домена
$name = $a.IdentityReference.Value.ToString().Replace($domain+"\",'')
#Выясняем группа или пользователь
$ADObject = Get-ADObject -filter{SamAccountName -eq $name}
if ($ADObject.ObjectClass.ToString() -eq "user") 
{
$data = $folder.FullName+";;;"+$name+";"+$AccessType+";Пользователь"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8
}

#Если группа - получаем список пользователей в группе
if ($ADObject.ObjectClass.ToString() -eq "group") 
{
$group = $name
            $data = $folder.FullName+";"+$group+";;;"+$AccessType+";Группа"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8

            $gusers = Get-ADGroupMember $name
foreach ($u in $gusers)
{
if ($u.ObjectClass.ToString() -eq "user") 
{
$name = $u.SamAccountName
$data = $folder.FullName+";"+$group+";;"+$name+";"+$AccessType+";Пользователь"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8
}
                
#Если группа в группе - получаем список пользователей в группе
if ($u.ObjectClass.ToString() -eq "group") 
{
                    $name = $u.SamAccountName
                    $pgroup = $name
$data = $folder.FullName+";"+$group+";"+$pgroup+";;"+$AccessType+";Группа"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8

                    $userss = Get-ADGroupMember $u
foreach ($uu in $userss)
{
$name = $uu.SamAccountName
$data = $folder.FullName+";"+$group+";"+$pgroup+";"+$name+";"+$AccessType+";Пользователь"
#Запись в файл
Add-Content -Value $data -Path $DataFile -Encoding UTF8
}
}
}
}
}

}
}

Использовал так же наработки со страницы: https://fixmypc.ru/post/kak-rabotat-s-razresheniiami-ntfs-acl-v-powershell/ 

Комментариев нет:

Отправить комментарий