ConfigMgr: System Center 2012 R2 Operations Manager Console
Auch wenn bereits der OpsMgr 2016 verfügbar ist, möchte eventuell der ein oder andere noch die alte Konsole verteilen. Als Voraussetzung benötigt diese den Report Viewer 2012 und ein aktuelle .Net Framework. Beide sind entsprechend verlinkt.
<appdefinition>
<file>setup.exe</file>
<hash type="SHA256">E95135DD934B1DF1B9396CB86FA4E79F4C84B311825AD8ABED3F4CA2DE5C1CCE</hash>
<info>
<company>Microsoft Corporation</company>
<productName>System Center 2012 R2 Operations Manager Console</productName>
<setupType>NSIS</setupType>
<isX86>false</isX86>
<hasUninstall>true</hasUninstall>
</info>
<install>
Show-InstallationProgress -StatusMessage "Installing $appName . This may take some time. Please wait..."
Execute-Process -Path "setup.exe" -Parameters "/silent /install /components:OMConsole /EnableErrorReporting:Never /SendCEIPReports:0 /UseMicrosoftUpdate:1 /AcceptendUserLicenseAgreement:1"
</install>
<uninstall>
Show-InstallationProgress -StatusMessage "DeInstalling $appName . This may take some time. Please wait..."
Execute-MSI -Action Uninstall -Path "{041C3416-87CE-4B02-918E-6FDC95F241D3}"
</uninstall>
<detection>
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | where {$_.psChildname -like "{041C3416-87CE-4B02-918E-6FDC95F241D3}" -and $_.WindowsInstaller -eq 1}
</detection>
<supersedence/>
<dependency>
<dependencyGroup name="DOTNET">
<application autoInstall="true" type="SHA256">BEAA901E07347D056EFE04E8961D5546C7518FAB9246892178505A7BA631C301</application>
</dependencyGroup>
<dependencyGroup name="ReportViewer2012">
<application autoInstall="true" type="SHA256">ECCBBF99C7174E2B23C4398077C0757D1EA8A5C18D68B18A5A391DE985696A90</application>
</dependencyGroup>
</dependency>
</appdefinition>
ConfigMgr: Report Viewer 2012
Der etwas aktuellere Report Viewer 2012 benötigt als Vorbedingung die SQL 2012 Befehlszeilenprogramme, die entsprechend als Abhängigkeit hinterlegt sind:
<appdefinition> <file>ReportViewer.msi</file> <hash type="SHA256">ECCBBF99C7174E2B23C4398077C0757D1EA8A5C18D68B18A5A391DE985696A90</hash> <info> <setupType>MSI</setupType> <isX86>true</isX86> </info> <install/> <uninstall/> <detection/> <supersedence/> <dependency> <dependencyGroup name="SQL"> <application autoInstall="true" type="SHA256">674C396E9C9BF389DD21CEC0780B3B4C808FF50C570FA927B07FA620DB7D4537</application> </dependencyGroup> </dependency> </appdefinition>
ConfigMgr: SQl Server 2012 Befehlszeilenprogramme
Das SQL Server 2012 SP1 Befehlszeilenprogramme ist Voraussetzung für den Report Viewer 2012 und kann mit nachfolgendem Script schnell angelegt werden.
<appdefinition> <file>SQLSysClrTypes.msi</file> <hash type="SHA256">674C396E9C9BF389DD21CEC0780B3B4C808FF50C570FA927B07FA620DB7D4537</hash> <info> <setupType>MSI</setupType> <isX86>false</isX86> </info> <install/> <uninstall/> <detection/> <dependency/> <supersedence> <!--<deploymentType uninstall="false" type="SHA256">251635687D847E74AD07676C0E4EEA8D95EFC7763B9B6BA74803D92A0C5C3CF4</deploymentType>--> </supersedence> </appdefinition>
ConfigMgr: ReportViewer 2010
Auch wenn der Report Viewer 2010 schon ziemlich alt ist, wird er teilweise noch bei manchen Konsolen benötigt. Daher hier als Prerequest das Programm:
<appdefinition>
<file>ReportViewer.exe</file>
<hash type="SHA256">E8FF182E202B321AC2B9245EE20C4EB659008FFB2A34CDBD3486F9DA3D4C3E06</hash>
<info>
<company>Microsoft Corporation</company>
<setupType>NSIS</setupType>
<isX86>true</isX86>
<hasUninstall>true</hasUninstall>
</info>
<install>
Show-InstallationProgress -StatusMessage "Installing $appName . This may take some time. Please wait..."
Execute-Process -Path "ReportViewer.exe" -Parameters "/q /c:`"install.exe /q`""
</install>
<uninstall>
Show-InstallationProgress -StatusMessage "Uninstalling $appName. This may take some time. Please wait..."
Execute-MSI -Action Uninstall -Path "{C19B3EB6-B54C-3204-A4DF-88432E0C79F7}"
</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 "{C19B3EB6-B54C-3204-A4DF-88432E0C79F7}" -and $_.WindowsInstaller -eq 1}
</detection>
<dependency/>
<supersedence/>
</appdefinition>
ConfigMgr: .Net 3.5 für Windows 2012 R2 verteilen
Anbei ein kleines Script, um für Windows 2012 R2 das .Net Framework 2-3.5 nachzuinstallieren. Dafür ist der SXS von der Installations-CD notwendig. Dafür wird die OS Language ausgelesen und verwendet, um das passende SXS Verzeichnis zu verwenden.
Somit legt man für jede notwendige Betriebssystemsprache ein Unterordner mit Namen des Laguage Codes (1031 für deutsch, 1033 für englisch, …) an und kopiert den Inhalt des jeweiligen SXS Ordners dort hinein.
Als Vergleichsfile habe ich willkürlich das microsoft.build.tasks.v3.5.dll genommen. Dies ist aber in diesem Fall nicht weiter relevant.
(Anmerkung: Ich habe den Produktnamen bewusst gekürzt, da es sonst bei den SXS Ordner beim Kopieren in die Zielordner zu Dateilängen über 256 Zeichen komme und das normale Powershell Kopierkommando damit nicht zurecht kommt)
ConfigMgr: .Net 4.6.1 mit KB3102436 verteilen
Anbei das Script für das .Net Framework 4.6.1. Heruntergeladen werden kann der Offline-Installer unter https://www.microsoft.com/en-US/download/details.aspx?id=49982.
<appdefinition>
<file>NDP461-KB3102436-x86-x64-AllOS-ENU.exe</file>
<hash type="SHA256">BEAA901E07347D056EFE04E8961D5546C7518FAB9246892178505A7BA631C301</hash>
<info>
<company>Microsoft Corporation</company>
<setupType>NSIS</setupType>
<isX86>false</isX86>
<hasUninstall>true</hasUninstall>
</info>
<install>
Show-InstallationProgress -StatusMessage "Installing $appName . This may take some time. Please wait..."
Execute-Process -Path "NDP461-KB3102436-x86-x64-AllOS-ENU.exe" -Parameters "/q /norestart"
</install>
<uninstall>
Show-InstallationProgress -StatusMessage "Uninstalling $appName. This may take some time. Please wait..."
Execute-Process -Path "NDP461-KB3102436-x86-x64-AllOS-ENU.exe" -Parameters "/uninstall /x86 /x64 /q /norestart"
</uninstall>
<detection>
$regPath="HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\*"
Get-ItemProperty $regPath | where {$_.Release -gt 393297}
</detection>
<supersedence>
</supersedence>
</appdefinition>
Adobe Reader Build 30201
Auch der Acrobat Reader in der 2015 Version (nicht die “Cloud” Variante DC) wurde auf Build 30201 aktualisiert. Dafür stellt Adobe eine passende Patch-Datei (MSP) bereit. Dieses Verteilscript setzt somit auf die vollständige Version von Adobe Reader 2015 auf (=dependency),
<appdefinition>
<file>AcroRdr2015Upd1500630201_MUI.msp</file>
<hash type="SHA256">A7E71B976CD51C9A92F481BD4BCF8DD12260E522D8858C46B990BA50F56427A8</hash>
<info fromFile="true">
<company>Adobe Systems Incorporated</company>
<productName>Adobe Reader 2015</productName>
<productVersion>15.006.30201</productVersion>
<setupType>MSP</setupType>
<isX86>true</isX86>
</info>
<install fromSetupType="false">
Execute-MSI -Action Patch -Path "AcroRdr2015Upd1500630201_MUI.msp" -Parameters "REBOOT=ReallySuppress /qn"
#disable arm
$regPrefix="HKEY_LOCAL_MACHINE\SOFTWARE\"
if ($is64Bit) {
$regPrefix="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\"
}
set-registryKey -Key ($regPrefix+"Adobe\Adobe ARM\1.0\ARM") -Name "iCheckReader" -value 0 -Type "DWord"
#remove run key
$runKey="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
$run=Get-Item $runKey
$runValue="Adobe ARM"
if ($run.GetValue($runValue,$null)) {
remove-itemProperty -Path $runKey -Name $runValue
}
if ($is64Bit) {
$runKey="HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"
$run=Get-Item $runKey
if ($run.GetValue($runValue,$null)) {
remove-itemProperty -Path $runKey -Name $runValue
}
}
#disable online features
#http://www.adobe.com/devnet-docs/acrobatetk/tools/PrefRef/Windows/FeatureLockdown.html
#new: http://www.adobe.com/devnet-docs/acrobatetk/tools/AdminGuide/services.html
$regPath=($regPrefix+"Policies\Adobe\Acrobat Reader\2015\FeatureLockDown")
set-registryKey -Key $regPath -Name "bUsageMeasurement" -value 0 -Type "DWord"
set-registryKey -Key $regPath -Name "bShowEbookMenu" -value 0 -Type "DWord"
set-registryKey -Key $regPath -Name "bShowEbookMenu" -value 0 -Type "DWord"
set-registryKey -Key $regPath -Name "bCommercialPDF" -value 0 -Type "DWord"
set-registryKey -Key $regPath -Name "bUpdater" -value 0 -Type "DWord"
set-registryKey -Key $regPath -Name "bCreatePDFOnline" -value 0 -Type "DWord"
set-registryKey -Key $regPath -Name "bPurchaseAcro" -value 0 -Type "DWord"
#Specifies whether to show the menu item that opens the online Actions file library.
set-registryKey -Key $regPath -Name "bFindMoreWorkflowsOnline" -value 0 -Type "DWord"
#Specifies whether to show the menu item that opens the online Acrobat Tool Set Exchange.
set-registryKey -Key $regPath -Name "bFindMoreCustomizationsOnline" -value 0 -Type "DWord"
#This bEnableAcrobatHS service master switch disables all features of the Fill and Sign Pane except for the Work with Certificates accordion. When forms are opened, the Fill and Sign Pane does not auto open.
set-registryKey -Key $regPath -Name "bEnableAcrobatHS" -value 0 -Type "DWord"
#Don't allow file storage on Acrobat.com.
set-registryKey -Key ($regPath+"\cCloud") -Name "bDisableADCFileStore" -value 1 -Type "DWord"
#disable protected mode...
set-registryKey -Key $regPath -Name "bProtectedMode" -value 0 -Type "DWord"
</install>
<uninstall/>
<detection/>
<dependency>
<dependencyGroup name="Acrobat Reader 2015">
<application autoInstall="true" type="SHA256">2C374210AF21AE7ABAA4A5DE12B2C9A84E4942E94167B95E218FF27D072AB8BC</application>
</dependencyGroup>
</dependency>
<supersedence>
<deploymentType uninstall="false" type="SHA256">934A4DB4EFE7B825378177BDED26D889A27B19D3A0AD06D2D37A93896B1FF326</deploymentType><!--Build 30119-->
<deploymentType uninstall="false" type="SHA256">345351B04EE45E85194126AE0884A0B8AAC5DCEDA34D42AB18F3E6413C8D41F9</deploymentType><!--Build 30121-->
</supersedence>
</appdefinition>
ConfigMgr: 7Zip 16.02 verteilen
Scheinbar habe ich mein Script für 7-Zip 16.02 übersehen zu veröffentlichen:
<appdefinition>
<file>7z1602-x64.exe</file>
<hash type="SHA256">F1601B09CD0C9627B1AAB7299B83529E8FBC6B5078E43DFD81A1B0BFCDF4A308</hash>
<info>
<company>Igor Pavlov</company>
<setupType>NSIS</setupType>
<isX86>false</isX86>
<hasUninstall>true</hasUninstall>
</info>
<install/>
<uninstall>
Show-InstallationProgress -StatusMessage "Uninstalling 7-Zip 16.02. This may take some time. Please wait..."
$regPath="HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
$uninstallApp=(Get-ItemProperty $regPath | where {$_.DisplayName -like "*7-Zip 16.02*"}).UninstallString.replace("`"","")
Execute-Process -Path "$uninstallApp" -Parameters "/S" -WindowStyle Hidden
</uninstall>
<detection>
$regPath="HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
Get-ItemProperty $regPath | where {$_.DisplayName -like "*7-Zip 16.02*"}
</detection>
<supersedence>
<deploymentType uninstall="false" type="SHA256">80BAA787724BF9BE9F6D2C3B42CBC2124CFA662DB081E2A5F885BFA60389D6FF</deploymentType><!--15.14-->
</supersedence>
</appdefinition>
ConfigMgr: Java 8 Update 101
Anbei das aktualisierte Installationsscript für Java 8u101:
<appdefinition>
<file>jre-8u101-windows-i586.exe</file>
<hash type="SHA256">8FAC3FBB9E854BCEE12049430E9EF67188C6389B46C67120E873CDF173B3C3B9</hash>
<info>
<setupType>InnoSetup</setupType>
<isX86>true</isX86>
<company>Oracle Corporation</company>
<productName>Java 8 Update 101</productName>
<msiProductCode>{26A24AE4-039D-4CA4-87B4-2F32180101F0}</msiProductCode>
</info>
<install>
Show-InstallationProgress -StatusMessage 'Installing Java JRE. This may take some time. Please wait...'
$path=join-path (join-path $env:programdata 'Oracle') 'Java'
if ((Test-Path $path) -eq $false) {
New-Item -Type Directory $path |out-null
}
new-item -type File (join-path $path 'java.settings.cfg') -force | out-null
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-8u101-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-2F32180101F0}"
</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-2F32180101F0}" -and $_.DisplayVersion -eq "8.0.1010.13" -and $_.WindowsInstaller -eq 1}
</detection>
<dependency>
</dependency>
<supersedence>
<deploymentType uninstall="true" type="SHA256">67C9594D2A51D6B1B52CC57CD7E1B320B491207C3680F811354185B71ED4D832</deploymentType>
<deploymentType uninstall="true" type="SHA256">8371F27009A9286CAC0D9812E0411DDBFCB106456E46FFEC50E64054E75E4632</deploymentType>
<deploymentType uninstall="true" type="SHA256">E4E54109C3FB40A36457B4EAC5C53D667A9969826EB16157B0DC4A2D3DCEAC23</deploymentType>
<deploymentType uninstall="true" type="SHA256">41F1887CBC9446720B26F51B9EDD6034D535A2F844A6E37646333F7799F35809</deploymentType>
<deploymentType uninstall="true" type="SHA256">3CC0BE2A34F0989692C30F2CACB89CACFCA7159570D5FC8C1B1498C60CBC07FB</deploymentType><!--71-->
</supersedence>
</appdefinition>
ConfigMgr: Firefox 45.3.0 ESR verteilen
Mit folgender XML Datei kann Firefox in der Version 45.3.0 ESR verteilt werden. Dabei werden automatisch ältere Versionen “supersedet”. Vorausgesetzt diese wurden auch mittels AutomateAppDeployment bereitgestellt.
<appdefinition>
<file>Firefox Setup 45.3.0esr.exe</file>
<hash type="SHA256">02FDEA888951BA9FA5740861C27A815C58151F3B64EF03E9E374AF465F20B9D7</hash>
<info>
<company>Mozilla Corporation</company>
<productName>Mozilla Firefox</productName>
<productversion>45.3.0</productversion>
<setupType>NSIS</setupType>
<isX86>true</isX86>
<hasUninstall>true</hasUninstall>
</info>
<install>
$inf=Join-Path $env:temp firefox.ini
$content="[Install]
QuickLaunchShortcut=false
DesktopShortcut=false
MaintenanceService=false" -replace "`n", "`r`n"
Out-File -FilePath $inf -Force -InputObject $content -Encoding ascii
Show-InstallationProgress -StatusMessage "Installing $appName $appVersion. This may take some time. Please wait..."
Execute-Process -Path "Firefox Setup 45.3.0esr.exe" -Parameters "/INI=`"$inf`"" -WindowStyle Hidden
</install>
<uninstall>
if ([IntPtr]::Size -eq 8) {$regPath="HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"} else { $regPath="HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"}
$item=Get-ItemProperty $regPath | where {$_.DisplayName -like "*Mozilla Firefox*" -and $_.DisplayVersion -eq "45.3.0"}
Execute-Process -Path ($item.UninstallString -replace "`"", "") -Parameters "/S"
</uninstall>
<detection/>
<dependency/>
<supersedence>
<deploymentType uninstall="false" type="SHA256">8CA1EC61B9DF30DDCEF3E7CE5234C2BEF6EC7C9C3A4B51F57C67FC9E8822E7FB</deploymentType><!--38.2.0-->
<deploymentType uninstall="false" type="SHA256">40DC3DF8C548819733386B70791DB753793E98C5F08283001D851A204376F017</deploymentType><!--38.2.1-->
<deploymentType uninstall="false" type="SHA256">FDC5BAA6033918E7FE8018DE130F16A23896B623B0B4F60A8EA578759C2DD29C</deploymentType><!--38.6.0-->
<deploymentType uninstall="false" type="SHA256">771A00786C69F7290A25C495A03622B4616C21D6A062BC712F55E0AE0282C219</deploymentType><!--38.6.1-->
<deploymentType uninstall="false" type="SHA256">85B1438D427FB6C9A52415BF46239AD491FD30EA410698ECDE256D0BC9AE7DB4</deploymentType><!--45.0.0-->
<deploymentType uninstall="false" type="SHA256">4477B833266C0ED9306AFC8347A547C1D27AB854C0438BC353A943C00774CAFD</deploymentType><!--45.0.1-->
<deploymentType uninstall="false" type="SHA256">CA99927AA526C7C002C137337BFA0A1CB2C9118F8C7568F1F3B5C6DCDBAEEE08</deploymentType><!--45.2.0-->
</supersedence>
</appdefinition>