Public/Target/Add-TargetDataAD.ps1

<#
.SYNOPSIS
Attach current Active Directory state to each source record.
 
.DESCRIPTION
For every source record, looks up the matching AD user in ADData.LookupByID by PersonID and, when
found, adds ADObject, ADCurrentUserID (ObjectGUID), ADCurrentUserEnabledStatus, and
ADCurrentGroups. Records whose PersonID matches a duplicate EmployeeID are flagged with
ADDuplicateIDStatus = 'DUPLICATE_ID'. Emits a new enriched record per input record.
 
.PARAMETER SourceData
The source records to enrich. An empty collection is allowed.
 
.PARAMETER ADData
The AD target snapshot from Get-TargetDataAD (uses its LookupByID and DuplicateUsers).
 
.OUTPUTS
[PSCustomObject] one enriched record per source record.
 
.EXAMPLE
$sourceData = Add-TargetDataAD -SourceData $sourceData -ADData $adData
 
.NOTES
   Created by: Sam Cattanach
   Modified: 2026-06-26
#>

function Add-TargetDataAD {
    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        $SourceData,

        [Parameter(Mandatory)]
        $ADData
    )

    foreach ($item in $SourceData) {
        $obj = [ordered]@{}
        foreach ($property in $item.PSObject.Properties) {
            $obj[$property.Name] = $property.Value
        }

        if ($ADData.LookupByID) {
            $adObject = $ADData.LookupByID[$item.PersonID]
            $obj["ADObject"]                   = $adObject
            $obj["ADCurrentUserID"]            = $adObject.ObjectGUID
            $obj["ADCurrentUserEnabledStatus"] = $adObject.Enabled
            $obj["ADCurrentGroups"]            = $adObject.CurrentGroups
        }
        if ($item.PersonID -in $ADData.DuplicateUsers.employeeID) {
            $obj["ADDuplicateIDStatus"] = "DUPLICATE_ID"
        }

        [PSCustomObject]$obj
    }
}