27 марта 2014

Удаление пользователей со всех групп с ведением логов при помощи PowerShell

Легенда:
Мы администратор домена 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). Что собственно повлияет на время выполнения скрипта.