Office Professional Plus 2019
Silent install package for Office Professional Plus 2019
16.0.10417.20228-15
Office
Office
- package: tis-microsoft-office-2019-professional
- name: Office Professional Plus 2019
- version: 16.0.10417.20228-15
- categories: Office
- maintainer: WAPT Team,Tranquil IT,Jimmy PELÉ,Clément Baziret
- editor: Microsoft
- licence: proprietary_restricted,wapt_public
- locale: all
- target_os: windows
- impacted_process: EXCEL,GROOVE,MSACCESS,MSPUB,ONENOTE,OUTLOOK,POWERPNT,WINWORD
- architecture: x64
- signature_date:
- size: 1.83 Go
- installed_size: 2.36 Go
- homepage : https://www.office.com/
- conflicts :
package : tis-microsoft-office-2019-professional
version : 16.0.10417.20228-15
architecture : x64
section : base
priority : optional
name : Office Professional Plus 2019
categories : Office
maintainer : WAPT Team,Tranquil IT,Jimmy PELÉ,Clément Baziret
description : Microsoft Office 2019 is a version of the Microsoft Office suite
depends :
conflicts : tis-microsoft-access-2016-runtime,tis-microsoft-office-2016,tis-microsoft-office-2013,tis-microsoft-office-365-entreprise,tis-microsoft-office-2021-professional
maturity : PROD
locale : all
target_os : windows
min_wapt_version : 2.3
sources : https://www.microsoft.com/download/details.aspx?id=49117
installed_size : 2362231960
impacted_process : EXCEL,GROOVE,MSACCESS,MSPUB,ONENOTE,OUTLOOK,POWERPNT,WINWORD
description_fr : Microsoft Office 2019 est une version de la suite Microsoft Office
description_pl : Microsoft Office 2019 to wersja pakietu biurowego Microsoft Office
description_de : Microsoft Office 2019 ist eine Version der Microsoft Office-Suite
description_es : Microsoft Office 2019 es una versión de la suite Microsoft Office
description_pt : O Microsoft Office 2019 é uma versão do pacote Microsoft Office
description_it : Microsoft Office 2019 è una versione della suite Microsoft Office
description_nl : Microsoft Office 2019 is een versie van de Microsoft Office-suite
description_ru : Microsoft Office 2019 - это версия пакета Microsoft Office
audit_schedule :
editor : Microsoft
keywords : microsoft,office,2019,version,suite
licence : proprietary_restricted,wapt_public
homepage : https://www.office.com/
package_uuid : 2ab922e8-37db-4ca3-bf0f-3fedc55ddb0f
valid_from :
valid_until :
forced_install_on :
changelog :
min_os_version : 10.0
max_os_version :
icon_sha256sum : 2ac98141bf5b6777083f2bcbeab3ab034c01dff77718e108774575aaaa54a144
signer : Tranquil IT
signer_fingerprint: 8c5127a75392be9cc9afd0dbae1222a673072c308c14d88ab246e23832e8c6bb
signature_date : 2026-10-14T00:36:30.000000
signed_attributes : package,version,architecture,section,priority,name,categories,maintainer,description,depends,conflicts,maturity,locale,target_os,min_wapt_version,sources,installed_size,impacted_process,description_fr,description_pl,description_de,description_es,description_pt,description_it,description_nl,description_ru,audit_schedule,editor,keywords,licence,homepage,package_uuid,valid_from,valid_until,forced_install_on,changelog,min_os_version,max_os_version,icon_sha256sum,signer,signer_fingerprint,signature_date,signed_attributes
signature : WqdXnMN7XzYf2m0ehxfA3wvSfP3Lx6ImKbm+G3ZpPOGdPqNpTs59MF3QXddhrybxGXMzD7FqKbLgceC8nkttI8mCdUrmW1gaCkj/roHuDvRwYWOhsNpj27PPiTmkrfKgmh61LCzU4TqzewzNEPJVRJG47hxLsuUy04NNez/5Co+EJYAOrE9C2+8nx9kLr/qQ9vy9iE7tqPvikNL5y5ctsCVm06cyQO12VtJy3jYjs79TY1qh4l9IqL5yJE1gHM1hGUowb46z4k9TCvxmrL0o03wMXulMG+xfrtoshk7T/soWbwFlCkIqW/dM3BXct6kg1+BoACHvQtfxCvFi0Wz0RA==
# -*- coding: utf-8 -*-
from setuphelpers import *
import tempfile
"""
Ressources:
https://config.office.com/deploymentsettings
https://admx.help/?Category=Office2016&Policy=office16.Office.Microsoft.Policies.Windows::L_SCLCacheOverride
https://admx.help/?Category=Office2016&Policy=excel16.Office.Microsoft.Policies.Windows::L_SaveExcelfilesas
"""
app_uninstallkey = "ProPlus2019Volume - fr-fr"
def install():
# Declaring local variables
package_version = control.get_software_version()
silentflags = "/configure configuration.xml"
# uninstalling older versions of office if needed
uninstall_mso2013_if_needed("Office15.STANDARD")
uninstall_mso2016_if_needed("Office16.STANDARD")
# uninstalling other versions of office if needed
uninstall_other_office_edition(app_uninstallkey.split(" ")[0])
# Installing the software
install_exe_if_needed(
"setup.exe",
silentflags=silentflags,
timeout=1200,
accept_returncodes=[1641, 3010, 0],
key=app_uninstallkey,
min_version=package_version,
)
# TODO "setup.exe /customize configuration.xml if up-to-date"
# Adding silent uninstall command
quiet_uninstall = installed_softwares(uninstallkey=app_uninstallkey)[0]["uninstall_string"] + " DisplayLevel=False"
if "OfficeClickToRun.exe" in quiet_uninstall:
register_uninstall(
uninstallkey=app_uninstallkey,
quiet_uninstall_string=quiet_uninstall,
)
def session_setup():
print("Disabling: MSO telemetry")
# https://admx.help/?Category=Office2016&Policy=office16.Office.Microsoft.Policies.Windows::L_OfficeOSMPreventedHostApplications
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "wdsolution", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "xlsolution", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "pptsolution", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "olksolution", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "accesssolution", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "projectsolution", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "publishersolution", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "visiosolution", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedapplications", "onenotesolution", 1)
# https://admx.help/?Category=Office2016&Policy=office16.Office.Microsoft.Policies.Windows::L_OfficeOSMPreventedSolutionTypes
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedsolutiontypes", "documentfiles", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedsolutiontypes", "templatefiles", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedsolutiontypes", "comaddins", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedsolutiontypes", "appaddins", 1)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm\preventedsolutiontypes", "agave", 1)
# https://admx.help/?Category=Office2016&Policy=office16.Office.Microsoft.Policies.Windows::L_EnableLogging
# registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm", "enablelogging", 0)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm", "enableupload", 0)
registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\osm", "enablefileobfuscation", 1)
# # https://admx.help/?Category=Office2016&Policy=office16.Office.Microsoft.Policies.Windows::L_Onlinecontentoptions
# registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\common\internet", "useonlinecontent", 0)
# # https://admx.help/?Category=Office2016&Policy=office16.Office.Microsoft.Policies.Windows::L_ServiceLevelOptions
# registry_set(HKEY_CURRENT_USER, r"software\policies\microsoft\office\16.0\common\internet", "serviceleveloptions", 0)
def uninstall_other_office_edition(edition_uninstallkey):
# Initializing variables
silent_uninstall_file_path = makepath(tempfile.gettempdir(), "remove_other_office.xml")
uninstall_configuration_xml_content = r"""<Configuration>
<Remove All="TRUE">
</Remove>
<Display Level="none" CompletionNotice="No" SuppressModal="Yes" AcceptEula="Yes" />
<Setting Id="SETUP_REBOOT" Value="Never" />
<Setting Id="REBOOT" Value="ReallySuppress"/>
</Configuration>
"""
# Modify XML
with open(silent_uninstall_file_path, "w") as xml_file:
xml_file.write(uninstall_configuration_xml_content)
# Uninstalling Office if needed
for to_uninstall in installed_softwares():
killalltasks(control.get_impacted_process_list())
if ("OfficeClickToRun.exe" in to_uninstall["uninstall_string"]) and not (edition_uninstallkey in to_uninstall["key"]):
print("Removing: %s (%s)" % (to_uninstall["name"], to_uninstall["version"]))
app_uninstall_cmd = to_uninstall["uninstall_string"] + " DisplayLevel=False"
run(app_uninstall_cmd)
wait_uninstallkey_absent(to_uninstall["key"])
def uninstall_mso2016_if_needed(uninstallkey):
# Initializing variables
silent_uninstall_file_path = makepath(tempfile.gettempdir(), "remove_o2016.xml")
uninstall_configuration_xml_content = r"""<Configuration>
<Remove All="TRUE">
</Remove>
<Display Level="none" CompletionNotice="No" SuppressModal="Yes" AcceptEula="Yes" />
<Setting Id="SETUP_REBOOT" Value="Never" />
<Setting Id="REBOOT" Value="ReallySuppress"/>
</Configuration>
"""
# Modify XML
with open(silent_uninstall_file_path, "w") as xml_file:
xml_file.write(uninstall_configuration_xml_content)
# Uninstalling Office if needed
for to_uninstall in installed_softwares(uninstallkey=uninstallkey):
print("Removing: %s (%s)" % (to_uninstall["name"], to_uninstall["version"]))
killalltasks(control.get_impacted_process_list())
if "OfficeClickToRun.exe" in to_uninstall["uninstall_string"]:
app_uninstall_cmd = to_uninstall["uninstall_string"] + " DisplayLevel=False"
run(app_uninstall_cmd)
wait_uninstallkey_absent(to_uninstall["key"])
else:
run(to_uninstall["uninstall_string"] + ' /config "%s"' % silent_uninstall_file_path)
wait_uninstallkey_absent(to_uninstall["key"])
def uninstall_mso2013_if_needed(uninstallkey):
# Initializing variables
silent_uninstall_file_path = makepath(tempfile.gettempdir(), "remove_o2013.xml")
uninstall_configuration_xml_content = r"""<Configuration>
<Remove All="TRUE">
</Remove>
<Display Level="none" CompletionNotice="No" SuppressModal="Yes" AcceptEula="Yes" />
<Setting Id="SETUP_REBOOT" Value="Never" />
<Setting Id="REBOOT" Value="ReallySuppress"/>
</Configuration>
"""
# Modify XML
with open(silent_uninstall_file_path, "w") as xml_file:
xml_file.write(uninstall_configuration_xml_content)
# Uninstalling Office if needed
for to_uninstall in installed_softwares(uninstallkey=uninstallkey):
print("Removing: %s (%s)" % (to_uninstall["name"], to_uninstall["version"]))
killalltasks(control.get_impacted_process_list())
run(to_uninstall["uninstall_string"] + ' /config "%s"' % silent_uninstall_file_path)
wait_uninstallkey_absent(to_uninstall["key"])
# -*- coding: utf-8 -*-
from setuphelpers import *
import waptguihelper
import webbrowser
import os
import sys
if "__file__" in locals():
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
from setupdevhelpers import *
def update_package():
# Declaring local variables
package_updated = False
proxies = get_proxies()
if not proxies:
proxies = get_proxies_from_wapt_console()
extract_path = "extract"
# if not the first run it will use the last setup downloaded if you want to get an updated one you can remove setup.exe and relaunch the update package
if not isfile("setup.exe") and not params.get("running_as_luti"):
waptguihelper.message_dialog(
"You browser will open",
"Please download Office Deployment Tool by clicking the download button",
)
webbrowser.open("https://www.microsoft.com/download/details.aspx?id=49117")
waptguihelper.message_dialog("Waiting for download", "Click OK when the download is complete", waptguihelper.ID_OK)
# Copy to pkg
latest_bin = waptguihelper.filename_dialog(
"Please provide downloaded Office Deployment Tool to copy in this package",
makepath(user_home_directory, "Downloads"),
"",
"EXE Files|*.exe",
)
# Extract Office Deployment Tool
print("Copying: " + latest_bin)
run(rf'"{latest_bin}" /extract:"{extract_path}" /quiet"')
print("Extract Office Deployment Tool")
filecopyto(".\\extract\\setup.exe", basedir)
remove_file(latest_bin)
if isdir("extract"):
remove_tree("extract")
elif params.get("running_as_luti"):
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/88.0'
data = [ u for u in json.loads(wgets('https://www.microsoft.com/en-us/download/details.aspx?id=49117',user_agent=user_agent,proxies=proxies).split('<script>window.__DLCDetails__=',1)[1].split('</script>')[0])["dlcDetailsView"]['downloadFile'] if u['name'].endswith('.exe')][0]
download_url = data['url']
latest_bin = download_url.split("/")[-1]
wget(download_url, latest_bin, proxies=proxies)
# Extract Office Deployment Tool
print("Copying: " + latest_bin)
run(rf'"{latest_bin}" /extract:"{extract_path}" /quiet"')
print("Extract Office Deployment Tool")
filecopyto(".\\extract\\setup.exe", basedir)
remove_file(latest_bin)
if isdir("extract"):
remove_tree("extract")
# if not the first run it will use the last XML used if you want to get a new one you can remove configuration.xml and relaunch the update package
if not isfile("configuration.xml"):
waptguihelper.message_dialog(
"Your browser will open",
"Please complete your deployment settings with the online Office Customization Tool and download it by clicking Export.\nNote that you can go back anytime on the online tool to edit your configuration (by clicking Import)",
)
webbrowser.open("https://config.office.com/deploymentsettings")
waptguihelper.message_dialog("Waiting for download", "Click OK when the XML is completed and downloaded", waptguihelper.ID_OK)
xml_configuration = waptguihelper.filename_dialog(
"Please select your XML configuration file", basedir, "configuration.xml", "XML Files|*.xml"
) # makepath(user_home_directory, "Downloads")
if not isfile("configuration.xml"):
filecopyto(
xml_configuration,
basedir + "\\configuration.xml",
)
# Asking to remove the last downloaded sources
if isdir("Office"):
if not params.get("running_as_luti"):
response = ask_message(control.package, "Do you want to remove the last downloaded sources?", 35)
if response == 6:
print("Removing last sources folder downloaded")
remove_tree("Office")
else:
print("Removing last sources folder downloaded")
remove_tree("Office")
else:
# Download Office with XML configuration
print("Downloading Office with XML configuration")
if windows_version() >= WindowsVersions.Windows10:
run("setup.exe /download configuration.xml", timeout=2400) # DisplayLevel=Full # not working
else:
error("MSO setup.exe can no longer be run on this OS")
# Getting version from source dir
version = glob.glob("Office/Data/**/")[0].split(os.sep)[1]
# Changing version of the package
if Version(version, 4) > Version(control.get_software_version(), 4):
print("Software version updated (from: %s to: %s)" % (control.get_software_version(), Version(version)))
package_updated = True
else:
print("Software version up-to-date (%s)" % Version(version))
control.set_software_version(version)
control.save_control_to_wapt()
# Getting Product ID and Language ID from configuration.xml parsing file
with open("configuration.xml", "r", encoding="utf8") as f:
for line in f:
if "OfficeClientEdition" in line:
architecture = line.split('"')[1]
print("OfficeClientEdition: %s" % architecture)
if architecture == "64":
architecture = "x64"
else:
architecture = "all"
if "Product ID" in line:
product_id = line.split('"')[1]
print("Product ID: %s" % product_id)
if "Language ID" in line:
language_id = line.split('"')[1]
print("Language ID: %s" % language_id)
break
if control.architecture != architecture:
control.architecture = architecture
control.save_control_to_wapt()
# Asking pkg infos if needed
if control.locale not in language_id and "-template" in control.package:
control.locale = waptguihelper.input_dialog(control.package, "You may wanna change locale to: %s" % language_id.split("-")[0], "all")
print("Changing locale to: %s in WAPT\\control" % control.locale)
control.save_control_to_wapt()
complete_control_categories(control)
complete_control_name(control, control.name, params.get("running_as_luti"))
complete_control_package(control, control.package, params.get("running_as_luti"), False)
complete_control_description(control, control.description, params.get("running_as_luti"), "update_package")
# changing uninstallkey:
new_lines = []
with open("setup.py", "r", encoding="utf8") as f:
for line in f.readlines():
if line.startswith("app_uninstallkey"):
line = f'app_uninstallkey = "{product_id} - {language_id}"\n'
print(f'uninstallkey in setup updated to app_uninstallkey = "{product_id} - {language_id}"\n')
new_lines.append(line)
with open("setup.py", "w", encoding="utf8", newline="\n") as f:
f.writelines(new_lines)
# Validating or not update-package-sources
return package_updated
20413346e0f09eb2e0099962f80556ad3c86652db219c943887258194bffabe5 : Office/Data/16.0.10417.20228/i640.cab
607942b3215db0046bcaf85136aea389714e5759f5e657f646bde314f9fb6349 : Office/Data/16.0.10417.20228/i641036.cab
880966b289f980bd8ffcc942aabbcba08e8b84164cf3bbfbd326cdc6d4239b03 : Office/Data/16.0.10417.20228/s640.cab
9f147711bb2ffabd7cf96f68d1b4c49e3e5b0dc441faf2b2f5fe3f27d85ddb65 : Office/Data/16.0.10417.20228/s641036.cab
cd834d43f3feca98a91e0b6c33d61c0d026975fcc61d72e84d0ead5304eb8128 : Office/Data/16.0.10417.20228/stream.x64.fr-fr.dat
35abead3c413a34fba38161feb363bbf29d10095a3118cc3aa249aa171e124cc : Office/Data/16.0.10417.20228/stream.x64.x-none.dat
4677d696359d67a0797ad58e0e3318b82005c755d2c9bada535807cc9d7daad1 : Office/Data/v64.cab
4677d696359d67a0797ad58e0e3318b82005c755d2c9bada535807cc9d7daad1 : Office/Data/v64_16.0.10417.20228.cab
38d056ab130f7bf7c481c12636a4e9959de36561d3dfcbe54c6e3571bc0c1dc3 : WAPT/certificate.crt
6fd08d005ad2bb794a93dece55f395f9ed004e1610d6a6f0bcaf61b347c4335c : WAPT/control
2ac98141bf5b6777083f2bcbeab3ab034c01dff77718e108774575aaaa54a144 : WAPT/icon.png
7eb05cc943589398d6b982282a297fd73a3e7c492623992d2327f3d6d3d2e548 : configuration.xml
ec01e2e8686d0e4c5574a363bf6679c43b419bb58f63b3ec8db727a1e5e6e0b6 : luti.json
50facf295f357d8230b4d50678536148e32f34b4ac33387269d5a72c93ff810a : setup.exe
c1524176d32ee4d4bb7b488cc26e018b5347caed89d095a33c24050145969bd8 : setup.py
253f0ac3ab3e7dac7aa743a436b5f0cf5c85ec36c26125796490880642c6a82a : setupdevhelpers.py
a67f6256df6a80c09565d82c14331aeba6530e8eb093bb9bdd48ff8357d36391 : update_package.py