Легенда:
Мы администратор домена domain.test предприятия, в котом имеется крупный проектный отдел. Сотрудники
отдела, часто покидают компанию по завершению проекта и так же могут возвращаться
в другой проект или в старый. Доступ к сервисам и файловым ресурсам в нашем
домене предоставлен по средствам групп безопасности. У всех пользователей
группа по умолчанию Domain Users.
Задача:
Организовать процедуру удаления пользователя со всех групп за
исключением Domain Users при увольнении - для того что бы при
возвращении в компанию у бывшего сотруднике не было доступа к сервисам к
которым он ранее имел доступ. Вести логирование, из каких групп был удален
пользователь – если вдруг сотрудник возвращается в тот самый проект, в котором
ранее завершил работу, либо же если другой сотрудник просит предоставить все доступы,
которые имел уволенный сотрудник, место которого он занял.
Решение:
При помощи модуля Active Directory для PowerShell мы найдем всех отключенных пользователей,
получим список их групп, запишем их в лог, и удалим каждого пользователя со всех групп которые
не совпадают с именем группы Domain Users.
# Путь к файлу логов, не забудем создать его вручную. Не имеет смысла создавать его скриптом
$logfile = "C:\logs\user-groups-log.txt"
# Отключаем
запрос на подтверждение при удалении из групп, и вывод ошибок.
$ConfirmPreference
= "None"
$ErrorActionPreference
= "SilentlyContinue"
# Запишем
в лог время начала работы скрипта для удобства поиска по дате
Write-Output "Дата удаления: $(Get-Date -Format F)" >> $logfile
Write-Output "" >>
$logfile
# Подключаем
модуль
ActiveDirectory
Import-Module ActiveDirectory
# Находим
всех отключенных пользователей
$users = Get-ADUser -Filter 'Enabled -eq
$false'
# И для
каждого из них выполняем цыкл
foreach ($user in $users) {
# Если
пользователь состоит более чем в одной группе (чтобы не выполнять с теми, кого обработал
скрипт ранее)
if ((Get-ADPrincipalGroupMembership -Identity $user).Count -gt 1) {
# Записываем
имя и логин пользователя, а также список его групп в лог файл
Write-Output ($user.Name +" - "+ $user.samAccountName)
>> $logfile
Get-ADPrincipalGroupMembership
-Identity $user
| Format-Table
Name,distinguishedName >> $logfile
# И удаляем
его из этих групп исключая Domain Users
Remove-ADPrincipalGroupMembership -Identity $user
-MemberOf $(Get-ADPrincipalGroupMembership
-Identity $user
| Where-Object
{$_.DistinguishedName
-ne 'CN=Domain
Users,CN=Users,DC=domain,DC=test'})
}
}
# Для пользователей,
которые находятся только в одной группе
(скорее всего это Domain
Users) мы не делаем ничего. Так
же прошу обратить внимание, если у вас в домене практикуется смена групп по
умолчанию, то в скрипт стоит добавить строчку, которая изменить значение
атрибута primaryGroupID для
каждого выбранного пользователя на 513 (Domain Users). Что собственно повлияет на время
выполнения скрипта.