Root cause found via decompiling UDC_Setup.exe: it never writes udc_settings.json from CLI args. Instead it pulls Settings_Backups\udc_settings_<num>.json from \\tsgwp00525\shared\SPC\UDC -- which is unreachable at imaging time (no SFLD creds yet). Silent File.Exists() false, settings never copy, UDC lands on Evendale defaults. Fix: stage 80 udc_settings_*.json backups under shopfloor-setup/Standard/udc-backups/ (same tree as ntlars-backups, xcopy'd to C:\Enrollment\ by existing startnet.cmd). 00-PreInstall pre-creates C:\ProgramData\UDC\udc_settings.json from the matching backup BEFORE UDC_Setup.exe runs. Installer's server-side copy silently fails (unreachable), our pre-staged file survives. Also: - preinstall.json UDC InstallArgs corrected: "West Jefferson" -9999 (quoted spaced site + dash-prefixed number, confirmed via decompile) - Update-MachineNumber.ps1 UDC.exe relaunch: quoted site + dash number - Monitor-IntuneProgress: action prompts (Select Device Category after Phase 1; Initiate ARTS Lockdown after Phase 5/creds), Display flow (3-phase: Registration -> Config -> Lockdown), Phase 6 IME-based lockdown detection Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
142 lines
5.3 KiB
PowerShell
142 lines
5.3 KiB
PowerShell
# Update-MachineNumber.ps1 - Shared helper for reading and updating the
|
|
# machine number in UDC and eDNC. Dot-source from any script that needs
|
|
# machine-number operations:
|
|
#
|
|
# . "$PSScriptRoot\lib\Update-MachineNumber.ps1" (from Shopfloor\ scripts)
|
|
# . "$PSScriptRoot\..\Shopfloor\lib\Update-MachineNumber.ps1" (from Standard\ scripts)
|
|
# . "$PSScriptRoot\Update-MachineNumber.ps1" (from lib\ scripts)
|
|
#
|
|
# Exported functions:
|
|
# Get-CurrentMachineNumber - returns @{ Udc = $string_or_null; Ednc = $string_or_null }
|
|
# Update-MachineNumber - updates both, returns @{ UdcUpdated = $bool; EdncUpdated = $bool; Errors = @() }
|
|
#
|
|
# Both handle missing files/keys gracefully (app not installed = skip, not error).
|
|
|
|
$script:UdcSettingsPath = 'C:\ProgramData\UDC\udc_settings.json'
|
|
$script:UdcExePath = 'C:\Program Files\UDC\UDC.exe'
|
|
$script:EdncRegPath = 'HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines\DNC\General'
|
|
|
|
function Get-CurrentMachineNumber {
|
|
<#
|
|
.SYNOPSIS
|
|
Reads the current machine number from UDC settings JSON and eDNC registry.
|
|
.OUTPUTS
|
|
Hashtable with keys Udc ($string or $null) and Ednc ($string or $null).
|
|
#>
|
|
$result = @{ Udc = $null; Ednc = $null }
|
|
|
|
if (Test-Path $script:UdcSettingsPath) {
|
|
try {
|
|
$json = Get-Content $script:UdcSettingsPath -Raw | ConvertFrom-Json
|
|
$result.Udc = $json.GeneralSettings.MachineNumber
|
|
} catch {}
|
|
}
|
|
|
|
if (Test-Path $script:EdncRegPath) {
|
|
try {
|
|
$result.Ednc = (Get-ItemProperty -Path $script:EdncRegPath -Name MachineNo -ErrorAction Stop).MachineNo
|
|
} catch {}
|
|
}
|
|
|
|
return $result
|
|
}
|
|
|
|
function Update-MachineNumber {
|
|
<#
|
|
.SYNOPSIS
|
|
Updates UDC + eDNC machine number in one step. Stops UDC before writing,
|
|
relaunches after.
|
|
.PARAMETER NewNumber
|
|
The new machine number (digits only - caller validates).
|
|
.PARAMETER Site
|
|
Site name passed to UDC.exe -site argument. Defaults to 'West Jefferson'.
|
|
.OUTPUTS
|
|
Hashtable: @{ UdcUpdated = $bool; EdncUpdated = $bool; Errors = @() }
|
|
#>
|
|
param(
|
|
[Parameter(Mandatory)]
|
|
[string]$NewNumber,
|
|
|
|
[string]$Site = 'West Jefferson'
|
|
)
|
|
|
|
$out = @{ UdcUpdated = $false; EdncUpdated = $false; Errors = @(); RegImported = $null }
|
|
|
|
# --- If UDC or eDNC is still at placeholder 9999, try to pull the
|
|
# per-machine .reg backup from the SFLD share and restore all
|
|
# the eFocas/PPDCS/Hssb config. The tech-typed $NewNumber is still
|
|
# written last (below), so the restore never clobbers it. ---
|
|
$current = Get-CurrentMachineNumber
|
|
$isPlaceholder = (($current.Udc -in @('9999', $null, '')) -or ($current.Ednc -in @('9999', $null, '')))
|
|
|
|
if ($isPlaceholder -and $NewNumber -ne '9999') {
|
|
$sharePath = $null
|
|
$siteCfgPath = 'C:\Enrollment\site-config.json'
|
|
if (Test-Path $siteCfgPath) {
|
|
try {
|
|
$cfg = Get-Content $siteCfgPath -Raw | ConvertFrom-Json
|
|
$sharePath = $cfg.pcProfiles.'Standard-Machine'.ntlarsBackupSharePath
|
|
} catch {}
|
|
}
|
|
|
|
if ($sharePath) {
|
|
try {
|
|
. (Join-Path $PSScriptRoot 'Restore-EDncReg.ps1')
|
|
$mounted = Mount-SFLDShare -SharePath $sharePath -DriveLetter 'V:'
|
|
if ($mounted) {
|
|
try {
|
|
$out.RegImported = Import-EDncRegBackup -SourceRoot 'V:\' -MachineNumber $NewNumber
|
|
} finally {
|
|
& net use V: /delete /y 2>$null | Out-Null
|
|
}
|
|
} else {
|
|
Write-Host " Update-MachineNumber: SFLD share unreachable - skipping restore."
|
|
}
|
|
} catch {
|
|
$out.Errors += "ntlars restore failed: $_"
|
|
}
|
|
}
|
|
}
|
|
|
|
# --- Stop UDC before editing its JSON (avoid stale shutdown write) ---
|
|
Get-Process UDC -ErrorAction SilentlyContinue | ForEach-Object {
|
|
try { $_.Kill(); $_.WaitForExit(5000) | Out-Null } catch {}
|
|
}
|
|
Start-Sleep -Seconds 1
|
|
|
|
# --- Update UDC settings JSON ---
|
|
if (Test-Path $script:UdcSettingsPath) {
|
|
try {
|
|
$json = Get-Content $script:UdcSettingsPath -Raw | ConvertFrom-Json
|
|
$json.GeneralSettings.MachineNumber = $NewNumber
|
|
$json | ConvertTo-Json -Depth 99 | Set-Content -Path $script:UdcSettingsPath -Encoding UTF8
|
|
$out.UdcUpdated = $true
|
|
} catch {
|
|
$out.Errors += "UDC update failed: $_"
|
|
}
|
|
}
|
|
|
|
# --- Update eDNC registry ---
|
|
if (Test-Path $script:EdncRegPath) {
|
|
try {
|
|
Set-ItemProperty -Path $script:EdncRegPath -Name MachineNo -Value $NewNumber -Type String -Force
|
|
$out.EdncUpdated = $true
|
|
} catch {
|
|
$out.Errors += "eDNC update failed: $_"
|
|
}
|
|
}
|
|
|
|
# --- Relaunch UDC with new args ---
|
|
if ((Test-Path $script:UdcExePath) -and $out.UdcUpdated) {
|
|
try {
|
|
# UDC.exe arg signature: quoted site name (with space), then
|
|
# dash-prefixed machine number. Example: UDC.exe "West Jefferson" -7605
|
|
Start-Process -FilePath $script:UdcExePath -ArgumentList @("`"$Site`"", "-$NewNumber")
|
|
} catch {
|
|
$out.Errors += "UDC relaunch failed: $_"
|
|
}
|
|
}
|
|
|
|
return $out
|
|
}
|