Подробный гайд по управлению SID History групп в Active Directory через PowerShell
Управление атрибутом SID History (история идентификаторов безопасности) для групп в Active Directory — это критически важный процесс при миграции между доменами или лесами. Он позволяет новой (мигрированной) группе получать доступ к ресурсам, в списках контроля доступа (ACL) которых указан SID старой группы.
Важное предупреждение о безопасности
Ручное изменение sIDHistory потенциально опасно. Злоумышленник (или администратор по ошибке) может добавить SID группы «Администраторы домена» (Domain Admins) в рядовую группу пользователей, что приведет к неявному повышению привилегий.
- Используйте этот метод только в рамках контролируемой миграции.
- В промышленных сценариях миграции лучше использовать ADMT (Active Directory Migration Tool), который управляет историей SID автоматически.
1. Подготовка и проверка прав
Для выполнения команд вам потребуются:
- Установленный модуль
ActiveDirectory(компоненты RSAT на клиентской машине или запуск на контроллере домена). - Права уровня Администраторы домена (Domain Admins) или Администраторы предприятия (Enterprise Admins) в целевом домене (где находится новая группа).
Откройте PowerShell от имени администратора и импортируйте модуль:
Import-Module ActiveDirectory
2. Просмотр текущего значения SID History у группы
Чтобы узнать, есть ли уже у группы записи в истории, используйте Get-ADGroup. Атрибут sIDHistory не входит в набор свойств по умолчанию, поэтому его нужно запрашивать явно через -Properties.
Get-ADGroup -Identity "Имя_Группы" -Properties sIDHistory | Select-Object Name, ObjectSID, sIDHistory
Пример вывода:
Name ObjectSID sIDHistory
---- --------- ----------
IT-Admins S-1-5-21-111111111-222222222-333333333-1105 {S-1-5-21-999999999-888888888-777777777-512}
3. Добавление SID в историю (Метод через Set-ADGroup)
Начиная с Windows Server 2012, командлет Set-ADGroup поддерживает параметр -SIDHistory.
Добавление одного старого SID:
Set-ADGroup -Identity "New_Domain_Group" -SIDHistory @{Add="S-1-5-21-OLD-DOMAIN-SID-1234"}
Добавление нескольких SID одновременно:
Если группе нужно передать историю нескольких старых групп, передайте массив:
$oldSIDs = @("S-1-5-21-OLD-1111", "S-1-5-21-OLD-2222")
Set-ADGroup -Identity "New_Domain_Group" -SIDHistory @{Add=$oldSIDs}
4. Удаление и очистка SID History
Удаление конкретного SID из истории:
Если в историю попал неверный SID, его можно точечно удалить:
Set-ADGroup -Identity "New_Domain_Group" -SIDHistory @{Remove="S-1-5-21-OLD-DOMAIN-SID-1234"}
Полная очистка истории (сброс атрибута):
Если нужно полностью удалить все старые SID у группы (например, после успешного завершения миграции и перенастройки прав на ресурсы):
Set-ADGroup -Identity "New_Domain_Group" -Clear "sIDHistory"
Или через обнуление значения:
Set-ADGroup -Identity "New_Domain_Group" -SIDHistory $null
5. Массовое добавление (Скрипт для миграции)
Обычно группы мигрируются пачками. Удобно подготовить CSV-файл.
Формат файла C:\Migration\groups_sid.csv:
GroupName,OldSID
"IT-Support","S-1-5-21-111111111-222222222-333333333-1001"
"HR-Managers","S-1-5-21-111111111-222222222-333333333-1002"
PowerShell-скрипт с обработкой ошибок:
$csvPath = "C:\Migration\groups_sid.csv"
$groups = Import-Csv -Path $csvPath -Encoding UTF8
foreach ($group in $groups) {
try {
# Проверяем, существует ли группа
$adGroup = Get-ADGroup -Identity $group.GroupName -ErrorAction Stop
# Добавляем SID History
Set-ADGroup -Identity $adGroup -SIDHistory @{Add=$group.OldSID} -ErrorAction Stop
Write-Host "[SUCCESS] SID History добавлен для группы: $($group.GroupName)" -ForegroundColor Green
}
catch {
Write-Warning "[ERROR] Не удалось обновить группу '$($group.GroupName)': $($_.Exception.Message)"
}
}
6. Альтернативный метод (через Set-ADObject)
Иногда командлет Set-ADGroup может выдавать ошибки из-за особенностей схемы или версий модуля. В таком случае универсальным является использование низкоуровневого Set-ADObject или прямого редактирования атрибута.
$groupDN = (Get-ADGroup "New_Domain_Group").DistinguishedName
$oldSID = "S-1-5-21-OLD-DOMAIN-SID-1234"
Set-ADObject -Identity $groupDN -Add @{sIDHistory=$oldSID}
Для удаления:
Set-ADObject -Identity $groupDN -Remove @{sIDHistory=$oldSID}
7. Частые ошибки и их решения (Troubleshooting)
Ошибка: The server is unwilling to process the request или Access Denied
* Причина 1 (Кросс-доменная миграция):
Если вы пытаетесь добавить SID из другого домена/леса, целевой домен должен доверять исходному, а фильтрация истории SID (SID Filtering) должна быть отключена.
Решение:
Проверьте настройки доверия.
В некоторых случаях требуется отключить изоляцию карантинного домена:
# Выполняется для доверия между доменами (пример для netdom)
netdom trust TargetDomain /domain:SourceDomain /quarantine:no
* Причина 2 (Недостаточно прав):
Учетная запись не входит в группу Domain Admins целевого домена.
Ошибка: The attribute value already exists
- Причина: Указанный SID уже находится в атрибуте
sIDHistoryданной группы. - Решение: Сначала выполните
Get-ADGroup -Properties sIDHistoryи убедитесь, что значения там нет.
Ошибка: the directory service cannot perform the requested operation on the rdnc или невалидный SID
- Причина: Вы пытаетесь добавить SID группы, которая находится в том же самом домене, что и целевая группа. Windows Server защищает от создания "петель" (циклических ссылок) внутри одного домена. Атрибут
sIDHistoryисторически предназначен для хранения SID из других доменов.
Важно
Используйте конструкцию Set-ADGroup -SIDHistory @{Add="<старый_SID>"} для точечных задач и циклы с Set-ADObject или Set-ADGroup при массовых миграциях, обязательно проверяя наличие прав администратора домена и корректность настроек доверия (если домены разные).
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.