В некоторых сценариях для предоставления доступа в Active Directory удобно было бы использовать динамические группы безопасности. Идея динамической группы в том, что ее состав автоматически формируется на основе заданных параметров. Например, местоположении пользователя (город, OU), работе в определенном отделе, должности и т.д. Пользователи должны автоматически добавляться или исключаться из такой группы в зависимости от текущих значений их атрибутов.
В этой статье мы рассмотрим пример PowerShell скрипта для реализации динамических групп в AD. Такой PowerShell скрипт должен запускаться по расписанию, выбирать пользователей из AD по определенному критерию, добавлять их в целевую группу AD и удалять из группы пользователей, которые перестали соответствовать критерию.
Рассмотрим пример простого PowerShell скрипта, который будет автоматически добавлять в группу всех пользователей из указанных OU и у которых в поле (Department) в AD указано “Отдел продаж”.
## Имя вашего домена AD
$ADDomain = 'dc=winitpro,dc=ru'
## Имя динамической группы
$ADGroupname = 'mskSales'
## Список OU для поиска пользователей
$ADOUs = @(
"OU=Users,OU=Accounts,OU=SPB,$ADDomain",
"OU=Users,OU=Accounts,OU=MSK,$ADDomain"
)
## Название отдела (поле Department), пользователей которого добавлять в группу
$DepartName="Отдел продаж"
$users = @()
# Выбираем пользователей, соответствующим критериям в указанных OU
foreach($OU in $ADOUs){
$users += Get-ADUser -SearchBase $OU -Filter {Department -like $DepartName}
}
# Добавляем пользователей в целевую группу безопасности
foreach($user in $users){
Add-ADGroupMember -Identity $ADGroupname $user.samaccountname -ErrorAction SilentlyContinue
}
# Теперь проверим всех пользователей группы на соответствие критериям выборки и, если пользователь не соответствует (перенесен в другую OU, изменен отдел), исключаем его из группы
$members = Get-ADGroupMember -Identity $ADGroupname
foreach($member in $members) {
$UserOU=($member.distinguishedname -split ',', 2)[1]
if($ADOUs -notcontains $UserOU){Remove-ADGroupMember -Identity $ADGroupname -Member $member.samaccountname -Confirm:$false}
if ((Get-ADUser -identity $member -properties Department|Select-Object Department).department -notlike $DepartName ){Remove-ADGroupMember -Identity $ADGroupname -Member $member.samaccountname -Confirm:$false}
}
Get-ADGroup $ADGroupname | Set-ADGroup -Clear member
-
Get-ADUser
– получить информацию о пользователе -
Add-ADGroupMember
,Get-ADGroupMember
иRemove-ADGroupMember
— командлеты управления группами AD
Если вы хотите использовать динамические группы для компьютеров, нужно использовать командлеты
Get-ADComputer
,
Add-ADGroupMember
и
Remove-ADGroupMember
.
Запустите скрипт и проверьте, что в группу mskSales были добавлены все пользователи из целевых OU, у которых в поле Department указано
Отдел продаж
. Все пользователи, которые не соответствуют этим критериям исключаются из этой группы.
Для регулярного обновления членства в динамической группе, настройте в планировщике Task Scheduler на контроллере домена задание, которое будет запускать указанный PowerShell скрипт каждые 2 часа.
В параметрах задания укажите:
Program/script:
powershell.exe
Add arguments (optional):
-ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden -File "C:\PS\dynamic_group_sales_department.ps1"
Этот PowerShell скрипт можно использовать в качестве каркаса для создания ваших собственных правил формирования динамических групп в AD.
Все это конечно здорово для общего развития, но что делать когда придет хитровыпендренный запрос на предоставление доступа к папке Отдела продаж человеку из другого подразделения?
Сплошь и рядом бухи хотят видеть документы продажников и наоборот.
В общем такой скрипт будет работать в идеальной организации
А создать папочку Обмен-ХХХХ, для таких вещей? Не получается?
Чтобы не шарились, где не положено, а чуток руками поработали.
Можно для гостей создать отдеьную группу доступа и навесить ее в NTFS разрешения папки, например mskSales_guest
Либо добавить mskSales_guest прямо в группу mskSales и в скриет сделать проверку, чтобы Remove-ADGroupMember не выкидывало группы.
Вешать доступы к папкам на отдельные группы, в которые включать уже группы отделов или отдельных людей из других отделов
Пришел запрос — сделали группу, добавили ей нужные доступы (вышестоящие папки — траверс), добавили в нее нужных людей.
На каждою шару создаются две группы rw и ro, есть специальный регламент где описывается процедура создания и изменения участников групп и специальная заявка где согласуют хозяин ресурса и служба безопасности и после этого пользователя добавляют в соответствующую группу.
Добрый день, делаю по аналогии но под свои нужды, но на этапе
Add-ADGroupMember -Identity $ADGroupname -Member $user.samaccountname -ErrorAction SilentlyContinue
в группу добавляется порядка 1500 учеток, хотя я знаю, что в $users порядка 2500 учеток. Думаю, всё из-за параметра -ErrorAction SilentlyContinue и по каким-то причинам тысяча учеток теряется, помогите понять, как и где вывести причину потери и как можно этого избежать
Все правильно, параметр -ErrorAction SilentlyContinue пропускает записи, если появляется ошибка. Уберите этот параметр в сскрипте и смотрите на ошибки в логе powershell. Обычно они довольно содержательные. Думаю скорее всего у вам либо есть проблемы с именами пользователей (не уникальные, не точные), или нет прав на учетные записи)
А как же «Динамические объекты» начиная с Windows Server 2003? Можно консолью создать группу с TTL.
В этой статье речь немного про другие динамические группы — автонаполняемые группы по определенному критерию пользователей 🙂
Группы с TTL предполагают временное членство в них. Есть статья про это https://winitpro.ru/index.php/2016/10/19/vremennoe-chlenstvo-v-gruppax-active-directory/
Здравствуйте! подскажите, как правильно сделать, чтобы при удалении группы безопасности проверялись не все пользователи, а только определенной OU?
Сейчас, как я понимаю, строчка
if($member.distinguishedname -notlike «*OU=Users,OU=Accounts,OU=SPB,$ADDomain*» -and $member.distinguishedname -notlike «*OU=Users,OU=Accounts,OU=MSK,$ADDomain*»)
проверяет если пользователь удален из данных OU, то его удалить из группы или если критерий отбора по подразделению изменился. У меня сейчас получается, что при таком варианте у всех, кто состоит в других OU и находится в другом отделе — удаляется группа безопасности.
И еще такой вопрос, если групп много? сейчас я добавляю вот так:
foreach($OU in $ADOUs){
$users += Get-ADUser -SearchBase $OU -Filter {Department -like «Отдел продаж»}
}
foreach($user in $users)
{
Add-ADGroupMember -Identity $ADGroupname -Member $user.samaccountname -ErrorAction SilentlyContinue
Add-ADGroupMember -Identity $ADGroupname1 -Member $user.samaccountname -ErrorAction SilentlyContinue
Add-ADGroupMember -Identity $ADGroupname2 -Member $user.samaccountname -ErrorAction SilentlyContinue
Add-ADGroupMember -Identity $ADGroupname3 -Member $user.samaccountname -ErrorAction SilentlyContinue
}
и так далее. В целом работает, но есть чувство, что как-то это можно сократить…
Добрый день.
Спасибо за статью, очень полезно, но появился вопрос:
А если фильтровать не по OU, а по группам, то есть создать динамическую группу не на нескольких групп, например у вас есть несколько VPN-групп, а вы к ним добавляете мультифактор на авторизацию, и вот вам нужно чтобы в группу мультифатора входили пользователи скажем четырёх разных групп пользователей и динамически в неё добавлялись и убирались, то как переделать фильтр с OU на группы?
Сам спросил и сам понял что глупость, для этого есть стандартный функционал вложения группы в группу…