PC-DMIS refuses to install without a valid license in /qn mode; its BA / MSI custom actions ProcessLicensingFromBundle (which spins for ~13 minutes trying to activate against licensing.wilcoxassoc.com) and IsLicenseDateValid (which errors 1603 when no license file is present) are the gate. Bypassed by dark-extracting the chained MSIs from each Burn bundle and pre-patching both custom actions' InstallExecuteSequence.Condition columns to '0' via Windows Installer COM SQL UPDATE. The patched MSIs install cleanly with no license, PCDLRN.exe loads at runtime, hits its own runtime license check, and shows the normal "no license" dialog. Tech activates via clmadmin.exe post-imaging and PC-DMIS launches normally. - playbook/preinstall/preinstall.json: adds VC++ 2010 x64 and VC++ 2012 x64 redistributable entries scoped to all PC types. PC-DMIS links msvcr100.dll / mfc100u.dll (VS 2010) and msvcr110.dll / mfc110u.dll (VS 2012); without these the exe gets DLL_NOT_FOUND (0xC0000135) at launch. Win11 ships VC++ 2022 (covers 2015+) but not 2010/2012, so we ship these from the dark-extracted bundle payloads. Small (~13 MB combined), inert on PCs that don't need them, so the filter is "*". - playbook/shopfloor-setup/CMM/cmm-manifest.json: version 2.0. Drops the bundle EXEs, installs patched MSIs directly with properly quoted INSTALLFOLDER / APPLICATIONFOLDER paths (the earlier "hangs" were caused by Start-Process splitting unquoted paths on spaces, not actual msiexec hangs). Skips the chained CLM Tools 1.5/1.7 MSIs - CLM 1.8.73 standalone provides the same interfaces and PC-DMIS MSIs have no LaunchCondition requiring Tools 1.5 / 1.7 specifically. Keeps Protect Viewer from the 2019 R2 bundle as a separate entry. CLM 1.8 and goCMM bundles run unpatched (no install-time license check). - playbook/sync-cmm.sh: now also includes *.msi files in the upload set, not just *.exe. Known caveats: patched MSIs have HashMismatch signatures (expected - Windows Installer accepts them in /qn mode on locally-cached machines). Every Hexagon bundle version bump requires re-dark- extracting and re-patching. Unsupported by Hexagon; do not call them for install-related issues without reverting to the original bundles first. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
150 lines
9.7 KiB
JSON
150 lines
9.7 KiB
JSON
{
|
|
"Version": "1.0",
|
|
"Site": "West Jefferson",
|
|
"Applications": [
|
|
{
|
|
"Name": "Oracle Client 10.2.0.3",
|
|
"Installer": "Oracle 10.2.0.3.msi",
|
|
"Type": "MSI",
|
|
"InstallArgs": "/qn /norestart",
|
|
"DetectionMethod": "Registry",
|
|
"DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\ORACLE\\KEY_OraClientInfra10_2_0",
|
|
"DetectionName": "ORACLE_HOME_NAME",
|
|
"DetectionValue": "OraClientInfra10_2_0",
|
|
"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++ 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": "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"]
|
|
},
|
|
{
|
|
"_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"]
|
|
},
|
|
{
|
|
"_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"]
|
|
}
|
|
]
|
|
}
|