При управлении доступом и настройками пользователей в домене Active Directory у администратора может возникнуть задача создания динамических групп пользователей AD. Такая динамическая группа должна автоматически включить или исключать пользователей из группы в зависимости от параметров учетной записи пользователя в домене. Например, вы хотите автоматически добавлять пользователей из определенной OU в группу, или создать группу пользователей, которая включает в себя все учетные записи определенного отдела (поле Department) и т.д. Динамические группу позволяют существенно упростить администратору процесс назначения полномочий на файловые сервера, рабочие станции и т.д.
В Active Directory нет встроенного функционала динамических группы безопасности. Однако вы можете создать PowerShell скрипт, который автоматически выбирает пользователей из Active Directory по определенному критерию и добавляет пользователей в определенную группу безопасности AD (можно временно) и удаляет из группы учетные записи, которые не попадают более под условия формирования группы.
При изменении атрибутов пользователя в AD скрипт должен автоматически добавлять или исключать пользователя из группы.
Для использования подобных динамических групп пользователей вы должны у всех учётных записей держать максимально актуальными все поля, использующиеся в критериях выборки (например, при заведении новых пользователей скриптом PowerShell нужно сразу указывать город, отдел, организацию и т.д).
- В Exchange Server есть динамические группы рассылки (Exchange Dynamic Distribution Groups), которые формируются автоматически на основе критериев пользователя, например, значения в поле ”Компания” (company в AD), OU где находится пользователь, поля City, сервера Exchange, на котором расположен ящик или любого другого атрибута пользователя в Active Directory. Но динамические группы рассылки можно использовать только для формирования групп рассылок, но не групп безопасности;
- Встроенные динамические группы есть в Azure AD. В этом каталоге вы можете создать различные правила динамического членства в группах безопасности и группах Office 365;
- Частично возможности динамических групп для предоставления доступа можно заменить функцией Динамический контроль доступа (Dynamic Access Control — DAC) в Windows Server 2012 и выше;
Предположим, вам необходимо автоматически добавлять всех пользователей из нескольких OU, у которых в поле Департамент (Department) в AD указано “Отдел продаж”. Я написал такой PowerShell скрипт (для его работы необходимо наличие модуля Модуль Active Directory для Windows PowerShell, используется командлет Get-ADUser для получения информации о пользователях и командлеты управления группами AD — Add-ADGroupMember, Get-ADGroupMember и Remove-ADGroupMember).
## Имя вашего домена AD
$ADDomain = 'dc=winitpro,dc=ru'
## Имя динамической группы
$ADGroupname = 'mskSales'
## Список OU для поиска пользователей
$ADOUs = @(
"OU=Users,OU=Accounts,OU=SPB,$ADDomain",
"OU=Users,OU=Accounts,OU=MSK,$ADDomain"
)
$users = @()
# Поиск пользователей по указанным 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
}
## Теперь проверим всех пользователей группы на соотвествие критериям выборки и, если пользователь не соотвествует (перенесен в другую OU, изменен отдел) исключить его из группы
$members = Get-ADGroupMember -Identity $ADGroupname
foreach($member in $members)
{
if($member.distinguishedname -notlike "*OU=Users,OU=Accounts,OU=SPB,$ADDomain*" -and $member.distinguishedname -notlike "*OU=Users,OU=Accounts,OU=MSK,$ADDomain*")
{
Remove-ADGroupMember -Identity $ADGroupname -Member $member.samaccountname -Confirm:$false
}
if ((Get-ADUser -identity $member -properties Department|Select-Object Department).department -notlike "Отдел продаж" )
{
Remove-ADGroupMember -Identity $ADGroupname -Member $member.samaccountname -Confirm:$false
}
}
Запустите скрипт и проверьте, что в результате в группу mskSales автоматически добавлены все пользователи из данных OU, у которых в поле Department указано “Отдел продаж”. Все пользователи, которые не соответствуют этим критериям из этой группы исключаются.
Этот скрипт нужно запускать вручную, но лучше запускать его регулярно через отдельное задание планировщика Task Scheduler, от имени учетной записи, у которой имеются права в AD на пользователей и группы (не стоит запускать скрипт из-под администратора домена, все необходимые права можно делегировать обычной сервисной учетке или gmsa аккаунту).
Этот 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
}
и так далее. В целом работает, но есть чувство, что как-то это можно сократить…