The Magician

FSP-аккаунты

Аккаунты типа Foreign Security Principals представляют собой ссылки на аккаунты, расположенные в другом домене. Такие аккаунты создаются в домене при попытке обращения к ним, и располагаются в следующем контейнере:

CN=ForeignSecurityPrincipals,DC=arasaka,DC=local

При этом, если мы добавим в какую-либо группу аккаунт из доверенного домена - в консоли AD UC мы не увидим доверенный домен. Аккаунт будет выглядеть так, словно он принадлежит текущему домену. Это происходит потому что отображается не аккаунт другого домена, а Foreign Security Principal, который создался в текущем домене.

На таком аккаунте будет красная стрелка. Пример:

Работа с группами, содержащими в себе 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"
    }
}
fsp-аккаунты.txt · Last modified: by jp