ConfigMgr: JRE 8u66 verteilen

Seit längerem stört es mich, dass man für die JRE Verteilung immer noch das MSI File extrahieren muss. Das macht den Sinn vom AutomaticAppDeployment kaputt, da mehr manuelle Schritte notwendig sind.

Ursache dafür ist ein alter Bug im Oracle JRE Setup, der Probleme mit der Installation im SYSTEM Kontext von 32bit Java unter x64 Betriebssystemen hat. Der Bug ist u.a. hier dokumentiert: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7014194

Angeblich ist der Fehler bereits in 8u51 behoben. Meine Realität sieht aber anders aus.

Ein guter Workaround ist in folgendem Technet Thread beschrieben:

https://social.technet.microsoft.com/Forums/de-DE/8dc5f284-a9a1-409b-8656-87e265ae652c/problem-with-java-18-update-31-deployment?forum=configmanagerapps

Diese Hardlinks im Dateisystem habe ich in dem nachfolgenden applicationDeployment Script genutzt (basierende auf dem Powershell Code von hier https://gallery.technet.microsoft.com/scriptcenter/New-SymLink-60d2531e)

Dadurch kann direkt die EXE installiert werden.

<appdefinition>
<file>jre-8u66-windows-i586.exe</file>
<hash type="SHA256">67C9594D2A51D6B1B52CC57CD7E1B320B491207C3680F811354185B71ED4D832</hash>
<info>
    <setupType>InnoSetup</setupType>
    <isX86>true</isX86>
    <company>Oracle Corporation</company>
    <productName>Java 8 Update 66</productName>
    <msiProductCode>{26A24AE4-039D-4CA4-87B4-2F83218066F0}</msiProductCode>
</info>
<install>
Show-InstallationProgress -StatusMessage 'Installing Java JRE. This may take some time. Please wait...'
if ($is64Bit) {
    $path=join-path $envWinDir "\System32\config\systemprofile\AppData\LocalLow\Oracle"
    $symName=join-path $envWinDir "SysWOW64\config\systemprofile\AppData\LocalLow\Oracle"
    if  (Test-Path $symname) {
        remove-Item -Recurse -Path $symName
    }
    if (-not (Test-Path $path)) {
        new-item -ItemType Directory -Path $path
    }
    #Quelle: https://gallery.technet.microsoft.com/scriptcenter/New-SymLink-60d2531e
            Try {
                $null = [mklink.symlink]
            } Catch {
                Add-Type @"
                using System;
                using System.Runtime.InteropServices;
     
                namespace mklink
                {
                    public class symlink
                    {
                        [DllImport("kernel32.dll")]
                        public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags);
                    }
                }
"@
            }
                Try {
                    $return = [mklink.symlink]::CreateSymbolicLink($SymName,$Path,1)
                } Catch {
                }
}

Execute-Process -Path "jre-8u66-windows-i586.exe" -Parameters "/s INSTALL_SILENT=Enable AUTO_UPDATE=Disable WEB_JAVA=Disable WEB_ANALYTICS=Disable REBOOT=Disable NOSTARTMENU=Enable SPONSORS=Disable" -WindowStyle Hidden
</install>
<uninstall>
Execute-MSI -Action Uninstall -Path "{26A24AE4-039D-4CA4-87B4-2F83218066F0}"
</uninstall>
<detection>
if ([IntPtr]::Size -eq 8) {$regPath="HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"} else { $regPath="HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"}
Get-ItemProperty $regPath | where {$_.psChildname -like "{26A24AE4-039D-4CA4-87B4-2F83218066F0}" -and $_.DisplayVersion -eq "8.0.660.18" -and $_.WindowsInstaller -eq 1}
</detection>
</appdefinition>
This entry was posted in Configuration Manager, System Center and tagged , , , , , . Bookmark the permalink.

Leave a Reply