Office LTSC Standard Plus 2024
Paquet d’installation silencieuse pour Office LTSC Standard Plus 2024
16.0.17932.20638-1
Office
Office
- package: tis-microsoft-office-2024-standard
- name: Office LTSC Standard Plus 2024
- version: 16.0.17932.20638-1
- categories: Office
- maintainer: WAPT Team,Tranquil IT,Jimmy PELÉ,Clément Baziret,Flavien Schelfaut
- 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: 3.63 Go
- installed_size: 2.36 Go
- homepage : https://www.office.com/
- conflicts :
package : tis-microsoft-office-2024-standard
version : 16.0.17932.20638-1
architecture : x64
section : base
priority : optional
name : Office LTSC Standard Plus 2024
categories : Office
maintainer : WAPT Team,Tranquil IT,Jimmy PELÉ,Clément Baziret,Flavien Schelfaut
description : Microsoft Office 2024 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-2019-standard,tis-microsoft-office-2021-standard
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 2024 est une version de la suite Microsoft Office
description_pl : Microsoft Office 2024 to wersja pakietu biurowego Microsoft Office
description_de : Microsoft Office 2024 ist eine Version der Microsoft Office-Suite
description_es : Microsoft Office 2024 es una versión del paquete Microsoft Office
description_pt : O Microsoft Office 2024 é uma versão do pacote Microsoft Office
description_it : Microsoft Office 2024 è una versione della suite Microsoft Office
description_nl : Microsoft Office 2024 is een versie van de Microsoft Office-suite
description_ru : Microsoft Office 2024 - это версия пакета Microsoft Office
audit_schedule :
editor : Microsoft
keywords : microsoft,office,2024,version,suite
licence : proprietary_restricted,wapt_public
homepage : https://www.office.com/
package_uuid : 9e8f8e47-5187-4459-b150-2d8c02fec898
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-01-19T18:46:29.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 : psove4iVQ1JqxnlI0ukAPYCT0edObuM0S7g5Q45AbdyA62KYeRiWYu1Fh+gSMDX/ACyOXWtIvwsm2ZAOIRNKDUJiVARXYZUjeyM3HFXsT6vYLj+vjggeesGKq2E0n+WF15uYikDzyR36mJpyhk/QWgdm3ywg/TSySrIsEkgn/goPaFEQ3Zw6Wqo7mfjiifmwBr58NzcTuKJOznJ0C/hZr7sTeOwcgSXE/TlBF9ROK9RNXdKnP8sqcblKWWW3PzWBakO+HL35EnpvifPOhfnSrzgG4f5dd5q2jFEMHsdC358iKdm9uS0tGOtFotVQW4+AQqQI0XK4hfRZ0Fv+tfi0Xg==
# -*- coding: utf-8 -*-
from setuphelpers import *
from setupdevhelpers 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
Office 2024 Deploy:
https://learn.microsoft.com/en-us/office/ltsc/2024/deploy
"""
app_uninstallkey = "Standard2024Volume - 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")
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 *
from setupdevhelpers import *
import waptguihelper
import webbrowser
import os
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
25e171baccb6b6a355b0599e1c879950fd5f8a7db547c82a215edce20d9e97b5 : Office/Data/16.0.17932.20638/a640_exp.cab
194eff39dd958d09902b90e0020cfcb2d0c6ba2223ef766a367b40faa94cf173 : Office/Data/16.0.17932.20638/i640.cab
8b8f0fde4d9801bee341a0c8857a1f8077885d025b86fc2a55e2679b168d5a5a : Office/Data/16.0.17932.20638/i640.cab.cat
ad22143d2aacc466d2140ab1135e8284925f0b95ac0fc3f723e30edead0a6fc2 : Office/Data/16.0.17932.20638/i641036.cab
67d1aeee6f25c84b8102d8ffa0e7d86dd54b3c6714d02cf408e10d1118107c71 : Office/Data/16.0.17932.20638/s640.cab
2d5f2809eea154cb0da29aa307ad1a6b09d18f3181d63006f3335d35ab9cd0e3 : Office/Data/16.0.17932.20638/s641036.cab
f52659919f002adc9e8d933bbf0f117d1b1ca608fec154fa503e2ea5387d52b8 : Office/Data/16.0.17932.20638/sa640.cab
8ea94f69475b7bf0b73ca6ad756718697270d1c625348331518df40b3caa0581 : Office/Data/16.0.17932.20638/stream.x64.fr-fr.dat
6dca50ad4590f9af4fad14575c3e7b16db765ba1901bc012851e14dfc43b34ae : Office/Data/16.0.17932.20638/stream.x64.fr-fr.dat.cat
519448cdb29621e1a989c1d3bdd82b6aeb71e9e691815ad2f5aa1ffd6df607c4 : Office/Data/16.0.17932.20638/stream.x64.x-none.arm64x.dat
885da203bea5f7284c4af6acf07a5d6d9e1dc9e276b9a64f045558a4a0c1356d : Office/Data/16.0.17932.20638/stream.x64.x-none.arm64x.dat.cat
6ce21a28b93a1c2c43ae60ba5419fc3a5e54c879fd7acba2e160dc1ced582519 : Office/Data/16.0.17932.20638/stream.x64.x-none.dat
4541ddc00ca0c88e2069ed9f1bc459e5b44b314bb5aa3d99ffc0cf7b493c5783 : Office/Data/16.0.17932.20638/stream.x64.x-none.dat.cat
14469967c269e753b8b17f7f343fd6e47bf7340828ece69d9304c42ecc5a8fd7 : Office/Data/v64.cab
14469967c269e753b8b17f7f343fd6e47bf7340828ece69d9304c42ecc5a8fd7 : Office/Data/v64_16.0.17932.20638.cab
38d056ab130f7bf7c481c12636a4e9959de36561d3dfcbe54c6e3571bc0c1dc3 : WAPT/certificate.crt
4b23ffcbf5a5e038e303d2c75770b3ac3800b722577e42318827b42f481070dc : WAPT/control
2ac98141bf5b6777083f2bcbeab3ab034c01dff77718e108774575aaaa54a144 : WAPT/icon.png
f43323245ae945b40a8953b112c178b78955dcb2462d107c6370e3907ffef1c8 : configuration.xml
b56aad9727666cce899a30ed0e7559b5f26d92bf5b6147e68f017cf4f46edc6b : luti.json
351515c5c720e0282e1bdd11543d2a0cf1a45910480ca45a1232ffd3dcdd1566 : setup.exe
09bc32e325641c9be4134d9e3f8b26b65e54641c4d9977cbd669834a04c73e5d : setup.py
ff3eca9f30b2ddbc22eb722c7fa58cf21eb30c24b0676118b0e8ee87f4a04360 : update_package.py