{
  "Version": "1.0",
  "Site": "West Jefferson",
  "Applications": [
    {
      "_comment": "Oracle Client 11.2 Administrator - installed first because downstream apps (eDNC/NTLARS/UDC and CMM tooling) link against the Oracle home and fail cold if it's missing. Installer is a .cmd wrapper (Type=EXE is the preinstall runner's shim for non-MSI launchers, same pattern as OpenText Setup-OpenText.cmd). The wrapper expects Oracle_OracleDatabase_11r2_V03.zip (686 MB) staged next to it, unpacks to %TEMP%, runs Oracle Universal Installer silently with ge_client_install.rsp, then cleans up the staging dir. OUI exit 3 is treated as success (warnings-but-ok). Detection via the registered home key; downstream upgrades or version pins are handled by the runtime enforcer's Oracle Client 11.2 manifest entry in common/manifest.json.",
      "Name": "Oracle Client 11.2",
      "Installer": "oracle\\Install-Oracle11r2.cmd",
      "Type": "EXE",
      "InstallArgs": "",
      "LogFile": "C:\\Logs\\OracleClient\\install.log",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\Oracle\\KEY_OraClient11g_home1",
      "DetectionName": "ORACLE_HOME_NAME",
      "DetectionValue": "OraClient11g_home1",
      "PCTypes": ["Standard", "CMM", "Genspect", "Keyence", "WaxAndTrace", "Display"]
    },
    {
      "_comment": "VC++ 2008 SP1 x86 - the bootstrapper (vcredist2008_x86.exe) ignores /norestart and triggers an immediate Windows reboot when files are in use (per Aaron Stebner's MSDN docs). Fix: install the extracted vc_red.msi directly with REBOOT=ReallySuppress, which IS hard-honored by Windows Installer. msiexec may return 3010 (would-have-rebooted-but-suppressed) but won't actually reboot. cab name 'vc_red.cab' is hardcoded in the MSI's Media table - do not rename.",
      "Name": "VC++ Redistributable 2008 x86",
      "Installer": "vcredist/2008/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{9BE518E6-ECC6-35A9-88E4-87755C07200F}",
      "PCTypes": ["*"]
    },
    {
      "_comment": "VC++ 2010 x86 - same fix as 2008. Bootstrapper ignores /norestart; extracted MSI with REBOOT=ReallySuppress does not.",
      "Name": "VC++ Redistributable 2010 x86",
      "Installer": "vcredist/2010/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}",
      "PCTypes": ["*"]
    },
    {
      "_comment": "VC++ 2012 x86 Minimum Runtime - extracted from vcredist2012_x86.exe Burn bundle. Same REBOOT=ReallySuppress fix.",
      "Name": "VC++ Redistributable 2012 x86 (Minimum)",
      "Installer": "vcredist/2012-min/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}",
      "PCTypes": ["*"]
    },
    {
      "Name": "VC++ Redistributable 2012 x86 (Additional)",
      "Installer": "vcredist/2012-add/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{B175520C-86A2-35A7-8619-86DC379688B9}",
      "PCTypes": ["*"]
    },
    {
      "_comment": "VC++ 2013 x86 Minimum Runtime - extracted from vcredist2013_x86.exe Burn bundle.",
      "Name": "VC++ Redistributable 2013 x86 (Minimum)",
      "Installer": "vcredist/2013-min/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{13A4EE12-23EA-3371-91EE-EFB36DDFFF3E}",
      "PCTypes": ["*"]
    },
    {
      "Name": "VC++ Redistributable 2013 x86 (Additional)",
      "Installer": "vcredist/2013-add/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F8CFEB22-A2E7-3971-9EDA-4B11EDEFC185}",
      "PCTypes": ["*"]
    },
    {
      "_comment": "VC++ 2013 x64 Minimum Runtime - required by Keyence VR-6000 Series Software. Extracted from the Keyence installer's Windows Installer cache. Same REBOOT=ReallySuppress pattern as the x86 variants.",
      "Name": "VC++ Redistributable 2013 x64 (Minimum)",
      "Installer": "vcredist/2013-x64-min/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{A749D8E6-B613-3BE3-8F5F-045C84EBA29B}",
      "PCTypes": ["*"]
    },
    {
      "_comment": "VC++ 2013 x64 Additional Runtime - required by Keyence VR-6000 Series Software. Pairs with the Minimum Runtime above.",
      "Name": "VC++ Redistributable 2013 x64 (Additional)",
      "Installer": "vcredist/2013-x64-add/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{929FBD26-9020-399B-9A7A-751D61F0B942}",
      "PCTypes": ["*"]
    },
    {
      "_comment": "VC++ 2010 x64 - required by PC-DMIS 2016/2019 R2 on CMM PCs. PCDLRN.exe links against msvcr100.dll and the VS 2010 MFC DLLs which are only provided by this redistributable. Extracted from the PC-DMIS 2016 bundle's attached container (a1 payload). Silent install: /q /norestart. Detection: Uninstall key under the native x64 hive with fixed product GUID.",
      "Name": "VC++ Redistributable 2010 x64",
      "Installer": "vcredist/2010-x64/vcredist_x64.exe",
      "Type": "EXE",
      "InstallArgs": "/q /norestart",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{1D8E6291-B0D5-35EC-8441-6616F567A0F7}",
      "DetectionName": "DisplayVersion",
      "DetectionValue": "10.0.40219",
      "PCTypes": ["*"]
    },
    {
      "_comment": "VC++ 2012 x64 - required by PC-DMIS 2016/2019 R2. Same rationale as 2010 x64; PC-DMIS links against msvcr110.dll / MFC110. Extracted from the PC-DMIS 2016 bundle's attached container (a2 payload). Detection on the Minimum Runtime GUID (the main redist wrapper installs both Minimum and Additional sub-packages).",
      "Name": "VC++ Redistributable 2012 x64",
      "Installer": "vcredist/2012-x64/vcredist_x64.exe",
      "Type": "EXE",
      "InstallArgs": "/q /norestart",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{5AF4E09F-5C9B-3AAF-B731-544D3DC821DD}",
      "DetectionName": "DisplayVersion",
      "DetectionValue": "11.0.51106",
      "PCTypes": ["*"]
    },
    {
      "_comment": "VC++ 2015-2022 x86 - extracted from vcredist2015_2017_2019_2022_x86.exe Burn bundle. The bundle contains 2022 14.44.35211 plus 8 chained KB updates for older 2015/2017/2019 releases. We install only the 2022 Min+Add MSIs - the CRT v140 ABI is shared across 2015/2017/2019/2022, so the latest pair covers all four versions on Windows 10/11.",
      "Name": "VC++ Redistributable 2022 x86 (Minimum)",
      "Installer": "vcredist/2022-min/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{922480B5-CAEB-4B1B-AAA4-9716EFDCE26B}",
      "PCTypes": ["*"]
    },
    {
      "Name": "VC++ Redistributable 2022 x86 (Additional)",
      "Installer": "vcredist/2022-add/installer.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart REBOOT=ReallySuppress NOVSUI=1 USING_EXUIH_SILENT=1",
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{C18FB403-1E88-43C8-AD8A-CED50F23DE8B}",
      "PCTypes": ["*"]
    },
    {
      "_comment": "Adobe Acrobat Reader DC - same version as GEA-Engineering image. Two-step install via Install-AcroReader.cmd wrapper: base MSI with enterprise transform (AcroRead.mst) then DC update patch (AcroRdrDCUpd2500120531.msp). Source files on PXE server at /srv/samba/winpeapps/gea-engineer/Deploy/Applications/extra/adobe/ - copy to /srv/samba/enrollment/preinstall/installers/adobe/.",
      "Name": "Adobe Acrobat Reader DC",
      "Installer": "adobe\\Install-AcroReader.cmd",
      "Type": "EXE",
      "InstallArgs": "",
      "DetectionMethod": "File",
      "DetectionPath": "C:\\Program Files (x86)\\Adobe\\Acrobat Reader DC\\Reader\\AcroRd32.exe",
      "PCTypes": ["*"]
    },
    {
      "_comment": "OpenText HostExplorer 15 SP1 ShopFloor - replaced the WJDT-built OpenText.exe Inno wrapper with our own Setup-OpenText.ps1 that does the same install steps (msiexec base + ShopFloor.mst transform + SP1 .msp patch) PLUS fans the per-user profile/keymap/menu/macro content out to Default User and every existing user profile. The Inno wrapper deployed per-user content to {userappdata} which resolves to whichever user is running the installer (SYSTEM under DSC, single user under PreInstall) so Azure-AD users never saw the profiles. Setup-OpenText.cmd is a tiny launcher that hands off to Setup-OpenText.ps1 because the runner only handles MSI/EXE types. All bundled files live in vcredist-style subtree at dependencies/opentext/ and get xcopied through WinPE staging. NO DetectionMethod here on purpose - Setup-OpenText.ps1 owns its own version check by reading version.txt next to itself and comparing to HKLM:\\SOFTWARE\\GE\\OpenText\\Installed; the runner always invokes the wrapper (cost: ~1s of PowerShell launch when up-to-date) so the version constant lives in exactly one place: dependencies/opentext/version.txt.",
      "Name": "OpenText HostExplorer ShopFloor",
      "Installer": "opentext\\Setup-OpenText.cmd",
      "Type": "EXE",
      "InstallArgs": "",
      "LogFile": "C:\\Logs\\PreInstall\\Setup-OpenText.log",
      "PCTypes": ["Standard", "CMM", "Keyence", "Genspect", "WaxAndTrace", "Lab"]
    },
    {
      "_comment": "UDC_Setup.exe spawns a hidden WPF window (UDC.exe) after install and never exits, so the runner needs KillAfterDetection: true to terminate UDC_Setup.exe + UDC.exe once the registry detection passes. This is an OPT-IN flag - normal installers should NOT set it because killing msiexec mid-install leaves msiserver holding the install mutex and the next msiexec call returns 1618 (Oracle hit this exact bug).",
      "Name": "UDC",
      "Installer": "UDC_Setup.exe",
      "Type": "EXE",
      "InstallArgs": "\"West Jefferson\" -9999",
      "KillAfterDetection": true,
      "DetectionMethod": "Registry",
      "DetectionPath": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\UDC",
      "PCTypes": ["Standard-Machine"]
    },
    {
      "_comment": "Display kiosk app (Lobby Display or Dashboard). Install-KioskApp.cmd wrapper reads C:\\Enrollment\\display-type.txt to determine which installer to run. Both GEAerospaceLobbyDisplaySetup.exe and GEAerospaceDashboardSetup.exe must be staged in the display\\ subtree alongside the wrapper. Inno Setup /VERYSILENT is idempotent so no detection needed.",
      "Name": "Display Kiosk App",
      "Installer": "display\\Install-KioskApp.cmd",
      "Type": "EXE",
      "InstallArgs": "",
      "LogFile": "C:\\Logs\\PreInstall\\Dashboard-install.log",
      "PCTypes": ["Display"]
    },
    {
      "_comment": "WJF Defect Tracker - replaces old ClickOnce deployment. MSI creates desktop + Start Menu shortcuts. Enforcer on SFLD share handles version updates post-imaging. TARGETDIR explicit because VS deployment MSI defaults to random path without it.",
      "Name": "WJF Defect Tracker",
      "Installer": "WJF_Defect_Tracker.msi",
      "Type": "MSI",
      "InstallArgs": "/qn /norestart ALLUSERS=1 REBOOT=ReallySuppress TARGETDIR=\"C:\\Program Files (x86)\\WJF_Defect_Tracker\"",
      "DetectionMethod": "File",
      "DetectionPath": "C:\\Program Files (x86)\\WJF_Defect_Tracker\\Defect_Tracker.exe",
      "PCTypes": ["*"]
    },
    {
      "_comment": "Shopfloor Standard serial-port drivers: StarTech PCIe serial adapter (MosChip-based) + Prolific PL2303 USB-to-serial. Install-Drivers.cmd runs pnputil /add-driver with /subdirs /install so every bundled INF under drivers/ lands in the Windows driver store and auto-binds to matching hardware present now or plugged in later. Scoped to Standard PCs (both Machine + Timeclock) because the PCTypes filter is type-level only; installing a serial driver on a Timeclock without the hardware is harmless - it just sits in the driver store.",
      "Name": "Shopfloor Serial Drivers",
      "Installer": "drivers\\Install-Drivers.cmd",
      "Type": "EXE",
      "InstallArgs": "",
      "LogFile": "C:\\Logs\\PreInstall\\Install-Drivers.log",
      "DetectionMethod": "File",
      "DetectionPath": "C:\\ProgramData\\PXEDrivers\\drivers-installed.marker",
      "PCTypes": ["Standard"]
    }
  ]
}
