Deployment and Migration

    From The Document Foundation Wiki


    22 May 2015: some outstanding things to do are listed on the Discussion tab.
    This page currently concerns deployments only on the Windows platform; however, a lot is relevant for all platforms.

    Prerequisites

    There are 2 versions of LibreOffice for Windows.

    • a 32-bit version for 32-bit and 64-bit Windows
    • a 64-bit version for 64-bit Windows, starting with LibreOffice 5.0.

    You do not need to uninstall an earlier version of LibreOffice if it is version 3.4.5 or higher; preferences are preserved and the old installation will be overwritten. Versions lower than 3.4.5 should be uninstalled prior to installation.

    OpenOffice.org will not be uninstalled, but you do need to remove the OpenOffice Quickstart if LibreOffice is to be your primary office suite.

    LibreOffice 3.5 and above is an MSI file with everything embedded, containing language transforms as substorages, VC redistributables as merge modules and a CAB file is embedded too. Whereas LibreOffice 3.4 and below were seperate files, an EXE file which contained NSIS pre-installer + a setup.exe loader + an MSI file + a separate CAB file + many language transforms + VC redistributable files.

    There are many ways to install LibreOffice, and some are as follows:

    • For a handful of computers, perhaps up to a dozen, it is probably quickest to just use the GUI at each computer.
    • A few dozen computers, simply run a batch file based on the examples given below at each computer.

    Silent unattended installations:

    • Dozens, or hundreds of computers, use Group Policy computer startup scripts.
    • For hundreds of computers get a knowledge of editing MSIs, perhaps using an MSI editor such as ORCA.
    • WPKG is an automated software deployment, upgrade and removal program for Windows.

    Testing Plan, Deployment and Migration Plan

    Before a migration you need a testing plan. This could involve running an installation of LibreOffice alongside an existing office suite. iIt can be configured as the default for OpenDocument files, and other file type defaults can be left as they are until you commence your migration.

    A deployment and migration white paper is available to help with a migration. Also see the TDF migration protocol

    Business case proposal for upgrading to LibreOffice

    Here is a well-written and compelling business case proposal that works. It is for upgrading to LibreOffice from Microsoft Office 2003; you could easily adapt it for a proposal to upgrade from another office suite such as Microsoft Office 2007 or 2010. It is easy to modify being a Hybrid PDF. First save it locally, then open the PDF from within LibreOffice and edit it as you would a normal document.

    File:Office Suite And Editable Document Format Upgrade Options.pdf

    Silent and Unattended Installations

    Feature and Property parameters can be used as command line options.

    Feature

    ADDLOCAL=ALL, The installed features are core components and they pretty much correspond with the page in the dialog that is only available if you select Custom installation from the GUI. If you want to manipulate the installed components with parameters you must first either identify every single component you want to install or (better) install everything with the parameter ADDLOCAL=ALL and then define everything you don't want with REMOVE.

    REMOVE=, Everything you want to remove must be specified in one string using comma as separator and no spaces.

    If you use ADDLOCAL=ALL all the dictionaries will be installed, select the ones you want to remove by their language codes, see below for examples of these codes. Dictionaries are also installed as predefined extensions but in the installer process these are categorized as Dictionaries, so you need to add an extra part to the REMOVE like this:

     REMOVE=gm_r_ex_Dictionary_Af,gm_r_ex_Dictionary_An
    

    Similarly, we can remove predefined extensions or components like this:

     REMOVE=gm_o_Extensions_PRESENTER_SCREEN,gm_o_Extensions_REPORTDESIGN
    REMOVE=gm_o_Xsltfiltersamples,gm_o_jf_Palm,gm_o_jf_Pocketp

    The online update feature is just a check to see if a more recent version is available, with a pop up a message to let the user know when there is. In an enterprise environment it is pointless as staff would normally not be able to upgrade their software. We can completely remove the online update feature, taking it a step further than the ISCHECKFORPRODUCTUPDATES property:

     REMOVE=gm_o_Onlineupdate
    

    To install only some applications, you can specify which applications you want to skip installing:

     REMOVE=gm_p_Calc,gm_p_Base,gm_p_Math,gm_p_Impress,gm_p_Draw,gm_p_Writer
    

    Property

    During installation you can set these properties. The list is not complete, here are some examples:

     ALLUSERS (default=1) - perform a per-user installation or per-machine installation depending on the access privileges of the user 
    CREATEDESKTOPLINK (default=1) - create desktop shortcut icon (bugged in 4.1.0+, solved in tdf#65102 for 4.1.4 and 4.2.0)
    INSTALLLOCATION - specify installation directory
    RebootYesNo (default=Yes) – reboot after the installation
    ISCHECKFORPRODUCTUPDATES (default=1) - check for updates
    REGISTER_ALL_MSO_TYPES (default=0) - use LibreOffice as the default application for Microsoft Office file formats
    REGISTER_NO_MSO_TYPES (default=0) – don't use LibreOffice as default application for any Microsoft Office file formats
    REGISTER_DOC (default=0) - use LibreOffice as the default application for Microsoft Word file format .doc (You can use similar for .xls, .ppt etc.)
    VC_REDIST (default=1) - installs Microsoft Visual C++ Runtime. Since LibreOffice 3.5.4.
    QUICKSTART (default=0) - turns on Quickstart, if Quickstart feature is installed. Since LibreOffice 3.6.0.
    IS1033 (default=1) – until LibreOffice 3.5.4 all UI languages were installed by default so you had to specify each language that you don't want to install
    UI_LANGS - UI language selection. Since LibreOffice 3.5.5

    VC_REDIST=0 could save installation time and resources if the C++ Runtime is already installed. The C++ Runtime must be installed before LibreOffice, so the following cmd could precede the LibreOffice installation cmd, it checks for the Runtime and installs it only if needed. In this example msvcr110.dll is shipped with the 32-bit LibreOffice 4.4.2:

     If not exist c:\windows\system32\msvcr110.dll c:\file-path-to\vcredist_x86 /q /promptrestart / l c:\file-path-to\vcredist_install_log.txt
    

    To find the version of C++ Runtime is required, install LibreOffice via the GUI as this installs the bundled Runtime, then look in the Control Panel, Programs and Features. Take care though, as if these runtimes are backwards compatible, the install might start and backout, and you don't want this happening everytime the computer starts up as it may waste bandwidth or something.

    32-bit msvcr110.dll Microsoft Visual C++ 2010 Redistributable Package (x86). This is required for the 32-bit version of LibreOffice 4.42 (Windows 7 (x86))

    64-bit msvcr120.dll Visual Studio 2013 C++ 64-bit redistributable runtime. This is required for the new 64-bit version of LibreOffice 5.00, it has higher system requirements of 512MB (Windows 7 (x86 and x64))

    In the unlikely event you get error code 1935 during installation, try to install LibreOffice with VC_REDIST=0

    Default silent install selects only those user interface (UI) languages that are among the UI languages available on the system. Language variants are included. This means for example, that there will be 3 UIs for English.

    We can add multiple user interface languages, while also removing unnecessary languages, using numeric Locale ID, keeping the primary enabled language last, like this:

     IS5146=1 IS1033=1 IS1078=0 IS1025=0
    

    With LibreOffice 3.5.4 UI language selection through IS<lcid> properties does not work during silent install. With LibreOffice 3.5.5 and higher, language selection works as follows.

     msiexec /i Lib...._.msi UI_LANGS=en_US,de,fr,hu
    

    Installing English (US), German, French, and Hungarian. There are still some minor issues with language selection, because for example pt_BR also selects pt implicitly, but this is the same as we have with automatic language selection.

    When the user tries to fool the installer by giving invalid language codes, installer will fall back to en_US. Also, en_US is not installed by default, unlike with the automatic selection.

    Dictionaries: See Tools/Extension Manager to see installed dictionaries. See Tools/Options/Language Settings/Languages for ticked languages that indicates spell checking is available, these correlate to installed shared extensions under C:\Program Files (x86)\LibreOffice 4\share\extensions (Windows 7 and 8.1).

    Quickstart, when turned on creates a shortcut that depends on user: "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\LibreOffice 3.5.lnk" (Windows 7).

    Help: A cmd line to install LibreOffice Help for the optional local help files, otherwise online web based help is available

     msiexec /qb /i file-path-to\LibreOffice_4.4.2_Win_x86_helppack_en-GB.msi /l* file-path-to\libo_helpinstall_log.txt
    

    UI Language of Installer

    LibreOffice Windows installer supports as many languages as LibreOffice itself. It depends on the language set at Region and Language -> Format (Windows 7); you can access the dialog using intl.cpl command line.

    You can force it to start in any language. The following example will start the installer of LibreOffice 3.5.3 in Scottish Gaelic. The number after the colon is the Locale ID of the language.

     msiexec /i LibO_3.5.3_Win_x86_install_multi.msi TRANSFORMS=:1084
    

    You likely will not be able to force English (US) language (1033) this way, because there's no embedded transform for it (it is used as the base language of installer). For this case, temporarily setting language through Format tab of intl.cpl should do the job.

    Or use ProductLanguage property with decimal [MS-LCID] value for any language supported by installer:

     msiexec /i LibreOffice_X.Y.Z_Win_x64.msi ProductLanguage=1033
    

    Note that this doesn't affect the language of installer when editing (adding/removing components/uninstalling) already installed version.

    Examples



    Example 1 - Install LibreOffice in tandem with another office suite.

    Installs LibreOffice as the default office suite for OpenDocument files, leaving other file types unchanged. So everyone can do this, irrespective of whether a migration to LibreOffice has been planned yet. At the very minimum this is justifyable as a backup office suite, mitigating against licensing issues or rogue updates breaking another office suite.

    This example installs LibreOffice 7.2.2 to become the default app for OpenDocument files, MS Office file types are not changed. It creates an install log, English_GB UI, no Online update, no Reboot, Quickstart off, no Visual C++ Runtime, leaving English and French dictionaries:

    If you want to remove the French dictionary add gm_r_ex_Dictionary_Fr, or for English gm_r_ex_Dictionary_En

    Other distributions or versions of LibrOffice may ship with different optional features in the MSI, if there is a problem with trying to remove a non-existing feature, there will be an error and it can be easilly fixed.

    The log file details the installation process, in this you can see most of the properties that you can set in the installation.

    Written as one line:

    msiexec /qb /i LibreOffice_7.2.2_Win_x86.msi /l* LibreOffice_install_log.txt REGISTER_NO_MSO_TYPES=1 UI_LANGS=en_GB ISCHECKFORPRODUCTUPDATES=0 \
    REBOOTYESNO=No QUICKSTART=0 ADDLOCAL=ALL VC_REDIST=0 \
    REMOVE=gm_o_Onlineupdate,gm_r_ex_Dictionary_Af,gm_r_ex_Dictionary_An,gm_r_ex_Dictionary_Ar,gm_r_ex_Dictionary_Be,gm_r_ex_Dictionary_Bg,\
    gm_r_ex_Dictionary_Bn,gm_r_ex_Dictionary_Bo,gm_r_ex_Dictionary_Br,gm_r_ex_Dictionary_Pt_Br,gm_r_ex_Dictionary_Bs,\
    gm_r_ex_Dictionary_Pt_Pt,gm_r_ex_Dictionary_Ca,gm_r_ex_Dictionary_Cs,gm_r_ex_Dictionary_Da,gm_r_ex_Dictionary_Nl,\
    gm_r_ex_Dictionary_Et,gm_r_ex_Dictionary_Gd,gm_r_ex_Dictionary_Gl,gm_r_ex_Dictionary_Gu,gm_r_ex_Dictionary_He,\
    gm_r_ex_Dictionary_Hi,gm_r_ex_Dictionary_Hu,gm_r_ex_Dictionary_Lt,gm_r_ex_Dictionary_Lv,gm_r_ex_Dictionary_Ne,\
    gm_r_ex_Dictionary_No,gm_r_ex_Dictionary_Oc,gm_r_ex_Dictionary_Pl,gm_r_ex_Dictionary_Ro,gm_r_ex_Dictionary_Ru,\
    gm_r_ex_Dictionary_Si,gm_r_ex_Dictionary_Sk,gm_r_ex_Dictionary_Sl,gm_r_ex_Dictionary_El,gm_r_ex_Dictionary_Es,\
    gm_r_ex_Dictionary_Sv,gm_r_ex_Dictionary_Te,gm_r_ex_Dictionary_Th,gm_r_ex_Dictionary_Tr,gm_r_ex_Dictionary_Uk,\
    gm_r_ex_Dictionary_Vi,gm_r_ex_Dictionary_Zu,gm_r_ex_Dictionary_Sq,gm_r_ex_Dictionary_Hr,gm_r_ex_Dictionary_De,\
    gm_r_ex_Dictionary_Id,gm_r_ex_Dictionary_Is,gm_r_ex_Dictionary_Ko,gm_r_ex_Dictionary_Lo,gm_r_ex_Dictionary_Mn,\
    gm_r_ex_Dictionary_Sr,gm_r_ex_Dictionary_Eo,gm_r_ex_Dictionary_It
    




    Example2: LibreOffice as default office suite.

    Installs LibreOffice as the default office suite for OpenDocument files and also Microsoft's proprietary binary and OOXML files. Existing office suites can remain installed and can still be used with “Open with”, until you choose to remove them later on.

    The command is the same as the example above, just replace REGISTER_NO_MSO_TYPES=0 with REGISTER_ALL_MSO_TYPES=1



    Examples for older versions of LibreOffice:

    Older versions of LibreOffice may different components, also the old shortened filename LibO is used.

    The following is for LibreOffice 3.6.4, with log included, all file types registered, English (US), French, Hungarian and Bosnian UI languages, without Online update, Quickstart turned on, without Visual C++ Runtime, or mobile components, leaving English, French, Croatian and Serbian dictionaries.

     msiexec /qn /i LibO_3.6.4_Win_x86_install_multi.msi /l* LibreOffice_install_log.txt  SELECT_WORD=1 SELECT_EXCEL=1 SELECT_POWERPOINT=1 \
     REGISTER_ALL_MSO_TYPES=1 UI_LANGS=en_US,fr,hu,bs RebootYesNo=No ISCHECKFORPRODUCTUPDATES=0 QUICKSTART=1 VC_REDIST=0 \
     ADDLOCAL=ALL REMOVE=gm_o_Onlineupdate,gm_o_jf_Palm,gm_o_jf_Pocketpc,gm_r_ex_Dictionary_Af,gm_r_ex_Dictionary_An,\
     gm_r_ex_Dictionary_Ar,gm_r_ex_Dictionary_Be,gm_r_ex_Dictionary_Bg,gm_r_ex_Dictionary_Bn,gm_r_ex_Dictionary_Br,\
     gm_r_ex_Dictionary_Pt_Br,gm_r_ex_Dictionary_Pt_Pt,gm_r_ex_Dictionary_Ca,gm_r_ex_Dictionary_Cs,gm_r_ex_Dictionary_Da,\
     gm_r_ex_Dictionary_Nl,gm_r_ex_Dictionary_Et,gm_r_ex_Dictionary_Gd,gm_r_ex_Dictionary_Gl,gm_r_ex_Dictionary_Gu,gm_r_ex_Dictionary_De,\
     gm_r_ex_Dictionary_He,gm_r_ex_Dictionary_Hi,gm_r_ex_Dictionary_Hu,gm_r_ex_Dictionary_It,gm_r_ex_Dictionary_Ku_Tr,gm_r_ex_Dictionary_Lt,\
     gm_r_ex_Dictionary_Lv,gm_r_ex_Dictionary_Ne,gm_r_ex_Dictionary_No,gm_r_ex_Dictionary_Oc,gm_r_ex_Dictionary_Pl,\
     gm_r_ex_Dictionary_Ro,gm_r_ex_Dictionary_Ru,gm_r_ex_Dictionary_Si,gm_r_ex_Dictionary_Sk,gm_r_ex_Dictionary_Sl,gm_r_ex_Dictionary_El,\
     gm_r_ex_Dictionary_Es,gm_r_ex_Dictionary_Sv,gm_r_ex_Dictionary_Te,gm_r_ex_Dictionary_Th,gm_r_ex_Dictionary_Uk,gm_r_ex_Dictionary_Vi,\
     gm_r_ex_Dictionary_Zu 

    The following is for LibreOffice 3.5.2, with log included, a selection of dictionaries, English, French, Spanish, Italian, German, Russian, Bosnian, Croatian and Serbian UI languages, all file types registered, without Online update or mobile components, with Quickstart feature (but not turned on):

     msiexec /qn /i LibO_3.5.2_Win_x86_install_multi.msi /l* LibreOffice_install_log.txt  SELECT_WORD=1 \
     SELECT_EXCEL=1 SELECT_POWERPOINT=1 REGISTER_ALL_MSO_TYPES=1 IS1078=0 IS1025=0 IS1101=0 IS1610=0 IS1059=0 \
     IS1026=0 IS2117=0 IS2121=0 IS1150=0 IS1603=0 IS5146=0 IS1027=0 IS32771=0 IS1029=0 IS1106=0 IS1030=0 IS1031=1 \
     IS1604=0 IS2129=0 IS1032=0 IS2057=0 IS7177=0 IS1553=0 IS1034=1 IS1061=0 IS1069=0 IS1065=0 IS1035=0 IS1036=1\
     IS2108=0 IS1084=0 IS1110=0 IS1095=0 IS1037=0 IS1081=0 IS1050=1 IS1038=0 IS1057=0 IS1039=0 IS1040=1 IS1041=0 \
     IS1079=0 IS1087=0 IS1107=0 IS1099=0 IS1042=0 IS1111=0 IS1120=0 IS1574=0 IS1134=0 IS1108=0 IS1063=0 IS1062=0 \
     IS1605=0 IS1071=0 IS1100=0 IS1104=0 IS1112=0 IS1102=0 IS1109=0 IS1044=0 IS1121=0 IS1043=0 IS2068=0 IS1580=0 \
     IS1132=0 IS1154=0 IS2162=0 IS1096=0 IS1094=0 IS1045=0 IS2070=0 IS1046=0 IS1048=0 IS1049=0 IS1569=0 IS1103=0 \
     IS1606=0 IS1113=0 IS2074=1 IS2133=0 IS1051=0 IS1060=0 IS1052=0 IS3098=0 IS1579=0 IS1072=0 IS1053=0 IS1089=0 \
     IS1097=0 IS1098=0 IS1064=0 IS1054=0 IS1074=0 IS1055=0 IS1073=0 IS1092=0 IS1152=0 IS1058=0 IS1091=0 IS1075=0 \
     IS1066=0 IS1076=0 IS2052=0 IS1028=0 IS1077=0 IS1050=1 IS1033=1 ADDLOCAL=ALL RebootYesNo=No  \
     REMOVE=gm_o_Onlineupdate,gm_o_jf_Palm,gm_o_jf_Pocketpc,gm_r_ex_Dictionary_Af,gm_r_ex_Dictionary_An,\
     gm_r_ex_Dictionary_Ar,gm_r_ex_Dictionary_Be,gm_r_ex_Dictionary_Bg,gm_r_ex_Dictionary_Bn,gm_r_ex_Dictionary_Br,\
     gm_r_ex_Dictionary_Pt,gm_r_ex_Dictionary_Pt_Pt,gm_r_ex_Dictionary_Ca,gm_r_ex_Dictionary_Cs,gm_r_ex_Dictionary_Da,\
     gm_r_ex_Dictionary_Nl,gm_r_ex_Dictionary_Et,gm_r_ex_Dictionary_Gd,gm_r_ex_Dictionary_Gl,gm_r_ex_Dictionary_Gu,\
     gm_r_ex_Dictionary_He,gm_r_ex_Dictionary_Hi,gm_r_ex_Dictionary_Hu,gm_r_ex_Dictionary_Ku_Tr,gm_r_ex_Dictionary_Lt,\
     gm_r_ex_Dictionary_Lv,gm_r_ex_Dictionary_Ne,gm_r_ex_Dictionary_No,gm_r_ex_Dictionary_Oc,gm_r_ex_Dictionary_Pl,\
     gm_r_ex_Dictionary_Ro,gm_r_ex_Dictionary_Si,gm_r_ex_Dictionary_Sk,gm_r_ex_Dictionary_Sl,gm_r_ex_Dictionary_El,\
     gm_r_ex_Dictionary_Sv,gm_r_ex_Dictionary_Te,gm_r_ex_Dictionary_Th,gm_r_ex_Dictionary_Uk,gm_r_ex_Dictionary_Vi,\
     gm_r_ex_Dictionary_Zu 

    Extension installation

    Extensions can be managed using UNOPKG, it can also manage shared extensions. For help use unopkg -h. For 64-bit machines replace %PROGRAMFILES% with %PROGRAMFILES(x86)% accordingly. e.g. to add an extension:

     "%PROGRAMFILES%\LibreOffice 4\program\unopkg add  --suppress-license --shared \\server\LibreOffice\Extension.oxt"
    

    Deploying via Group Policy Objects (GPO)

    Computer startup script

    Programs can be started automatically at computer startup / shutdown with administrator privilege silently in the background. You can use this to run a script or batch file that installs LibreOffice when needed. See Microsoft's Group Policy computer startup scripts.

    The following is an idea of a way that you could do this:

    Set up a new Group Policy Object on the Domain Controller called LibreOffice and link it to your domain. Go to the Scope tab, under Security Filtering, remove Authenticated Users and add the computer objects for the workstations you want to install LibreOffice on. By filtering to computer objects, you an control which machines the GPO will and won't be applied to. You could keep it simpler and just replace Authenticated Users with Domain Computers to deploy the software to every workstation in the domain, or perhaps look into filtering by Organisational Unit which would be useful for installing to departments at different times.

    Go to the Details tab of the LibreOffice Group Policy Object and change the status from Enabled to User configuration settings disabled. The only thing this GPO does is run a startup script to install VCredist, LibreOffice its offline help pack. This is because startup scripts are managed under computer configuration settings not user, so this might save a milli-second. :-)

    LibreOffice.vbs: Open up the LibreOffice Group Policy Object in the Group Policy Management Editor, under Computer Configuration expand Policies, then Windows Settings. Select Scripts (Startup/Shutdown) and open up Startup Properties. Left-click Show Files and create an empty text file called LibreOffice.vbs (or whatever you prefer), enter the following using Notepad:

    bDebug = False
      
      Const HKEY_LOCAL_MACHINE = &H80000002
      Const HKEY_USERS = &H80000003
      
      Set Reg = GetObject("winMgMts:StdRegProv")
      iRet = Reg.EnumKey(HKEY_USERS, "S-1-5-19", AKeys)
      If iRet <> 0 Then
      	Dim UAC : Set UAC = CreateObject("Shell.Application")
      	UAC.ShellExecute WScript.FullName, Chr(34) & WScript.ScriptFullName & Chr(34), "", "runas", 1
      	WScript.Quit
      End If
      
      Dim WshShell : Set WshShell = CreateObject("WScript.Shell")
      Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
      
      Set WI = CreateObject("WindowsInstaller.Installer")
      Const msiOpenDatabaseModeReadOnly = 0
      
      ' https://msdn.microsoft.com/en-us/library/windows/desktop/aa369487(v=vs.85).aspx
      Const msiUILevelBasic = 3
      Const msiUILevelNone = 2
      Const msiUILevelHideCancel = 32
      WI.UILevel = msiUILevelBasic
      
      Dim InstallSource : InstallSource = objFSO.GetParentFolderName(Wscript.ScriptFullName)
      
      Set objFolder = objFSO.GetFolder(InstallSource)
      Set colFiles = objFolder.Files
      
      Dim LibreOfficeSetup, LibreOfficeSetupVersion
      Dim LibreOfficeHelpPack, LibreOfficeHelpPackVersion
      Dim Name, Version, InstallLocation, LocalPackage, ProductCode
      For Each objFile in colFiles
      	If LCase(objFSO.GetExtensionName(objFile.Name)) = "msi" Then
      		' If bDebug Then Wscript.Echo objFile.Name & " (" & objFSO.GetExtensionName(objFile.Name) & ")"
      		On Error Resume Next
      		Set db = WI.OpenDatabase(objFSO.BuildPath(InstallSource, objFile.Name), msiOpenDatabaseModeReadOnly)
      		If (Err.Number <> 0) Then 
      			If bDebug Then Wscript.Echo Err.Source & " " & Hex(Err) & ": " & Err.Description
      			Wscript.Quit(1)
      		End If
      		On Error Goto 0
      		
      		Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductName'")
      		view.Execute()
      		Name = view.Fetch().StringData(1)
      		' If bDebug Then Wscript.Echo Name
      	
      		If Left(Name, Len("LibreOffice")) = "LibreOffice" Then
      			Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'")
      			view.Execute()
      			Version = view.Fetch().StringData(1)
      	
      			If InStr(Name, "Help Pack") Then
      				If IsEmpty(LibreOfficeHelpPackVersion) Or Replace(LibreOfficeHelpPackVersion, ".", "") < Replace(Version, ".", "") Then
      		  			LibreOfficeHelpPack = objFile.Name
      		  			LibreOfficeHelpPackVersion = Version
      		  		End If
      			Else
      				If IsEmpty(LibreOfficeSetupVersion) Or Replace(LibreOfficeSetupVersion, ".", "") < Replace(Version, ".", "") Then
      					LibreOfficeSetup = objFile.Name
      					LibreOfficeSetupVersion = Version
      				End If
      			End If
      		End If
      	End If
      Next
      
      If bDebug Then
      	Wscript.Echo "LibreOfficeSetup = " & LibreOfficeSetup & " (" & LibreOfficeSetupVersion & ")" & vbNewLine & _
      				 "LibreOfficeHelpPack = " & LibreOfficeHelpPack & " (" & LibreOfficeHelpPackVersion & ")"
      End If
      If IsEmpty(LibreOfficeSetup) Then WScript.Quit(2)
      
      Set Products = WI.Products
      
      'For Each Product In Products
      '	On Error Resume Next
      '	Name = WI.ProductInfo(Product, "ProductName")
      	
      '	If Left(Name, Len("LibreOffice")) = "LibreOffice" And InStr(Name, "Help Pack") Then
      '		Version = DecodeVersion(WI.ProductInfo(Product, "Version"))
      		
      '		If IsEmpty(LibreOfficeHelpPack) And Replace(Version, ".", "") < Replace(LibreOfficeSetupVersion, ".", "") Then
      '			Uninstall(Product)
      '		End If
      		
      '		Exit For
      '	End If
      'Next
      
      bInstallLibreOffice = True
      bInstallLibreOfficeHelpPack = Not(IsEmpty(LibreOfficeHelpPack))
      
      For Each Product In Products
      	On Error Resume Next
      	Name = WI.ProductInfo(Product, "ProductName")
      	Version = DecodeVersion(WI.ProductInfo(Product, "Version")) ' objFSO.GetFileVersion(InstallLocation & "\program\swriter.exe")
      	
      	If Left(Name, Len("LibreOffice")) = "LibreOffice" Then
      		If InStr(Name, "Help Pack") Then
      			If Replace(Version, ".", "") >= Replace(Left(LibreOfficeHelpPackVersion, Len(Version)), ".", "") Then
      				bInstallLibreOfficeHelpPack = False
      			End If
      		Else
      			If Replace(Version, ".", "") >= Replace(Left(LibreOfficeSetupVersion, Len(Version)), ".", "") Then
      		  		bInstallLibreOffice = False
      		  	End If
      		End If
      
      		If bDebug Then s1 = s1 & Name & " (" & Version & ") - " & Product & vbNewLine
      	End If
      	
      	If Left(Name, Len("OpenOffice.org")) = "OpenOffice.org" Then
      		Uninstall(Product)
      	End If
      	
      	If bDebug Then s2 = s2 & Name & " (" & Version & ") - " & Product & " "
      Next
      If bDebug Then
       	Wscript.Echo s1 & vbNewLine & "bInstallLibreOffice = " & bInstallLibreOffice & vbNewLine & _
       								  "bInstallLibreOfficeHelpPack = " & bInstallLibreOfficeHelpPack
      	Wscript.Echo s2
      	'Wscript.Quit(0)
      End If
      
      If bInstallLibreOffice Then
      	Dim Temp : Temp = objFSO.GetSpecialFolder(2)
      	' VCRedist
      	' WshShell.Run """" & objFSO.BuildPath(InstallSource, "vcredist_x86.exe") & """ /q /promptrestart / l """ & Temp & "\vcredist_install_log.txt"""
          
          WI.EnableLog "voicewarmup", objFSO.BuildPath(Temp, "LibreOffice_install_log.txt")
          WI.InstallProduct objFSO.BuildPath(InstallSource, LibreOfficeSetup), "ALLUSERS=1 ISCHECKFORPRODUCTUPDATES=0 RebootYesNo=No REBOOT=ReallySuppress"
          ' WshShell.Run "msiexec /i """ & objFSO.BuildPath(InstallSource, LibreOfficeSetup) & """ /qb /norestart ALLUSERS=1 ISCHECKFORPRODUCTUPDATES=0 RebootYesNo=No REBOOT=ReallySuppress /l* """ & Temp & "\LibreOffice_install_log.txt"""
          
      	Set Products = WI.Products
      	For Each Product In Products
      		On Error Resume Next
      		Name = WI.ProductInfo(Product, "ProductName")
      		
      		If Left(Name, Len("LibreOffice")) = "LibreOffice" Then
      			InstallLocation = WI.ProductInfo(Product, "InstallLocation")
      		End If
      	Next
      	
      	If IsEmpty(InstallLocation) Then
      		If WshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") <> "x86" Then
      		  ProgramFiles = WshShell.ExpandEnvironmentStrings("%ProgramFiles%")
      		Else
      		  ProgramFiles = WshShell.ExpandEnvironmentStrings("%ProgramFiles(x86)%")
      		End If
      		
      		Dim objFolder, objSubFolders, objSubFolder
      		Set objFolder = objFSO.GetFolder(ProgramFiles)
      		Set colSubFolders = objFolder.SubFolders
      		
      		For Each objSubFolder In colSubFolders
      		  If Left(objSubFolder.Name, Len("LibreOffice")) = "LibreOffice" Then
      		  	If objFSO.FileExists(ProgramFiles & "\" & objSubFolder.Name & "\program\swriter.exe") Then
      	  		    InstallLocation = ProgramFiles & "\" & objSubFolder.Name & "\"
      	  		    Exit For
      	  		End If
      		  End If
      		Next
      	End If
      	
      	If IsEmpty(InstallLocation) Then Wscript.Quit(3)
      	
      	If objFSO.FileExists(objFSO.BuildPath(InstallSource, "MacroSecurityLevel.xcd")) Then
      		objFSO.CopyFile objFSO.BuildPath(InstallSource, "MacroSecurityLevel.xcd"), InstallLocation & "share\registry"
      	End If
      End If
      
      If bInstallLibreOfficeHelpPack Then
      	WI.EnableLog "voicewarmup", objFSO.BuildPath(Temp, "libo_helpinstall_log.txt")
      	WI.InstallProduct objFSO.BuildPath(InstallSource, LibreOfficeHelpPack), "RebootYesNo=No REBOOT=ReallySuppress"
        ' WshShell.Run "msiexec /i """ & objFSO.BuildPath(InstallSource, LibreOfficeHelpPack) & """ /qb /norestart RebootYesNo=No REBOOT=ReallySuppress /l* """ & Temp & "\libo_helpinstall_log.txt"""
      End If
      
      Sub Uninstall(Product)
      	On Error Resume Next
      	LocalPackage = WI.ProductInfo(Product, "LocalPackage")
      	If Not IsEmpty(LocalPackage) Then
      		WI.InstallProduct LocalPackage, "REMOVE=ALL"
      	Else
      		WshShell.Run "msiexec /qb! /uninstall " & Product, 0, True
      	End If
      End Sub
      
      Function DecodeVersion(version)
      	On Error Resume Next
      	version = CLng(version)
      	DecodeVersion = version\65536\256 & "." & (version\65535 MOD 256) & "." & (version Mod 65536)
      End Function

    Save and exit Notepad.

    In Startup Properties left-click Add. The Add a Script dialogue box appears and browse to open another Explorer window and select LibreOffice.vbs script, OK back to Startup Properties. The script should now be listed under Startup Scripts for LibreOffice. OK to close Startup Properties, and close all others.

    The new Group Policy Object will now run LibreOffice.vbs on the workstations every time they're switched on if it is not installed or when upgrading from an older version is required.

    While GPO installation is possible, bear in mind that unattended MSI installation installs all dictionaries by default. See tdf#45750 about potential issues with deployment via GPO.

    Managed software deployment

    This is the recommended method as you can centrally manage which version of LibO is installed on various machines in Active Directory as well as centrally deploy upgrades just by adding a newer package to the GPO.

    1. Download the installer for the version of LibO you want to deploy.
    2. Open the MSI file in ORCA or InstEd. (See the section on MSI editing for download links.)
    3. Go to View ▸ Summary Information... in ORCA or Tables ▸ Summary Info... in InstEd.
    4. Remove some of the language codes listed in the Languages field, making sure to keep at least the one(s) you need. http://www.science.co.il/language/locale-codes.asp (This is required to avoid an error when adding the package to the GPO.)
    5. Save the MSI to a network location where all machine accounts have Read access.
    6. If you wish to customize the installation, create a Transform using Transform ▸ New Transform
    7. Click the Property table on the left, then make your changes on the right as described in the MSI editing section.
    8. Save the transform to a network location where all machine accounts have Read access.
    9. (You can create as many transforms with different options as you like and use them with the single MSI file.)
    10. Start the Group Policy Management tool (gpmc.msc)
    11. Expand your domain, right-click Group Policy Objects and click New. Name it something useful like "Deploy LibreOffice." (Skip this step if you're just upgrading LibO.)
    12. Right-click "Deploy LibreOffice" and click Edit...
    13. Go to Computer Configuration ▸ Policies ▸ Software Settings ▸ Software installation
    14. Right-click the right pane and click New ▸ Package
    15. Browse to the network location (e.g. \\server\share\foo) where the MSI file is stored and select it.
    16. Choose Advanced & click OK.
    17. Check that all of the options are as you like. (If you've done this before, the Upgrades tab will show older versions that will be automatically upgraded by this new package.)
    18. If you want to include a transform, click the Modifications tab, click Add, and browse to the network location where the MST file is located.
    19. Click OK & close the GPO editor.
    20. Back in the main editor, right-click the "Deploy LibreOffice" policy, click GPO Status ▸ User configuration settings disabled so that it's checked. (Saves a bit of processing time since we only changed Computer settings.)
    21. Drag this policy on top of the OU containing the machines to which you want to deploy LibO.
    22. After about 10 minutes, the machines in the OU will have the policy. The next time they restart, they will install/upgrade LibO automatically.

    MSI file manipulation / MST transform creation

    You can manipulate the MSI file or create an MST transform file using a program like ORCA or InstEd. You'll only be editing the Property table. The parameters explained above apply here as well. Edit (or add) rows in the table that correspond to the items you wish to change.

    To restrict which UI languages are installed:

    • Add a row with property UI_LANGS and set its value to a comma-separated list of the languages you would like available for the user interface (e.g. en_US,it,es)

    To install only certain items:

    1. Add a row with property ADDLOCAL and set its value to ALL.
    2. Add another called REMOVE and set it to a comma-separated list of the items you don't want installed, just like in the command-line installation examples above. (This is particularly useful to limit which spelling dictionaries are installed as the full set can take up considerable disk space.) The list of possible items to put here can be found in the "Feature" column of the Feature table. (Note that you don't need to worry about any "langpack" items since the UI_LANGS property mentioned above will handle excluding them.)
    • Alternatively, you could set REMOVE to ALL and specify a list of comma-separated items you want installed for ADDLOCAL, but this method requires more care since you need to make sure you include any dependent items as well.

    Post deployment configuration

    MSIEXEC silent installation doesn't allow the control of all parameters.

    Tools ▸ Options-Security ▸ Macro Security ▸ Security Level is set to High. In order to be able to open a macro it needs to be set to Medium.

    Language settings are set to default values. Tools ▸ Options ▸ Language Settings ▸ Languages ▸ Language of user interface, Tools ▸ Options ▸ Language Settings-Languages ▸ Language of locale setting and Tools ▸ Options ▸ Language Settings ▸ Languages ▸ Default Languages for Documents cannot be set during silent installation.

    Similar, default format for documents available in GUI under Tools ▸ Options-Load/Save ▸ General ▸ Always save as cannot be set during silent installation.

    These settings are mostly personal and stored in a specific file registrymodifications.xcu. Toolbars and icons are also personal. For example, custom Writer toolbars are in "%userprofile%\AppData\...\LibreOffice\4\user\config\soffice.cfg\modules\swriter\toolbar".

    Some tricks for post deployment configuration

    In some situations, such as decreasing the Macro security levels on a silent install, or configuring an option for the installation, can be performed by placing a XML file in the right place, after LibreOffice is installed and with the help of a script or automated tool. For example the following XML file with .xcd extension can be placed in

    %PROGRAMFILES(x86)%\LibreOffice 4\share\registry 
    

    and will set macro security level to Medium

    <?xml version="1.0"?>
     <oor:data xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:oor="http://openoffice.org/2001/registry">
       <dependency file="main" />
       <oor:component-data xmlns:install="http://openoffice.org/2004/installation"
       oor:name="Common" oor:package="org.openoffice.Office">
         <node oor:name="Security">
           <node oor:name="Scripting">
             <prop oor:name="MacroSecurityLevel" oor:op="fuse">
               <value>1</value>
             </prop>
           </node>
         </node>
       </oor:component-data>
     </oor:data>

    This example sets the experimental features on (for macro recording)

    <?xml version="1.0"?> 
     <oor:data xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oor="http://openoffice.org/2001/registry">
     <dependency file="main" />
     <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="Common" oor:package="org.openoffice.Office">
        <node oor:name="Misc">
         <prop oor:name="ExperimentalMode"  oor:op="fuse" oor:type="xs:boolean"> 
     		<value>true</value>
     	</prop>
        </node>
      </oor:component-data>
     </oor:data>

    Windows Registry

    Any of the 25,000 LibreOffice settings can be configured and managed through Windows Registry, this can be managed through one or more Group Policies in the Active Directory or similar administration system.

    e.g. Set “Macro security level” to “High” and lock the settings:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\LibreOffice\org.openoffice.Office.Common\Security\Scripting\MacroSecurityLevel]
      "Value"="2" 
      "Final"=dword:00000001


    Properties of extensible groups need type. E.g., this will disable update check under Options ▸ Online Update:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\LibreOffice\org.openoffice.Office.Jobs\Jobs\org.openoffice.Office.Jobs:Job['UpdateCheck']\Arguments\AutoCheckEnabled]
      "Value"="false"
      "Final"=dword:00000001
      "Type"="xs:boolean"

    Read about it in the LibreOffice 4.2 Release Notes. Also see Windows Group Policy ADMX files below

    Windows Group Policy ADMX files

    LibreOffice can be configured and managed in a Windows Domain using Group Policy ADMX files. For more information also see:

    Configuration Extension

    LibreOffice can also be configured by a configuration extension. For more information read Media:LibreOffice config extension writing.pdf and the accompanying sample OXT configuration extension.

    Removing LibreOffice and Help Pack

    On a system with LibreOffice already installed, you can get the uninstall string for that particular version, the same one for all languages. Create an empty text file called LibreOfficeUninstall.vbs (or whatever you prefer), enter the following using Notepad:

    Const HKEY_LOCAL_MACHINE = &H80000002
      Const HKEY_USERS = &H80000003
      
      Set Reg = GetObject("winMgMts:StdRegProv")
      iRet = Reg.EnumKey(HKEY_USERS, "S-1-5-19", AKeys)
      If iRet <> 0 Then
      	Dim UAC : Set UAC = CreateObject("Shell.Application")
      	UAC.ShellExecute WScript.FullName, Chr(34) & WScript.ScriptFullName & Chr(34), "", "runas", 1
      	WScript.Quit
      End If
      
      Set WI = CreateObject("WindowsInstaller.Installer")
      Dim WshShell : Set WshShell = CreateObject("WScript.Shell")
      
      ' https://msdn.microsoft.com/en-us/library/windows/desktop/aa369487(v=vs.85).aspx
      Const msiUILevelBasic = 3
      Const msiUILevelNone = 2
      Const msiUILevelHideCancel = 32
      WI.UILevel = msiUILevelBasic
      
      Set Products = WI.Products
      For Each Product In Products
      	On Error Resume Next
      	Name = WI.ProductInfo(Product, "ProductName")
      
      	If Left(Name, Len("LibreOffice")) = "LibreOffice" Then
      		LocalPackage = WI.ProductInfo(Product, "LocalPackage")
      		If Not IsEmpty(LocalPackage) Then
      			WI.InstallProduct LocalPackage, "REMOVE=ALL"
      		Else
      			WshShell.Run "msiexec /qb! /uninstall " & Product, 0, True
      		End If
      	End If
      Next

    Save, exit Notepad and run the script.