Table of Contents

Microsoft Office 365

Christian Streifer, based on Office 2016 Code by Author Dominik Daehn, based on Office 2013 Code by Jens Eppler, based on Office 2010 Code by Soren Birk

Anleitung / Description

Deutsch

Die Setup.exe ist das Office Deployment Tool , das Skript beinhaltet Produkteigenschaften die zur Laufzeit in die office_config.xml geschrieben werden.

Microsoft hat mit dem Wechsel zu Office 2016/365 den Syntax der XML Configdatei geändert und ich habe diese angepasst.

Wichtig MS hat mit 2016/365 Office den Update Mechanismus geändert, nach meinem Wissen funktioniert WSUS nicht mehr mit diesen Produkten

English

The Setup.exe ist the Office Deployment Tool

Importent with my knowlege Updates via WSUS don`t work with Office 2016/365

FIXME Die Anleitung ist noch nicht fertig

Dateien / Files

CLIENT_DATA

├ office_config.xml
├ setup.exe
├ office365.png
├ setup.opsiscript
├ uninstall.opsiscript
├ 64
  └ ...
└ 32
  └ ...

setup.opsiscript

[Actions]
requiredWinstVersion >= "4.11.3.5"
 
DefVar $LogDir$
DefVar $ProductId$ 
DefVar $ProductName$
DefVar $OfficeId$
DefVar $OfficeVersion$
 
DefVar $MinimumSpace$
DefVar $InstallPfad$
DefVar $SystemType$
DefVar $OfficeArchitecture$
DefVar $Office_Source$
DefVar $Language$
DefVar $InstallPath$
DefVar $AutoActivate$
DefVar $ExitCode$
DefVar $Config_Product$
DefVar $Config_Eula$
DefVar $Config_Log$
DefVar $Config_Updates$
DefVar $UpdateChannel$
DefVar $UpdateSource$
DefVar $ACCESSFiles$
DefVar $EXCELFiles$
DefVar $GrooveFiles2$
DefVar $OUTLOOKFiles$
DefVar $PPTFiles$
DefVar $PubPrimary$
DefVar $WORDFiles$
DefVar $XDOCSFiles$
DefVar $LYNCFiles$
DefVar $ONENOTEFiles$
DefVar $ONEDRIVE$
DefVar $VISIOVIEWERFiles$
DefStringList $Products$
 
; ----------------------------------------------------------------
; - Please edit the following values                             -
; ----------------------------------------------------------------
Set $LogDir$          	 = "%SystemDrive%\tmp"
Set $ProductId$       	 = "office2016"
Set $ProductName$     	 = "Office 365 Professional Plus"
Set $OfficeId$           = GetProductProperty("officeid","O365ProPlusRetail")
Set $MinimumSpace$    	 = "3 GB"
Set $SystemType$ 	 = GetSystemType
Set $OfficeArchitecture$ = GetProductProperty("architecture","32")
Set $InstallPath$        = GetProductProperty("Installationsdateien","%SystemDrive%\tmp")
Set $UpdateSource$	 = '\\' + GetProductProperty("Updatedateien","") + '\' + $OfficeArchitecture$
 
;Variablen zum patchen der config.xml
Set $Office_Source$	 = '<Add OfficeClientEdition="' + $OfficeArchitecture$ + '" Channel="' + GetProductProperty("Updatekanal","Broad") + '" SourcePath="' + $InstallPath$ + '">'
Set $Config_Product$	 = '<Product ID="' + $OfficeId$ + '">'
Set $Language$		 = '<Language ID="' + GetProductProperty("Sprache","de-de") + '" />'
Set $Config_Eula$	 = '<Display Level="' + GetProductProperty("Installations_Status_MS", "Full") + '" AcceptEula="True" />'
Set $Config_Log$ 	 = '<Logging Level="Standard" Path="' + $LogDir$ + '" />'
Set $Config_Updates$	 = '<Updates Enable="' + GetProductProperty("Updates", "True") + '" Channel="' + GetProductProperty("Updatekanal","Broad") + '" UpdatePath="' + $UpdateSource$ + '" />'
Set $AutoActivate$	 = '<Property Name="AUTOACTIVATE" Value="' + GetProductProperty("Auto_Aktivierung", "0") + '" />'
Set $Products$        	 = GetProductPropertyList("products","True")
Set $ACCESSFiles$     	 = takeFirstStringContaining($Products$, "Access")
Set $EXCELFiles$      	 = takeFirstStringContaining($Products$, "Excel")
Set $GrooveFiles2$    	 = takeFirstStringContaining($Products$, "Groove")
Set $OUTLOOKFiles$    	 = takeFirstStringContaining($Products$, "Outlook")
Set $PPTFiles$        	 = takeFirstStringContaining($Products$, "PowerPoint")
Set $PubPrimary$      	 = takeFirstStringContaining($Products$, "Publisher")
Set $WORDFiles$       	 = takeFirstStringContaining($Products$, "Word")
Set $LYNCFiles$       	 = takeFirstStringContaining($Products$, "Skype")
Set $ONENOTEFiles$    	 = takeFirstStringContaining($Products$, "OneNote")
Set $ONEDRIVE$		 = takeFirstStringContaining($Products$, "OneDrive")
Set $VISIOVIEWERFiles$   = takeFirstStringContaining($Products$, "VisioViewer")
 
; ----------------------------------------------------------------
 
if CompareDotSeparatedNumbers(GetMsVersionInfo,"6.0") < "0"
	LogError "This is for NT 6 (Vista) and above"
	isFatalError
else
	if not ($ACCESSFiles$ = "")
		Set $ACCESSFiles$  = ''
	else
		Set $ACCESSFiles$  = '<ExcludeApp ID="Access" />'	
	endif
	if not ($EXCELFiles$ = "")
		Set $EXCELFiles$  = ''
	else
		Set $EXCELFiles$  = '<ExcludeApp ID="Excel" />'	
	endif
	if not ($GrooveFiles2$ = "")
		Set $GrooveFiles2$  = ''
	else
		Set $GrooveFiles2$  = '<ExcludeApp ID="Groove" />'	
	endif
	if not ($OUTLOOKFiles$ = "")
		Set $OUTLOOKFiles$  = ''
	else
		Set $OUTLOOKFiles$  = '<ExcludeApp ID="Outlook" />'	
	endif
	if not ($PPTFiles$ = "")
		Set $PPTFiles$  = ''
	else
		Set $PPTFiles$  = '<ExcludeApp ID="PowerPoint" />'	
	endif
	if not ($PubPrimary$ = "")
		Set $PubPrimary$  = ''
	else
		Set $PubPrimary$  = '<ExcludeApp ID="Publisher" />'	
	endif
	if not ($WORDFiles$ = "")
		Set $WORDFiles$  = ''
	else
		Set $WORDFiles$  = '<ExcludeApp ID="Word" />'	
	endif
	if not ($LYNCFiles$ = "")
		Set $LYNCFiles$  = ''
	else
		Set $LYNCFiles$  = '<ExcludeApp ID="Lync" />'	
	endif
	if not ($ONENOTEFiles$ = "")
		Set $ONENOTEFiles$  = ''
	else
		Set $ONENOTEFiles$  = '<ExcludeApp ID="OneNote" />'	
	endif
	if not ($VISIOVIEWERFiles$ = "")
		Set $VISIOVIEWERFiles$  = ''
	else
		Set $VISIOVIEWERFiles$  = '<ExcludeApp ID="Visio" />'	
	endif
	if not ($ONEDRIVE$ = "")
		Set $ONEDRIVE$  = ''
	else
		Set $ONEDRIVE$  = '<ExcludeApp ID="OneDrive" />'	
	endif
 
	if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$))
		LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on dirve %SystemDrive% is needed for " + $ProductId$
		isFatalError "Not enough space"
	else
		comment "Display product logo"
		ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductName$
 
		if ($OfficeArchitecture$ = "64") AND ($SystemType$ = "x86 System")
			Set $OfficeArchitecture$ = "32"
			comment "Wechsel Office Architekture zu Office x86"
		endif
 
		comment "Kopiere Installations Dateien"
		Message "Kopiere Installations Dateien für " + $OfficeArchitecture$ + "Bit ..." 
		Files_copy_installfiles
 
		comment "Kopiere leere config.xml nach $LogDir$"
		Files_copy_patchtextfile
 
		comment "Patching config.xml"
		PatchTextFile_config_xml $LogDir$ + "\office_config.xml"
 
		Message "Installiere " + $ProductId$ + " ..." 
 
		comment "Starte Setup Program"
		ChangeDirectory "%SCRIPTPATH%"
		Winbatch_install
		Sub_check_exitcode
 
		comment "Räume auf"
		Files_clean_installfiles
 
	endif
endif
 
[Files_copy_installfiles]
copy -s "%ScriptPath%\$OfficeArchitecture$\*.*" "%SystemDrive%\tmp"
 
[Files_copy_patchtextfile]
copy "%ScriptPath%\office_config.xml" $LogDir$
 
[Files_clean_installfiles]
delete -s "%SystemDrive%\tmp\Office"
 
[PatchTextFile_config_xml]
FindLine "</Configuration>"
InsertLine '  $Config_Log$'
InsertLine '  $AutoActivate$'
InsertLine '  $Config_Eula$'
InsertLine '  $Config_Updates$'
InsertLine '  </Add>'
InsertLine '    </Product>'
InsertLine '	  $ONEDRIVE$'
InsertLine '	  $LYNCFiles$'
InsertLine '	  $ONENOTEFiles$'
InsertLine '	  $VISIOVIEWERFiles$'
InsertLine '	  $WORDFiles$'
InsertLine '	  $PubPrimary$'
InsertLine '	  $PPTFiles$'
InsertLine '	  $OUTLOOKFiles$'
InsertLine '	  $GrooveFiles2$'
InsertLine '      $EXCELFiles$'
InsertLine '      $ACCESSFiles$'
InsertLine '      $Language$'
InsertLine '	$Config_Product$'
InsertLine '  $Office_Source$'
InsertLine '<Configuration>'
 
[Winbatch_install]
"%ScriptPath%\setup.exe" /configure "$LogDir$\office_config.xml"
 
[Sub_check_exitcode]
comment "Test for installation success via exit code"
set $ExitCode$ = getLastExitCode
; informations to exit codes see
; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx
; http://msdn.microsoft.com/en-us/library/aa368542.aspx
if ($ExitCode$ = "0")
	comment "Looks good: setup program gives exitcode zero"
else
	comment "Setup program gives a exitcode unequal zero: " + $ExitCode$
	if ($ExitCode$ = "1605")
		comment "ERROR_UNKNOWN_PRODUCT	1605	This action is only valid for products that are currently installed."
		comment "Uninstall of a not installed product failed - no problem"
	else
		if ($ExitCode$ = "1641")
			comment "looks good: setup program gives exitcode 1641"
			comment "ERROR_SUCCESS_REBOOT_INITIATED	1641	The installer has initiated a restart. This message is indicative of a success."
		else
			if ($ExitCode$ = "3010")
				comment "looks good: setup program gives exitcode 3010"
				comment "ERROR_SUCCESS_REBOOT_REQUIRED	3010	A restart is required to complete the install. This message is indicative of a success."
			else
				logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$
				isFatalError
			endif
		endif
	endif
endif

office_config.xml

</Configuration>
 
<!-- Config Datei wird durch OPSI dynamisch generiert ... don't edit !!! -->

uninstall.opsiscript

[Actions]
requiredWinstVersion >= "4.11.3.5"
 
DefVar $LogDir$
DefVar $ProductId$ 
DefVar $ProductName$
DefVar $OfficeId$
 
DefVar $MinimumSpace$
DefVar $InstallDir$
DefVar $InstallPfad$
DefVar $SystemType$
DefVar $Config_Product$
DefVar $Language$
DefVar $ExitCode$
 
 
; ----------------------------------------------------------------
; - Please edit the following values                             -
; ----------------------------------------------------------------
Set $LogDir$          		= "%SystemDrive%\tmp"
Set $ProductId$       		= "office2016"
Set $ProductName$     		= "Office 2016 Professional Plus"
Set $OfficeId$                  = GetProductProperty("officeid","O365ProPlusRetail")
Set $InstallDir$ 		= "Microsoft Office"
Set $SystemType$ 		= GetSystemType
 
;Variablen zum patchen der office_remove.xml
Set $Config_Product$		= '<Product ID="' + $OfficeId$ + '" >'
Set $Language$			= '<Language ID="' + GetProductProperty("Sprache","de-de") + '" />'
 
; ----------------------------------------------------------------
 
if CompareDotSeparatedNumbers(GetMsVersionInfo,"6.0") < "0"
	LogError "This is for NT 6 (Vista) and above"
	isFatalError
else
	comment "Display product logo"
	ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductName$
 
	comment "Kopiere leere config.xml nach $LogDir$"
	Files_copy_patchtextfile
 
	comment "Patching office_config.xml"
	PatchTextFile_remove_xml $LogDir$ + "\office_config.xml"
 
	Message "Installiere " + $ProductId$ + " ..." 
 
	comment "Start setup program"
	ChangeDirectory "%SCRIPTPATH%"
	Winbatch_remove
 endif
 
[Files_copy_patchtextfile]
copy "%ScriptPath%\office_config.xml" $LogDir$
 
[PatchTextFile_remove_xml]
FindLine "</Configuration>"
InsertLine '  </Remove>'
InsertLine '    </Product>'
InsertLine '      $Language$'
InsertLine '    $Config_Product$'
InsertLine '  <Remove ALL="True">'
InsertLine '<Configuration>'
 
[Winbatch_remove]
"%ScriptPath%\setup.exe" /configure "$LogDir$\office_config.xml"

control

[Package]
version: 1
depends: 
incremental: False
 
[Product]
type: localboot
id: office2016
name: Office 2016
description: Office 2016
advice: 
version: 1.0
priority: 0
licenseRequired: False
productClasses: 
setupScript: setup.opsiscript
uninstallScript: uninstall.opsiscript
updateScript: 
alwaysScript: 
onceScript: 
customScript: 
userLoginScript: 
 
[ProductProperty]
type: unicode
name: architecture
multivalue: False
editable: False
description: Architektur der Office Installation x86 oder x64
values: ["32", "64"]
default: ["32"]
 
[ProductProperty]
type: unicode
name: officeid
multivalue: False
editable: True
description: Produkt-ID für die Office 365 Installation
values: ["O365ProPlusRetail", "O365BusinessRetail", "VisioProRetail", "ProjectProRetail", "SPDRetail", "AccessRuntimeRetail"]
default: ["O365ProPlusRetail"]
 
[ProductProperty]
type: unicode
name: Sprache
multivalue: False
editable: True
description: Definiert die Sprache, die installiert werden soll
values: ["de-de"]
default: ["de-de", "MatchOS"]
 
[ProductProperty]
type: unicode
name: Updatekanal
multivalue: False
editable: True
description: Für die Office 2016-Version von Office 365 ProPlus bietet Microsoft drei Optionen, die als Updatekanäle bezeichnet werden und Ihnen helfen zu steuern, wie oft Office 365 ProPlus mit neuen Funktionen aktualisiert wird.
values: ["Monthly", "Broad", "Targeted"]
default: ["Broad"]
 
[ProductProperty]
type: unicode
name: Updates
multivalue: False
editable: False
description: Office sucht nach Updates.
values: ["True", "False"]
default: ["True"]
 
[ProductProperty]
type: unicode
name: Installationsdateien
multivalue: False
editable: True
description: Speicherort der Installationsdateien
values: ["c:\tmp"]
default: ["c:\tmp"]
 
[ProductProperty]
type: unicode
name: Updatedateien
multivalue: False
editable: True
description: Speicherort der Updatedateien
values: ["%opsiDepotId%"]
default: ["%opsiDepotId%"]
 
[ProductProperty]
type: unicode
name: Auto_Aktivierung
multivalue: False
editable: False
description: Wenn der Wert auf 1 gesetzt ist, werden Office 365 automatisch aktiviert.
values: ["0", "1"]
default: ["1"]
 
[ProductProperty]
type: unicode
name: Installations_Status_MS
multivalue: False
editable: False
description: Wenn Level auf None festgelegt ist, wird Office ohne Benutzeroberfläche installiert: Es werden keine Statusanzeigen, Fertigstellungsbildschirme, Fehlermeldungen oder sonstige Benutzeroberflächen angezeigt.
values: ["None", "Full"]
default: ["None"]
 
[ProductProperty]
type: unicode
name: products
multivalue: True
editable: False
description: welche Produkte installiert werden sollen
values: ["Access", "Excel", "OneDrive", "OneNote", "Outlook", "PowerPoint", "Publisher", "Skype", "VisioViewer", "Word"]
default: ["Access", "Excel", "OneNote", "PowerPoint", "Publisher", "VisioViewer", "Word"]
 
[ProductDependency]
action: setup
requiredProduct: office2010pro
requiredAction: uninstall
requirementType: before

Updates

Office Deployment Tool

Übersicht von dem MS Office Deployment Tool / Overview about MS ODT