This is an old revision of the document!


Microsoft Office 2013 Professional Plus 32-Bit

Scripts and guide by Jens Eppler based on the Office 2010 script by Soren Birk

I created this package with Office 32-Bit, but it is ment for both 32/64Bit-versions of Windows. I needed to evaluate Soren's script because there are different versions of Microsoft Office 2013 wich are not intended to be used with “setup.exe /admin”. If you get an error message when using this command you might have the retail version of Microsoft Office 2013. But you can still use the config.xml method to install this product customized. In my script I am using some ProductProperties wich are written into a config.xml which is used for the silent installation then.

The setup will install only the products wich are selected by the multivalue property “products”. If you decide to install one product all children entries are forced to setup local. If you decide not to install SkyDrive the rightclick-behavior “sent-to …” will be removed also by deleting a registry key.

You might be able to also use this script with a volume license version of Office 2013 if you replace each occurrence of “proplusr” by “proplus”. You can discover your version of Office when you look at the folders on your installmedia. There should be a folder named “[productid].ww”. To verify this check inside this folder the file named “setup.xml”. The correct product id is shown there in the first lines <Setup Id =“…”>.

There might also be the possibility to change the retail version to a volume license version as described here for example. But I don't know if the retail version license key will still be accepted then.

Tested with:

  • OPSI 4.0.3.1
  • Winst 4.11.3.6
  • Windows 7, 64-Bit

Instructions:

  • Creating the setup:
    • Extract the Office 2010 Prof Plus DVD to CLIENT_DATA\office2k13.
    • Use the control file as shown below for OPSI\control.
    • Take a look at this link for some inspiration: Datei "Config.xml" in Office 2013.
  • Creating the uninstconfig.xml:
    • Use the baseline config.xml and uninstconfig.xml as shown below and copy these to CLIENT_DATA
    • You can also edit the .xml-files to satisfy your claims.

Tree:

CLIENT_DATA
  ├ config.xml
  ├ delsub32.ins
  ├ office2k13.png
  ├ setup32.ins
  ├ uninstall32.ins
  ├ uninstconfig.xml
  └ office2k13
    └ ...

Setup32.ins

; Author Jens Eppler, based on Office 2010 Code by Soren Birk
 
[Actions]
requiredWinstVersion >= "4.11.3.5"
 
DefVar $UninstallProgram$
DefVar $LogDir$
DefVar $ProductId$  
DefVar $MinimumSpace$
DefVar $InstallDir$
DefVar $ExitCode$
DefVar $LicenseRequired$
DefVar $LicenseKey$
DefVar $LicensePool$
DefVar $UninstCmd$
DefVar $TempDir$ 
DefVar $exitcodeActivation$
DefVar $UserName$
DefVar $CompanyName$
DefVar $ACCESSFiles$
DefVar $EXCELFiles$
DefVar $GrooveFiles2$
DefVar $OUTLOOKFiles$
DefVar $PPTFiles$
DefVar $PROJECTFiles$
DefVar $PubPrimary$
DefVar $QueryFiles$
DefVar $VISIOFiles$
DefVar $WORDFiles$
DefVar $XDOCSFiles$
DefStringList $Products$
 
; ----------------------------------------------------------------
; - Please edit the following values                             -
; ----------------------------------------------------------------
Set $LogDir$          = "%SystemDrive%\tmp"
Set $ProductId$       = "office2k13"
Set $MinimumSpace$    = "2 GB"
Set $InstallDir$      = "%ProgramFiles32Dir%\Microsoft Office"
;Set $LicenseKey$      = ""
Set $LicenseKey$      = GetProductProperty("LicenseKey","")
Set $TempDir$         = "%SystemDrive%\opsi.org\tmp\"
;Set $UserName$        = '<USERNAME Value="Valued Customer" />'
Set $UserName$        = '<USERNAME Value="' + GetProductProperty("username", "Valued Customer") + '" />'
;Set $CompanyName$     = '<COMPANYNAME Value="" />'
Set $CompanyName$     = '<COMPANYNAME Value="' + GetProductProperty("companyname", "") + '" />'
;Set $Products$        = createStringList("Access", "Excel", "InfoPath", "Outlook", "PowerPoint", "Word")
Set $Products$        = GetProductPropertyList("products","True")
Set $ACCESSFiles$     = takeFirstStringContaining($Products$, "Access")
Set $EXCELFiles$      = takeFirstStringContaining($Products$, "Excel")
Set $GrooveFiles2$    = takeFirstStringContaining($Products$, "SkyDrive")
Set $OUTLOOKFiles$    = takeFirstStringContaining($Products$, "Outlook")
Set $PPTFiles$        = takeFirstStringContaining($Products$, "PowerPoint")
Set $PROJECTFiles$    = takeFirstStringContaining($Products$, "Project")
Set $PubPrimary$      = takeFirstStringContaining($Products$, "Publisher")
Set $VISIOFiles$      = takeFirstStringContaining($Products$, "Visio")
Set $WORDFiles$       = takeFirstStringContaining($Products$, "Word")
Set $XDOCSFiles$      = takeFirstStringContaining($Products$, "InfoPath")
; ----------------------------------------------------------------
;
;Die oben ausgelesenen Variablen als PropertyListOption werden zu Strings, die in die config.xml ein- und dem Installer übergeben werden 
;Access installieren oder nicht
if not ($ACCESSFiles$ = "")
	Set $ACCESSFiles$  = '<OptionState Id="ACCESSFiles" State="local" Children="force" />'
else
	Set $ACCESSFiles$  = '<OptionState Id="ACCESSFiles" State="absent" Children="force" />'	
endif
;Excel installieren oder nicht (inkl. Datenbankanbindung)
if not ($EXCELFiles$ = "")
	Set $QueryFiles$  = '<OptionState Id="QueryFiles" State="local" Children="force" />'
	Set $EXCELFiles$  = '<OptionState Id="EXCELFiles" State="local" Children="force" />'
else
	Set $QueryFiles$  = '<OptionState Id="QueryFiles" State="absent" Children="force" />'	
	Set $EXCELFiles$  = '<OptionState Id="EXCELFiles" State="absent" Children="force" />'
endif
;Skydrive installieren oder nicht
if not ($GrooveFiles2$ = "")
	Set $GrooveFiles2$  = '<OptionState Id="GrooveFiles2" State="local" Children="force" />'
else
	Set $GrooveFiles2$  = '<OptionState Id="GrooveFiles2" State="absent" Children="force" />'	
endif
;Outlook installieren oder nicht
if not ($OUTLOOKFiles$ = "")
	Set $OUTLOOKFiles$  = '<OptionState Id="OUTLOOKFiles" State="local" Children="force" />'
else
	Set $OUTLOOKFiles$  = '<OptionState Id="OUTLOOKFiles" State="absent" Children="force" />'	
endif
;Powerpoint installieren oder nicht
if not ($PPTFiles$ = "")
	Set $PPTFiles$  = '<OptionState Id="PPTFiles" State="local" Children="force" />'
else
	Set $PPTFiles$  = '<OptionState Id="PPTFiles" State="absent" Children="force" />'	
endif
;Project installieren oder nicht
if not ($PROJECTFiles$ = "")
	Set $PROJECTFiles$  = '<OptionState Id="PROJECTFiles" State="local" Children="force" />'
else
	Set $PROJECTFiles$  = '<OptionState Id="PROJECTFiles" State="absent" Children="force" />'	
endif
;Publisher installieren oder nicht
if not ($PubPrimary$ = "")
	Set $PubPrimary$  = '<OptionState Id="PubPrimary" State="local" Children="force" />'
else
	Set $PubPrimary$  = '<OptionState Id="PubPrimary" State="absent" Children="force" />'	
endif
;Visio installieren oder nicht
if not ($VISIOFiles$ = "")
	Set $VISIOFiles$  = '<OptionState Id="VISIOFiles" State="local" Children="force" />'
else
	Set $VISIOFiles$  = '<OptionState Id="VISIOFiles" State="absent" Children="force" />'	
endif
;Word installieren oder nicht
if not ($WORDFiles$ = "")
	Set $WORDFiles$  = '<OptionState Id="WORDFiles" State="local" Children="force" />'
else
	Set $WORDFiles$  = '<OptionState Id="WORDFiles" State="absent" Children="force" />'	
endif
;InfoPath installieren oder nicht
if not ($XDOCSFiles$ = "")
	Set $XDOCSFiles$  = '<OptionState Id="XDOCSFiles" State="local" Children="force" />'
else
	Set $XDOCSFiles$  = '<OptionState Id="XDOCSFiles" State="absent" Children="force" />'	
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"
 
	if FileExists("%ScriptPath%\delsub32.ins")
		comment "Start uninstall sub section"
		Sub "%ScriptPath%\delsub32.ins"
	endif
 
	Message "Installing " + $ProductId$ + " ..."
 
	comment "Copying empty config.xml to $TempDir$"
	Files_copy_patchtextfile
 
	comment "Patching config.xml"
	PatchTextFile_config_xml $TempDir$ + "config.xml"
 
	comment "Start setup program"
	ChangeDirectory "%SCRIPTPATH%"
	Winbatch_install
	Sub_check_exitcode
 
	if contains($GrooveFiles2$, "absent")
		comment "Registry-Key für Rechtsklick Skydrive löschen"
		Registry_SkyDrive_loeschen
	endif
 
	if not ($LicenseKey$ = "")
		comment "Set License Key"
		DosInAnIcon_set_key
		set $exitcodeActivation$ = getLastExitCode
 
		if not ($exitcodeActivation$ = "0")
			LogError "Exitcode unequal zero: "+$exitcodeActivation$+" Activation seems to be failed !"
			isFatalError "activation failed"
		else
			comment "Activation seems to be successful: exit code = 0"
		endif
	endif
 
endif
 
[Files_copy_patchtextfile]
copy "%ScriptPath%\config.xml" $TempDir$
 
[PatchTextFile_config_xml]
FindLine "</Configuration>"
InsertLine '$XDOCSFiles$'
InsertLine '$WORDFiles$'
InsertLine '$VISIOFiles$'
InsertLine '$QueryFiles$'
InsertLine '$PubPrimary$'
InsertLine '$PROJECTFiles$'
InsertLine '$PPTFiles$'
InsertLine '$OUTLOOKFiles$'
InsertLine '$GrooveFiles2$'
InsertLine '$EXCELFiles$'
InsertLine '$ACCESSFiles$'
InsertLine '$CompanyName$'
InsertLine '$UserName$'
 
[Winbatch_install]
"%ScriptPath%\Office2k13\setup.exe" /config "$TempDir$\config.xml"
 
[Registry_SkyDrive_loeschen]
deletekey [HKCR\AllFilesystemObjects\shell\SPFS.ContextMenu]
 
[DosInAnIcon_set_key]	
cscript "C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS" /inpkey:$LicenseKey$
exit %ERRORLEVEL%
 
[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

Uninstall32.ins

; Author Jens Eppler, based on Office 2010 Code by Soren Birk
 
[Actions]
requiredWinstVersion >= "4.11.2.6"
 
DefVar $UninstallProgram$
DefVar $LogDir$
DefVar $ExitCode$
DefVar $ProductId$
DefVar $InstallDir$
DefVar $LicenseRequired$
DefVar $LicensePool$
DefVar $UninstCmd$
 
Set $LogDir$ = "%SystemDrive%\tmp"
 
; ----------------------------------------------------------------
; - Please edit the following values                             -
; ----------------------------------------------------------------
Set $ProductId$       = "office2k13"
Set $InstallDir$      = "%ProgramFiles32Dir%\Microsoft Office"
; ----------------------------------------------------------------
 
comment "Display product logo"
ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png"
 
Message "Uninstalling " + $ProductId$ + " ..."
 
if FileExists("%ScriptPath%\delsub32.ins")
	comment "Start uninstall sub section"
	Sub "%ScriptPath%\delsub32.ins"
endif

Delsub32.ins

; Author Jens Eppler, based on Office 2010 Code by Soren Birk
 
Set $UninstallProgram$ = "%ScriptPath%\Office2k13\setup.exe"
Set $UninstCmd$ = "/uninstall ProPlusr /config %ScriptPath%\uninstconfig.xml"
 
Message "Uninstalling " + $ProductId$ + " ..."
 
if FileExists("%ProgramFiles32Dir%\Microsoft Office\Office15\1031")
	comment "The program seems to be installed, starting the uninstallation."
	Winbatch_uninstall
	sub_check_exitcode
endif
 
[Winbatch_uninstall]
"%ScriptPath%\Office2k13\setup.exe "$UninstCmd$
 
 
[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

config.xml

<Configuration Product="ProPlusr">
<Display Level="none" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" />
<Logging Type="standard" Path="D:\opsi.org\log" Template="Microsoft Office Professional Plus Setup(*).txt" />
<Setting Id="SETUP_REBOOT" Value="Never" />
</Configuration>

uninstconfig.xml

<Configuration Product="ProPlusr">
<Display Level="none" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" />
<Logging Type="standard" Path="D:\opsi.org\log" Template="Microsoft Office Professional Plus Setup(*).txt" />
<Setting Id="SETUP_REBOOT" Value="Never" />
</Configuration>

control

[Package]
version: 3
depends: 
incremental: False

[Product]
type: localboot
id: office2k13
name: Office 2013
description: Office 2013
advice: 
version: 1.0
priority: 0
licenseRequired: True
productClasses: 
setupScript: setup32.ins
uninstallScript: uninstall32.ins
updateScript: 
alwaysScript: 
onceScript: 
customScript: 
userLoginScript: 

[ProductProperty]
type: unicode
name: username
multivalue: False
editable: True
description: Benutzername
values: [""]
default: [""]

[ProductProperty]
type: unicode
name: companyname
multivalue: False
editable: True
description: Firmenname
values: [""]
default: [""]

[ProductProperty]
type: unicode
name: licensekey
multivalue: False
editable: True
description: Lizenzkey für die Installation
values: [""]
default: [""]

[ProductProperty]
type: unicode
name: products
multivalue: True
editable: False
description: Installationsoptionen, was wird installiert
values: ["Access", "Excel", "InfoPath", "Outlook", "PowerPoint", "Project", "Publisher", "SkyDrive", "Visio", "Word"]
default: ["Access", "Excel", "InfoPath", "Outlook", "PowerPoint", "Word"]

[Changelog]
office2k13 (1.0-3) testing; urgency=low
  * Including setting LicenseKey

office2k13 (1.0-2) testing; urgency=low
  * Testing multivalue Options and PatchTextFiles

office2k13 (1.0-1) testing; urgency=low

  * Initial package

 -- Jens Eppler <...>  Tue, 17 Sep 2013 08:11:32 +0000

QR Code
QR Code userspace:msoffice2013pro (generated for current page)