private/tests-shared/Get-UserNameFromId.ps1
|
function Get-UserNameFromId { <# .SYNOPSIS Resolves user GUIDs to display names from the database. .DESCRIPTION Takes an array of targets (GUIDs or strings) and resolves GUIDs to user display names by querying the User table in the database. .PARAMETER TargetsArray Array of target values (GUIDs or strings like 'AllUsers') .PARAMETER Database Database connection to query .EXAMPLE $resolved = Get-UserNameFromId -TargetsArray $targets -Database $db Returns an array of resolved display names .OUTPUTS Array of strings (resolved names or original values) #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string[]]$TargetsArray, [Parameter(Mandatory = $true)] $Database ) $displayArray = @() $targetMap = @{} # Use HashSet for deduplication of GUIDs to query $guidsToQuery = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) # 1. Classification & Deduplication foreach ($target in $TargetsArray) { $targetMap[$target] = $target # Default fallback $guidRef = [System.Guid]::Empty if ([System.Guid]::TryParse($target, [ref]$guidRef)) { [void]$guidsToQuery.Add($target) } } # 2. Query if ($guidsToQuery.Count -gt 0) { try { # Build IN clause for all GUIDs $guidInClause = ($guidsToQuery | ForEach-Object { "'$($_.Replace("'", "''"))'" }) -join ',' # Single query to resolve all GUIDs at once $sqlUser = "SELECT id, displayName FROM User WHERE id IN ($guidInClause)" $resolvedUsers = Invoke-DatabaseQuery -Database $Database -Sql $sqlUser # 3. Build Lookup Hash foreach ($user in $resolvedUsers) { if (-not [string]::IsNullOrEmpty($user.displayName)) { # Handle DB returning Guid objects by forcing string conversion for keys if ($user.id) { $targetMap["$($user.id)"] = $user.displayName } } } } catch { Write-PSFMessage -Level Warning -Message "Failed to resolve user GUIDs from database: $_" } } # 4. Reconstruct Output foreach ($target in $TargetsArray) { $displayArray += $targetMap[$target] } # Comma operator prevents PowerShell from unrolling single-element arrays return ,$displayArray } |