Related Content
Frequently Asked Questions
Still deciding?
Ask Mingo answers from our docs and customer stories.
Flamingo Raises $4.5M Seed Round · Led by Vertex Ventures, bringing total funding to $6.7M to build the open, AI-native layer for IT and security.
Installing Microsoft 365 Apps by hand works for one laptop and eats an afternoon by the tenth. Every machine should end up with the same apps, languages and update channel, and nobody should have to click Next. This guide shows how the Office Deployment Tool does that with one setup.exe and one XML file, from first download to fleet-wide push.
setup.exe /download stages files, and setup.exe /configure installs, changes or removes Office.The Office Deployment Tool is a free command-line tool from Microsoft that downloads and installs Click-to-Run Office. It covers Microsoft 365 Apps for enterprise and for business, the subscription Visio and Project apps, and volume-licensed Office LTSC 2024. Microsoft's ODT overview frames it as control: which products and languages go on, how they update, and whether users see the install.
The tool is two files. setup.exe is the engine and never changes between deployments. configuration.xml is the recipe: products, languages, channel, install source, display and licensing. You edit the recipe, then run the engine in one of its modes.
Download mode stages installation files in a folder. Configure mode installs, changes or removes Office. Customize mode applies app preferences to an existing install and nothing else. A help mode rounds it out. Older guides also show /packager for App-V packages, which Microsoft's current overview no longer documents.
One naming note: to admins, ODT means the Office Deployment Tool. The same letters are also the .odt extension of OpenDocument Text files, which have nothing to do with deployment.
The ODT ships on the Microsoft Download Center as a self-extracting file. Search there for "Office Deployment Tool" (details ID 49117). As of October 2026, the current build is 16.0.20326.20112, published September 9, 2026. Run it and pick a folder for setup.exe and the sample configuration files, or skip the prompts:
cmdofficedeploymenttool_20326-20112.exe /quiet /extract:C:\ODT
winget has it too. The community-maintained winget manifest points at Microsoft's download, tracks the same build and extracts to C:\Program Files\OfficeDeploymentTool:
cmdwinget install --id Microsoft.OfficeDeploymentTool
Use the newest build either way. Microsoft recommends checking before every download or install, and newer options depend on it: the TenantAssociationKey property needs version 16.0.19929.20062 or later. To check a copy, open setup.exe's Properties and look at the Details tab.
If the Download Center link fails, you're in good company. r/sysadmin traded workarounds when it returned 404s in March 2025:
You can write configuration.xml in Notepad, but Microsoft recommends the Office Customization Tool (OCT) instead. It's a free web form at config.office.com/deploymentsettings that writes the XML for you. Don't confuse it with the older OCT for MSI-based Office.
Sign in first if you want the file saved to your tenant, on the Device Configuration page of the Microsoft 365 Apps admin center. That's handy for a baseline you copy per department. Cloud storage isn't offered in 21Vianet, GCC, GCC High or DoD tenants.
The form runs top to bottom, and each section writes one part of the file:
Select Finish, check the summary, then Export. Import reopens an existing file for edits.
One trap: the OCT lets you pick languages that Visio and Project don't support, such as English (United Kingdom), French (Canada) or Spanish (Mexico). Microsoft lists it as a known issue, and the install fails unless you fix the XML by hand. Proofing-tools-only installs and MatchInstalled aren't in the OCT at all, so those still need a text editor.
Open an elevated Command Prompt in the ODT folder. Every mode takes an XML file:
cmdsetup.exe /download configuration.xml setup.exe /configure configuration.xml setup.exe /customize preferences.xml
Download mode saves files to the SourcePath in your XML, or next to setup.exe if there's none. Run it against a folder that already holds that build and it fetches only what's missing, such as one new language pack.
Configure mode needs local admin rights on the target. Run it on the client or from a share. With a share, pass full UNC paths for both setup.exe and the XML:
cmd\\server\share\Microsoft365Apps\setup.exe /configure \\server\share\Microsoft365Apps\configuration-cc.xml
A good run ends with "Products configured successfully." Customize mode ignores everything except app preferences and must run on the client. Its settings reach every current and future user of the device, and open apps pick them up at their next restart.
Wes Bryan's walkthrough runs an OCT-built file through ODT and checks the result, logs included:
Here's a complete file for a small office on Microsoft 365 Business Premium. It installs 64-bit Office on Monthly Enterprise Channel, in English plus the operating system's languages. Skype for Business stays out, the install is silent, and old MSI Office goes first.
xml<Configuration> <Add OfficeClientEdition="64" Channel="MonthlyEnterprise"> <Product ID="O365BusinessRetail"> <Language ID="en-us" /> <Language ID="MatchOS" /> <ExcludeApp ID="Lync" /> </Product> </Add> <Updates Enabled="TRUE" /> <RemoveMSI /> <Display Level="None" AcceptEULA="TRUE" /> <Property Name="FORCEAPPSHUTDOWN" Value="FALSE" /> </Configuration>
Add holds the what. Leave OfficeClientEdition out on a clean machine and ODT picks 64-bit, unless Windows is 32-bit or the device has under 4 GB of RAM. On a machine that already runs Office, the value must match the installed architecture or the install fails. Channel works the same way: Current on a clean machine, the existing channel otherwise. Without SourcePath, ODT looks next to setup.exe, then goes to the Office CDN.
The Product ID has to match the license, or Office won't activate. Microsoft's product ID list maps plans to IDs, and these come up most:
| Plan | Product ID |
|---|---|
| Microsoft 365 Business Standard or Business Premium | O365BusinessRetail |
| Microsoft 365 Apps for business | O365BusinessEEANoTeamsRetail |
| Microsoft 365 E3 or E5, Office 365 E3 or E5 | O365ProPlusRetail |
| Microsoft 365 Apps for enterprise | O365ProPlusEEANoTeamsRetail |
| Visio Plan 2 | VisioProRetail |
| Planner and Project Plan 3 or 5 | ProjectProRetail |
| Office LTSC Professional Plus 2024 | ProPlus2024Volume |
Office LTSC 2024 also needs Channel="PerpetualVL2024" and a PIDKEY attribute on the Product line, holding your KMS or MAK key.
Language sets the languages, and the first one becomes the Shell UI language for shortcuts, right-click menus and tooltips. Changing it later means a reinstall. MatchOS adds the operating system's base language and every active display language. When it's the only entry, add Fallback="en-us" for languages Office doesn't support.
ExcludeApp drops apps. Valid IDs are Access, Excel, Groove, Lync (Skype for Business), OneDrive, OneNote, Outlook, OutlookForWindows (the new Outlook), PowerPoint, Publisher, Teams and Word. Publisher is still valid, though Microsoft 365 subscribers lose Publisher on or shortly after October 1, 2026.
The last lines set behavior. Updates Enabled="TRUE" is the default and pulls updates from the CDN unless you set UpdatePath. Display Level="None" hides all progress and errors, and AcceptEULA="TRUE" skips the license dialog. FORCEAPPSHUTDOWN="TRUE" closes apps that block the install, and Microsoft warns that data loss might occur.
The channel decides how often a device gets new features. Microsoft lists three primary channels in its update channels overview, and security updates land on the second Tuesday of each month in all of them.
| Channel | New features | Each version is supported for |
|---|---|---|
| Current | At least monthly, no fixed day | Until the next version, usually about a month |
| Monthly Enterprise | Second Tuesday of every month | Three months, with three months of rollback |
| Semi-Annual Enterprise | January and July until 2026; Monthly Enterprise updates since Version 2606 | Version 2508 support ended September 8, 2026 |
That last row changed this year. Starting with Version 2606 in July 2026, Microsoft unified Semi-Annual Enterprise with Monthly Enterprise. Devices set to Semi-Annual now get the same feature and security updates and show as Monthly Enterprise under File, then Account. Channel="SemiAnnual" still works in XML, but it no longer buys a six-month feature freeze. Microsoft puts the first jump, from Version 2508 to 2606, at roughly 1.6 GB.
So the practical choice is Current or Monthly Enterprise. Microsoft's deployment guidance leads with Current and adds a Monthly Enterprise package for users who need a fixed cycle. Monthly Enterprise suits clients who want one predictable update a month. Current suits anyone who wants features and fixes as they ship.
Two more rules. One device runs one channel, so Office, Visio and Project on it must match. And three settings can own the channel. Channel in Add sets it at install, and Channel in Updates changes it later. The Update Channel policy in the Office administrative templates beats both, so if a device keeps snapping back, check Group Policy before the XML.
Leave SourcePath out and every machine pulls from the Office CDN. Microsoft recommends installing from the cloud with Intune or Configuration Manager, because there's no share to maintain. On Windows 10 and 11, Delivery Optimization helps cut the bandwidth.
A local share makes sense when bandwidth is thin or machines have no internet. Microsoft's local source guide uses one parent folder with a subfolder per channel, such as \\Server\Share\Microsoft365Apps\Current, readable by everyone. Run /download once per channel, then point every client's /configure at the share.
Two settings keep the share useful. AllowCdnFallback="True" fetches any missing language pack from the CDN instead of skipping it. UpdatePath sends updates to the share too, but then someone has to load every new build into it. Each package holds one channel and one architecture. For branch offices, DownloadPath with an explicit Version copies a build from a central share to a local one.
Click-to-Run and MSI versions of Office aren't supported side by side. Some older versions, Office Professional Plus 2016 among them, make the new install fail outright. Add <RemoveMSI /> and ODT first uninstalls 2007 to 2016 MSI versions of Office, Visio and Project, with their language packs and proofing tools. User settings and documents stay, per Microsoft's RemoveMSI guide.
RemoveMSI also takes SharePoint Designer, InfoPath, Lync 2013 or later, standalone Office apps, Access Runtime and the Access Database Engine redistributable. That last one can break line-of-business apps that read Access data. Keep a product by naming its Setup ID, such as VisPro, in IgnoreProduct. Add <Language ID="MatchPreviousMSI" /> to carry the old languages over.
xml<RemoveMSI> <IgnoreProduct ID="VisPro" /> </RemoveMSI>
On r/sysadmin, the case for ODT reinstalls comes with the same habit: script it, remove every other version, install one.
The uninstall needs a reboot that ODT doesn't force, so plan one. Older Click-to-Run installs such as Office 2019 need the Remove element instead. This file removes all Microsoft 365 Apps products and languages, Visio and Project included:
xml<Configuration> <Remove All="TRUE" /> <Display Level="None" AcceptEULA="TRUE" /> </Configuration>
Removal can fail if Word is open while Display Level is None. FORCEAPPSHUTDOWN gets past that by closing the app, unsaved work and all. Run forced jobs after hours, or set Display Level to Full so users get a prompt.
Normal activation ties Microsoft 365 Apps to a person's own devices, up to a limit such as five PCs. Shared computer activation covers machines several people sign in to: Remote Desktop Services and Azure Virtual Desktop hosts, shift PCs, meeting rooms. Turn it on in the OCT under Licensing and activation, or add one line:
xml<Property Name="SharedComputerLicensing" Value="1" />
Each user then gets their own licensing token per machine, stored in %localappdata%\Microsoft\Office\16.0\Licensing. It's valid for 30 days, renews while they work, and doesn't count toward the five-PC limit. Non-persistent VDI can roam it with the SCLCacheOverride properties.
Check licensing before you build the image. Per Microsoft's shared computer activation overview, it works with plans that include Microsoft 365 Apps for enterprise or desktop Visio or Project. It also works with Microsoft 365 Business Premium, the only business plan on the list, so Business Standard doesn't qualify. Unlicensed users land in reduced functionality mode: view and print, no editing.
On an existing install, add a REG_SZ value named SharedComputerLicensing, set to 1, under HKLM\SOFTWARE\Microsoft\Office\ClickToRun\Configuration, then reboot. Group Policy works too, except for Microsoft 365 Apps for business. Anyone who activated before the change needs their activation reset.
Microsoft's Azure Virtual Desktop image guide makes choices worth copying for any pooled host: 64-bit, Monthly Enterprise, RemoveMSI, shared activation and Updates Enabled="FALSE". Updates go into the image you redeploy, not onto hosts mid-session. The sample also leaves Teams and OneDrive out of the suite and installs them separately.
Adding languages doesn't mean reinstalling Office. Use LanguagePack as the product ID for a new display language, or ProofingTools for spelling and grammar only. ProofingTools is smaller and needs a hand-written file, since the OCT doesn't offer it. Per Microsoft's language deployment guide, a hand-written file reuses the existing architecture and source, so one file fits every group.
Visio and Project work the same way. This file adds Visio in the installed languages, at the installed version, without pulling a newer build:
xml<Configuration> <Add Channel="MonthlyEnterprise" Version="MatchInstalled" AllowCdnFallback="True"> <Product ID="VisioProRetail"> <Language ID="MatchInstalled" TargetProduct="All" /> </Product> </Add> <Display Level="None" AcceptEULA="TRUE" /> </Configuration>
Set Channel to whatever the device already runs, since Version="MatchInstalled" requires it. Two catches: a file containing MatchInstalled can't be used with /download, and Visio and Project don't support English (United Kingdom), French (Canada) or Spanish (Mexico).
ODT logs land in %temp% and C:\Windows\Temp, in files named after the computer plus a timestamp. Installs pushed by Intune, Configuration Manager or an RMM agent typically run as SYSTEM, so start in C:\Windows\Temp. Microsoft's Azure Virtual Desktop sample also sets a Logging element with its own folder, which makes collection easier.
For a stubborn failure, Microsoft's Intune troubleshooting steps turn on verbose logging, reproduce the problem, then turn it off:
cmdreg add HKLM\SOFTWARE\Microsoft\ClickToRun\OverRide /v LogLevel /t REG_DWORD /d 3 reg delete HKLM\SOFTWARE\Microsoft\ClickToRun\OverRide /v LogLevel /f
The exit code often points the way before you open a log. These meanings come from Microsoft's ODT error table:
| Exit code | What it means |
|---|---|
| 0 | Success |
| 1603 | MSI Office is still installed, or a 64-bit install was attempted over 32-bit |
| 17002 | Canceled by the user or by another installation, out of disk space, or an unknown language ID |
| 17004 | Unknown product ID |
| 17000 or 17001 | The Click-to-Run client failed to start or to queue the job |
| -2147418113 (0x8000ffff) | An uninstall ran on a machine with no Click-to-Run Office |
On a machine with free disk space and a valid language list, 17002 means another installer or a user canceled the job. Check what else was deploying at the time.
The XML is the portable part. Intune, Configuration Manager and an RMM all run the same file, so build it once and keep it versioned.
In Intune, go to Apps, All apps, Create, and pick Microsoft 365 Apps for Windows 10 and later. Use the configuration designer or paste your XML; Microsoft 365 Apps for business only works through XML. Intune delivers one Microsoft 365 Apps deployment per device, pulled from the Office CDN. For Autopilot devices tracked on the Enrollment Status Page, the Intune guide recommends a Win32 app package instead. That avoids install collisions that fail enrollment.
Configuration Manager has its own wizard under Software Library, Overview, Office 365 Client Management, with a built-in version of the OCT. If Configuration Manager will also manage updates, set OfficeMgmtCOM="True" in the Add element. It registers the COM object that update tools need and hides the Update Now button from users.
An RMM agent runs scripts as SYSTEM, which covers ODT's admin requirement. Stage setup.exe and the XML, run configure mode, and report the exit code and newest log:
powershell$odt = 'C:\ProgramData\ODT' New-Item -ItemType Directory -Path $odt -Force | Out-Null # Copy setup.exe and configuration.xml into $odt first (RMM file transfer or a readable share) $p = Start-Process -FilePath "$odt\setup.exe" -ArgumentList '/configure', "$odt\configuration.xml" -Wait -PassThru -WindowStyle Hidden "ODT exit code: $($p.ExitCode)" Get-ChildItem "$env:windir\Temp" -Filter "$env:COMPUTERNAME-*.log" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName
Our PowerShell commands guide covers the building blocks if scripting is new. Schedule the job after hours when the XML forces app shutdown. OpenFrame can run that script across a client's devices and collect every machine's output in one place. Each 1603 and 17002 then lands in one list.
The Office Deployment Tool is setup.exe plus one XML file, and the XML holds every decision. Build it in the Office Customization Tool and match the product ID to the license. Pick Current or Monthly Enterprise, since Semi-Annual now follows Monthly Enterprise, and add RemoveMSI wherever old Office might linger. Test on one machine, read the exit code, then hand the same file to Intune, Configuration Manager or your RMM. Our software deployment tools guide is the next read for pushing everything else to a fleet.
Head of Product Engineering
Hi! My name is Dmytro, but everyone calls me Dima. I’m a Software Developer and together with the development team, I help bring Flamingo to life — putting it on its feet from a technical perspective. Originally from Lviv, Ukraine 🇺🇦, but currently based in Spain, where I’ve been enjoying the blend of great weather, culture, and nature. I’m passionate about the mountains and love traveling — exploring new places and cultures really inspires me. These experiences constantly recharge me and give me a fresh perspective, both personally and professionally.
Still deciding?
Ask Mingo answers from our docs and customer stories.
Still deciding?
Ask Mingo answers from our docs and customer stories.