OpenText: migrate from Intune Win32 LOB to PXE PreInstall + DSC

OpenText HostExplorer ShopFloor was previously delivered as an Intune
Win32 LOB app that ran the inner OpenTextHostExplorer15x64.msi directly,
which (a) skipped the [Files] section of the WJDT-built Inno Setup
wrapper that deploys profile/keymap/menu/macro files, and (b) deployed
desktop shortcuts pointing at C:\\GE Aerospace\\Hummingbird\\ - a path
HostExplorer doesn't search, so the profile would open from the desktop
shortcut but the keymaps and macros never got picked up.

This commit moves the install to the PXE PreInstall pipeline so it
gets baked into every Standard PC during imaging instead of being
pulled per-device by Intune. The DSC side ships separately as
Setup-OpenText.ps1 + Install-OpenText.ps1 wrapper in the
pxe-images/main/ tree (uploaded to Azure Blob).

preinstall.json: new entry for OpenText pointing at
opentext\\Setup-OpenText.cmd, a tiny launcher in the bundled subtree
that hands off to Setup-OpenText.ps1 (the runner only handles MSI/EXE
types). No DetectionMethod fields - Setup-OpenText.ps1 reads version
from version.txt next to itself and short-circuits via its own
HKLM\\SOFTWARE\\GE\\OpenText\\Installed marker check, so the version
constant lives in exactly one place (version.txt). Trade-off: ~1s
PowerShell launch on every up-to-date runner pass instead of a
zero-cost registry compare, in exchange for never having to bump
the version in multiple places.

sync-preinstall.sh: added dependencies/opentext to TREE_SUBDIRS so
the whole bundle (base MSI + cab + SP1 patch + ShopFloor transform +
profile/accessories/keymap/menu/W10shortcuts content + Setup-OpenText
script and cmd wrapper + version.txt) rides through the existing tar
pipe. Also added OpenText.exe to the legacy-cleanup rm list since the
old flat machineapps/OpenText.exe path is now obsolete.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
cproudlock
2026-04-09 10:10:35 -04:00
parent b4dd8a4197
commit a363fa31c0
2 changed files with 21 additions and 0 deletions

View File

@@ -90,6 +90,14 @@
"DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{C18FB403-1E88-43C8-AD8A-CED50F23DE8B}", "DetectionPath": "HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{C18FB403-1E88-43C8-AD8A-CED50F23DE8B}",
"PCTypes": ["*"] "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": "",
"PCTypes": ["Standard"]
},
{ {
"Name": "UDC", "Name": "UDC",
"Installer": "UDC_Setup.exe", "Installer": "UDC_Setup.exe",

View File

@@ -31,13 +31,22 @@ REMOTE_INSTALLERS="$REMOTE_DIR/installers"
REMOTE_TEMP="/tmp/preinstall-stage" REMOTE_TEMP="/tmp/preinstall-stage"
# Subtrees copied recursively into installers/, preserving directory structure. # Subtrees copied recursively into installers/, preserving directory structure.
#
# vcredist/ holds per-version MSI+CAB pairs (one subdir per version) extracted from # vcredist/ holds per-version MSI+CAB pairs (one subdir per version) extracted from
# the Microsoft bootstrappers. The bootstrappers ignore /norestart and trigger # the Microsoft bootstrappers. The bootstrappers ignore /norestart and trigger
# immediate Windows reboots; the extracted MSIs honor REBOOT=ReallySuppress and do # immediate Windows reboots; the extracted MSIs honor REBOOT=ReallySuppress and do
# not. Each MSI's CAB filename ('vc_red.cab' for 2008/2010, 'cab1.cab' for the rest) # not. Each MSI's CAB filename ('vc_red.cab' for 2008/2010, 'cab1.cab' for the rest)
# is hardcoded in the MSI's Media table - do not rename. # is hardcoded in the MSI's Media table - do not rename.
#
# opentext/ holds the OpenText HostExplorer 15 SP1 install bundle (base MSI + cab,
# ShopFloor.mst transform, SP1 .msp patch, plus the Profile/Accessories/HostExplorer/
# W10shortcuts content trees and Setup-OpenText.ps1/.cmd). Setup-OpenText.ps1 runs
# msiexec, applies SP1, then deploys profile content into ProgramData\Shared,
# Default User, and every existing user profile. The .cmd wrapper exists so the
# preinstall.json runner (which only knows MSI/EXE types) can launch it.
TREE_SUBDIRS=( TREE_SUBDIRS=(
"dependencies/vcredist" "dependencies/vcredist"
"dependencies/opentext"
) )
# Individual files copied flat (basename only) into installers/. # Individual files copied flat (basename only) into installers/.
@@ -156,6 +165,10 @@ rm -f "$REMOTE_INSTALLERS/vc_red.msi" \
"$REMOTE_INSTALLERS/vcredist2013_x86.exe" \ "$REMOTE_INSTALLERS/vcredist2013_x86.exe" \
"$REMOTE_INSTALLERS/vcredist2015_2017_2019_2022_x86.exe" "$REMOTE_INSTALLERS/vcredist2015_2017_2019_2022_x86.exe"
# Remove legacy flat OpenText.exe (Inno wrapper, replaced by dependencies/opentext/
# subtree + Setup-OpenText.ps1).
rm -f "$REMOTE_INSTALLERS/OpenText.exe"
# Extract tree tarball into installers/ (preserves subdirs) # Extract tree tarball into installers/ (preserves subdirs)
tar xf "$REMOTE_TEMP/trees.tar" -C "$REMOTE_INSTALLERS/" tar xf "$REMOTE_TEMP/trees.tar" -C "$REMOTE_INSTALLERS/"