===== FSP-аккаунты =====
Аккаунты типа //Foreign Security Principals// представляют собой ссылки на аккаунты, расположенные в другом домене. Такие аккаунты создаются в домене при попытке обращения к ним, и располагаются в следующем контейнере:
CN=ForeignSecurityPrincipals,DC=arasaka,DC=local
При этом, если мы добавим в какую-либо группу аккаунт из доверенного домена - в консоли //AD UC// мы не увидим доверенный домен. Аккаунт будет выглядеть так, словно он принадлежит текущему домену. Это происходит потому что отображается не аккаунт другого домена, а //Foreign Security Principal//, который создался в текущем домене.
На таком аккаунте будет красная стрелка. Пример:
;#;
{{::ad_fsp_example.jpg|}}
;#;
==== Работа с группами, содержащими в себе FSP ====
Вывести пользователей из группы, содержащей в себе 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}
==== Скрипт замены FSP на аккаунты актуального домена ====
Представим типичную ситуацию: есть два домена, старый (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"
}
}
{{tag>ActiveDirectory ADMT PowerShell}}