Adds a local-install pipeline so Standard shopfloor PCs get Oracle, the
VC++ redists (2008-2022), and UDC installed during PXE imaging via Samba
instead of pulling ~215 MB per device from Azure blob over the corporate
WAN. Intune DSC then verifies (already-installed apps are skipped) and
the only Azure traffic on the happy path is ~11 KB of CustomScripts
wrapper polling.
New files:
- playbook/preinstall/preinstall.json — curated app list with PCTypes
filter and per-app detection rules. Install order puts VC++ 2008
LAST so its (formerly) reboot-triggering bootstrapper doesn't kill
the runner mid-loop. (2008 itself now uses extracted vc_red.msi with
REBOOT=ReallySuppress; the reorder is defense in depth.)
- playbook/shopfloor-setup/Shopfloor/00-PreInstall-MachineApps.ps1 —
the runner. Numbered 00- so it runs first in the baseline sequence.
Reads preinstall.json, filters by PCTYPE, polls for completion via
detection check (handles UDC's hung WPF process by killing it once
detection passes), uses synchronous WriteThrough logging that
survives hard reboots, preserves log history across runs.
- playbook/shopfloor-setup/Standard/Set-MachineNumber.{ps1,bat} — desktop
helper for SupportUser. Reads current UDC + eDNC machine numbers,
prompts via VB InputBox, validates digits-only, kills running UDC,
edits both C:\ProgramData\UDC\udc_settings.json and HKLM\…\GE Aircraft
Engines\DNC\General\MachineNo, relaunches UDC. Lets a tech assign a
real machine number to a mass-produced PC without admin/LAPS.
- playbook/sync-preinstall.sh — workstation helper to push installer
binaries from /home/camp/pxe-images/main/ to the live PXE Samba.
Changes:
- playbook/startnet.cmd + startnet-template.cmd — add xcopy to stage
preinstall bundle from Y:\preinstall\ to W:\PreInstall\ during the
WinPE imaging phase, gated on PCTYPE being set.
- playbook/pxe_server_setup.yml — create /srv/samba/enrollment/preinstall
+ installers/ directories and deploy preinstall.json there.
- playbook/shopfloor-setup/Run-ShopfloorSetup.ps1 — bump AutoLogonCount
to 99 at start (defense against any installer triggering an immediate
reboot mid-dispatcher; final line still resets to 2 on successful
completion). Copy Set-MachineNumber.{ps1,bat} to SupportUser desktop
on Standard PCs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
291 lines
9.4 KiB
Batchfile
291 lines
9.4 KiB
Batchfile
@echo off
|
|
echo Please wait while 'WinPE' is being processed. This may take a few seconds.
|
|
wpeinit
|
|
powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
|
|
|
|
REM --- Wait for network (DHCP may take a moment after wpeinit) ---
|
|
echo Waiting for network...
|
|
:wait_net
|
|
ping -n 2 10.9.100.1 >NUL 2>&1
|
|
if errorlevel 1 goto wait_net
|
|
echo Network ready.
|
|
|
|
REM --- BIOS update check (runs before imaging menu) ---
|
|
set BIOS_STATUS=No BIOS check (share unavailable)
|
|
net use B: \\10.9.100.1\winpeapps\_shared /user:pxe-upload pxe /persistent:no 2>NUL
|
|
if exist B:\BIOS\check-bios.cmd (
|
|
echo.
|
|
echo Checking for BIOS updates...
|
|
call B:\BIOS\check-bios.cmd
|
|
REM If BIOS was flashed, check-bios.cmd reboots and we never reach here.
|
|
echo.
|
|
)
|
|
net use B: /delete 2>NUL
|
|
|
|
:menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo WinPE Setup Menu
|
|
echo ========================================
|
|
echo Firmware: %BIOS_STATUS%
|
|
echo.
|
|
echo Please select an option:
|
|
echo.
|
|
echo 1. GEA Standard
|
|
echo 2. GEA Engineer
|
|
echo 3. GEA Shopfloor
|
|
echo 4. GE Standard
|
|
echo 5. GE Engineer
|
|
echo 6. GE Shopfloor Lockdown
|
|
echo 7. GE Shopfloor MCE
|
|
echo.
|
|
echo ========================================
|
|
echo.
|
|
set /p choice=Enter your choice (1-7):
|
|
|
|
REM --- Only shopfloor images (3,6,7) need GCCH enrollment ---
|
|
set PPKG=
|
|
if "%choice%"=="3" goto enroll_menu
|
|
if "%choice%"=="6" goto enroll_menu
|
|
if "%choice%"=="7" goto enroll_menu
|
|
goto enroll_staged
|
|
|
|
:enroll_menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo GCCH Enrollment Profile
|
|
echo ========================================
|
|
echo.
|
|
echo 1. No Office
|
|
echo 2. Standard Office (x86)
|
|
echo 3. Standard Office (x64)
|
|
echo 4. Pro Plus Office (x86) with Access
|
|
echo 5. Pro Plus Office (x64) with Access
|
|
echo 6. Skip enrollment
|
|
echo.
|
|
set /p enroll=Enter your choice (1-6):
|
|
if "%enroll%"=="1" set PPKG=GCCH_Prod_SFLD_NoOffice_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="2" set PPKG=GCCH_Prod_SFLD_StdOffice-x86_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="3" set PPKG=GCCH_Prod_SFLD_StdOffice-x64_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="4" set PPKG=GCCH_Prod_SFLD_ProPlusOffice-x86_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="5" set PPKG=GCCH_Prod_SFLD_ProPlusOffice-x64_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="6" set PPKG=
|
|
if "%enroll%"=="" goto enroll_menu
|
|
|
|
:pctype_menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo Shopfloor PC Type
|
|
echo ========================================
|
|
echo.
|
|
echo 1. CMM
|
|
echo 2. Wax and Trace
|
|
echo 3. Keyence
|
|
echo 4. Genspect
|
|
echo 5. Display
|
|
echo 6. Standard
|
|
echo.
|
|
set PCTYPE=
|
|
set /p pctype_choice=Enter your choice (1-6):
|
|
if "%pctype_choice%"=="1" set PCTYPE=CMM
|
|
if "%pctype_choice%"=="2" set PCTYPE=WaxAndTrace
|
|
if "%pctype_choice%"=="3" set PCTYPE=Keyence
|
|
if "%pctype_choice%"=="4" set PCTYPE=Genspect
|
|
if "%pctype_choice%"=="5" set PCTYPE=Display
|
|
if "%pctype_choice%"=="6" set PCTYPE=Standard
|
|
if "%PCTYPE%"=="" goto pctype_menu
|
|
|
|
REM --- Display sub-type selection ---
|
|
set DISPLAYTYPE=
|
|
if not "%PCTYPE%"=="Display" goto skip_display_menu
|
|
:display_menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo Display Type
|
|
echo ========================================
|
|
echo.
|
|
echo 1. Lobby Display
|
|
echo 2. Dashboard
|
|
echo.
|
|
set /p display_choice=Enter your choice (1-2):
|
|
if "%display_choice%"=="1" set DISPLAYTYPE=Lobby
|
|
if "%display_choice%"=="2" set DISPLAYTYPE=Dashboard
|
|
if "%DISPLAYTYPE%"=="" goto display_menu
|
|
:skip_display_menu
|
|
|
|
REM --- Map enrollment share early (kept open for copy after imaging) ---
|
|
set NEED_ENROLL=0
|
|
if not "%PPKG%"=="" set NEED_ENROLL=1
|
|
if not "%PCTYPE%"=="" set NEED_ENROLL=1
|
|
if "%NEED_ENROLL%"=="0" goto enroll_staged
|
|
net use Y: \\10.9.100.1\enrollment /user:pxe-upload pxe /persistent:no
|
|
if "%PPKG%"=="" goto enroll_staged
|
|
if not exist "Y:\%PPKG%" (
|
|
echo WARNING: %PPKG% not found on server. Enrollment will be skipped.
|
|
set PPKG=
|
|
)
|
|
:enroll_staged
|
|
|
|
echo. > X:\Boot.tag
|
|
if "%choice%"=="1" goto gea-standard
|
|
if "%choice%"=="2" goto gea-engineer
|
|
if "%choice%"=="3" goto gea-shopfloor
|
|
if "%choice%"=="4" goto ge-standard
|
|
if "%choice%"=="5" goto ge-engineer
|
|
if "%choice%"=="6" goto ge-shopfloor-lockdown
|
|
if "%choice%"=="7" goto ge-shopfloor-mce
|
|
echo Invalid choice. Please try again.
|
|
pause
|
|
goto menu
|
|
|
|
:gea-standard
|
|
echo.
|
|
echo Starting GEA Standard setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\gea-standard /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:gea-engineer
|
|
echo.
|
|
echo Starting GEA Engineer setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\gea-engineer /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:gea-shopfloor
|
|
echo.
|
|
echo Starting GEA Shopfloor setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\gea-shopfloor /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:ge-standard
|
|
echo.
|
|
echo Starting GE Standard setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\ge-standard /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:ge-engineer
|
|
echo.
|
|
echo Starting GE Engineer setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\ge-engineer /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:ge-shopfloor-lockdown
|
|
echo.
|
|
echo Starting GE Shopfloor Lockdown setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\ge-shopfloor-lockdown /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:ge-shopfloor-mce
|
|
echo.
|
|
echo Starting GE Shopfloor MCE setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\ge-shopfloor-mce /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:end
|
|
echo.
|
|
echo Waiting for PESetup.exe to start...
|
|
:wait_start
|
|
ping -n 3 127.0.0.1 >NUL
|
|
wmic process where "name='PESetup.exe'" get name 2>NUL | find /I "PESetup" >NUL
|
|
if errorlevel 1 goto wait_start
|
|
echo PESetup.exe is running. Waiting for imaging to complete...
|
|
|
|
REM --- Copy enrollment package and shopfloor setup as soon as Windows partition appears ---
|
|
if "%PPKG%"=="" if "%PCTYPE%"=="" goto wait_finish
|
|
echo Waiting for Windows partition at W: ...
|
|
:wait_enroll
|
|
ping -n 11 127.0.0.1 >NUL
|
|
if not exist W:\Windows\System32\config\system goto wait_enroll
|
|
echo Found Windows at W:
|
|
mkdir W:\Enrollment 2>NUL
|
|
|
|
REM --- Copy PPKG if selected ---
|
|
if "%PPKG%"=="" goto copy_pctype
|
|
copy /Y "Y:\%PPKG%" "W:\Enrollment\%PPKG%"
|
|
if errorlevel 1 (
|
|
echo WARNING: Failed to copy enrollment package.
|
|
goto copy_pctype
|
|
)
|
|
copy /Y "Y:\run-enrollment.ps1" "W:\run-enrollment.ps1"
|
|
|
|
REM --- Create enroll.cmd at drive root as manual fallback ---
|
|
> W:\enroll.cmd (
|
|
echo @echo off
|
|
echo echo Waiting for network...
|
|
echo :waitnet
|
|
echo ping -n 2 8.8.8.8 ^>NUL 2^>^&1
|
|
echo if errorlevel 1 goto waitnet
|
|
echo echo Network connected. Running enrollment...
|
|
echo powershell.exe -ExecutionPolicy Bypass -File "C:\run-enrollment.ps1"
|
|
)
|
|
echo Manual fallback created at W:\enroll.cmd
|
|
|
|
:copy_pctype
|
|
REM --- Copy shopfloor PC type setup scripts ---
|
|
if "%PCTYPE%"=="" goto cleanup_enroll
|
|
echo %PCTYPE%> W:\Enrollment\pc-type.txt
|
|
if not "%DISPLAYTYPE%"=="" echo %DISPLAYTYPE%> W:\Enrollment\display-type.txt
|
|
copy /Y "Y:\shopfloor-setup\Run-ShopfloorSetup.ps1" "W:\Enrollment\Run-ShopfloorSetup.ps1"
|
|
REM --- Always copy Shopfloor baseline scripts ---
|
|
mkdir W:\Enrollment\shopfloor-setup 2>NUL
|
|
copy /Y "Y:\shopfloor-setup\backup_lockdown.bat" "W:\Enrollment\shopfloor-setup\backup_lockdown.bat"
|
|
if exist "Y:\shopfloor-setup\Shopfloor" (
|
|
mkdir W:\Enrollment\shopfloor-setup\Shopfloor 2>NUL
|
|
xcopy /E /Y /I "Y:\shopfloor-setup\Shopfloor" "W:\Enrollment\shopfloor-setup\Shopfloor\"
|
|
echo Copied Shopfloor baseline setup files.
|
|
)
|
|
REM --- Copy type-specific scripts on top of baseline ---
|
|
if exist "Y:\shopfloor-setup\%PCTYPE%" (
|
|
mkdir "W:\Enrollment\shopfloor-setup\%PCTYPE%" 2>NUL
|
|
xcopy /E /Y /I "Y:\shopfloor-setup\%PCTYPE%" "W:\Enrollment\shopfloor-setup\%PCTYPE%\"
|
|
echo Copied %PCTYPE% setup files.
|
|
) else (
|
|
echo WARNING: No setup files found for PC type %PCTYPE%.
|
|
)
|
|
|
|
REM --- Stage preinstall bundle (apps installed locally to save Azure bandwidth) ---
|
|
if exist "Y:\preinstall\preinstall.json" (
|
|
mkdir W:\PreInstall 2>NUL
|
|
mkdir W:\PreInstall\installers 2>NUL
|
|
copy /Y "Y:\preinstall\preinstall.json" "W:\PreInstall\preinstall.json"
|
|
if exist "Y:\preinstall\installers" (
|
|
xcopy /E /Y /I "Y:\preinstall\installers" "W:\PreInstall\installers\"
|
|
echo Staged preinstall bundle to W:\PreInstall.
|
|
) else (
|
|
echo WARNING: Y:\preinstall\installers not found - preinstall.json staged without installers.
|
|
)
|
|
) else (
|
|
echo No preinstall bundle on PXE server - skipping.
|
|
)
|
|
:pctype_done
|
|
|
|
:cleanup_enroll
|
|
net use Y: /delete 2>NUL
|
|
|
|
:wait_finish
|
|
ping -n 11 127.0.0.1 >NUL
|
|
wmic process where "name='PESetup.exe'" get name 2>NUL | find /I "PESetup" >NUL
|
|
if not errorlevel 1 goto wait_finish
|
|
echo.
|
|
echo Imaging complete. Rebooting in 15 seconds...
|
|
echo Press Ctrl+C to cancel.
|
|
ping -n 16 127.0.0.1 >NUL
|
|
wpeutil reboot
|