Аккаунты типа Foreign Security Principals представляют собой ссылки на аккаунты, расположенные в другом домене. Такие аккаунты создаются в домене при попытке обращения к ним, и располагаются в следующем контейнере:
CN=ForeignSecurityPrincipals,DC=arasaka,DC=local
При этом, если мы добавим в какую-либо группу аккаунт из доверенного домена - в консоли AD UC мы не увидим доверенный домен. Аккаунт будет выглядеть так, словно он принадлежит текущему домену. Это происходит потому что отображается не аккаунт другого домена, а Foreign Security Principal, который создался в текущем домене.
На таком аккаунте будет красная стрелка. Пример:
Вывести пользователей из группы, содержащей в себе FSP при помощи стандартного для таких ситуаций командлета Get-AdGroupMember - не получится.
Get-ADGroupMember -identity "some_group_with_FSP" Get-ADGroupMember : Произошла неопределенная ошибка
Для вывода членов группы нам потребуется спайпить результат командлета Get-ADGroup для Get-ADObect следующим образом:
Get-ADGroup -Identity "some_group_with_FSP" -Properties Members -Server dc01.arasaka.local | Select-Object -ExpandProperty Members | Get-ADObject -Server dc01.arasaka.local | Where-Object ObjectClass -eq foreignSecurityPrincipal
В выводе данной команды мы получим DN и SID, а не Readable Names. Чтобы преобразовать данный SID в понятное имя аккаунта - нам потребуется отрезолвить данный SID в имя на контроллере домена, к которому принадлежит аккаунт, пример:
Get-ADUser -Filter { objectSID -eq "S-1-5-21-3689081546-3309677343-2398646329-32103" } -Server "dc01.arasaka.old"
Если мы хотим удалить FSP-аккаунт из группы - лучше всего опираться на DN, а не SID, пример:
Set-ADGroup -Identity $group -Remove @{member=$fsp.DistinguishedName}
Представим типичную ситуацию: есть два домена, старый (legacy) и новый. Аккаунты старого домена были скопированы при помощи ADMT с сохранением SID History и таким же логином (samAccountName).
Примечание: в этом случае аккаунты в новом домене в атрибуте AD SID History - будут содержать SID аккаунтов из старого домена.
В группах нового домена, при этом, содержатся учётные записи FSP, через которые заданы права (к примеру, на общие ресурсы).
В этом случае при декомиссии старого домена данные права пропадут (станут orphaned, их Readable Names будет невозможно получить).
Если таких групп много - лучший вариант - это скрипт, который пройдется по группам и заменит FSP-аккаунты на учётные записи нового домена на основании соответствия по samAccountName, удалив FSP из групп после замены.
$group = "some_group_with_FSP"
$server = "dc01.arasaka.local"
$members = Get-ADGroup -Identity $group -Properties Members -Server $server |
Select-Object -ExpandProperty Members |
Get-ADObject -Server $server |
Where-Object ObjectClass -eq foreignSecurityPrincipal
foreach ($fsp in $members) {
$sid = $fsp.Name
try {
$nt = (New-Object System.Security.Principal.SecurityIdentifier($sid)).
Translate([System.Security.Principal.NTAccount]).Value
# DOMAIN\username
$sam = $nt.Split('\')[1]
Write-Host "Resolved $sid -> $nt"
# ищем локального пользователя
$localUser = Get-ADUser -Filter { SamAccountName -eq $sam } -Server $server -ErrorAction SilentlyContinue
if ($localUser) {
Write-Host "Found local user: $($localUser.SamAccountName)"
# добавляем в группу
Add-ADGroupMember -Identity $group -Members $localUser -Server $server
# удаляем FSP
Set-ADGroup -Identity $group -Remove @{member=$fsp.DistinguishedName}
Write-Host "Replaced FSP with local account"
}
else {
Write-Warning "Local user NOT FOUND for $sam"
}
}
catch {
Write-Warning "Failed to resolve SID: $sid"
}
}