📋 Table of Contents
A file named setup.exe, a rollout due Friday, and a vendor page that says nothing about unattended installation — that is where a lot of Windows deployment work starts. Before throwing switches at the file until one works, answer a different question: which framework built this installer? Setup files are almost never hand-written. They come from a small set of toolkits — Windows Installer (MSI), NSIS, Inno Setup, Squirrel, or MSIX packaging — and each toolkit has a fixed, documented set of behaviors.
Identification is quick and needs nothing exotic. The extension settles .msi and .msix outright. For a bare setup.exe, the Details tab of the file's Properties dialog plus an attempt to open the file in 7-Zip classifies most of what you will meet. Once you know the framework, the silent switch family, install scope, uninstall registry footprint, repair story, and extraction options stop being guesswork — they are documented properties you can look up.
1 Identify the framework before anything else
A .msi file is a Windows Installer database, full stop, and .msix or .appx is a signed app package. Everything else arrives as an .exe wrapper that could hold an NSIS archive, an Inno Setup archive, a Squirrel package, or an embedded MSI behind a bootstrapper.
For an unknown .exe, read the Details tab of its Properties dialog first: NSIS-built installers frequently say "Nullsoft Install System" right there in the version information. Inno Setup is quieter in the version block, but the string "Inno Setup" is embedded in the binary, and a plain text search will surface it. Then try 7-Zip's Open archive command. An NSIS installer generally opens and lists its payload; an MSI opens as compound storage with cryptic stream names; an Inno Setup installer refuses to open at all in stock 7-Zip, and that refusal is itself a strong hint — the third-party innoextract tool exists precisely to fill that gap. Grab the 7-Zip offline installer if the machine lacks it.
If the application is already installed somewhere, the uninstaller names the framework for you: unins000.exe in the program folder means Inno Setup, a bare uninstall.exe is the common NSIS pattern, and an Update.exe under %LocalAppData% points at Squirrel. Registry uninstall keys ending in _is1 are another Inno signature. Before running any unknown binary, verify the download first.
2 MSI: the format Windows itself understands
An MSI is not a program; it is a relational database executed by the Windows Installer service, which makes it the only mainstream format where the operating system itself owns install, uninstall, and repair. The switch family is fixed and documented in Microsoft's msiexec reference: msiexec /i package.msi /qn /norestart installs silently, /l*v install.log writes a verbose log, /x uninstalls, and /f repairs.
Scope is controlled by the ALLUSERS property, and business software almost always installs per-machine, writing its uninstall entry under HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall keyed by the product code GUID. That GUID is stable currency — msiexec /x {GUID} /qn removes the product from any tool that can run a command line — and repair works both on demand via /f and automatically when an application's advertised components go missing. An administrative install, msiexec /a package.msi, unpacks the payload without installing anything, which is the sanctioned extraction route. Group Policy and Configuration Manager treat MSI as a native citizen. The full switch family, alongside the other frameworks' equivalents, is collected in the silent install switches guide.
3 NSIS: small, common, and script-defined
NSIS, the Nullsoft Scriptable Install System, has a large footprint among free and open-source Windows software — VLC's installer is a well-known example. The word scriptable is the point: everything the installer does was written by its author, so the format itself promises little, though its conventions are stable.
Silent mode is /S — capital, case-sensitive, and a steady source of tripped-up scripts. A target directory rides in /D=C:\Some Path, which must be the last argument on the line and must not be quoted even when the path contains spaces. There is no standard logging switch and no repair verb; the accepted fix for a broken install is running the installer again over the top.
Uninstall follows the same pattern: the script writes an uninstaller, typically uninstall.exe, which usually honors /S too, plus an uninstall registry key named whatever the author chose. Install scope is whatever the script requested. For extraction, 7-Zip can usually pull the payload straight out of the exe — useful for building a portable copy, though registry writes, services, and shortcuts defined in the script never happen that way.
4 Inno Setup: consistent switches, predictable footprint
Inno Setup, documented at jrsoftware.org, sits behind a huge amount of mainstream Windows software; Visual Studio Code's setup is a prominent example. Unlike NSIS, its command-line switches come from the framework rather than the package author, so they behave consistently across nearly everything built with it.
/VERYSILENT shows nothing, /SILENT shows only a progress window, and unattended work normally adds /NORESTART and /SUPPRESSMSGBOXES. A destination goes in /DIR="C:\Apps\Tool", a log comes from /LOG="setup.log". Recent versions also accept /ALLUSERS and /CURRENTUSER when the package was built to allow the override — that depends on both the Inno version and the author's choices, so test it before relying on it.
The footprint is unusually predictable: unins000.exe and unins000.dat in the application folder, and an uninstall key named after the AppId with _is1 appended. Silent removal is unins000.exe /VERYSILENT /NORESTART. There is no repair mechanism — reinstalling over the existing copy is the supported path — and extraction is the job of the open-source innoextract tool.
5 Squirrel and the per-user installers
Squirrel is the odd one out because you may not notice you ran an installer. Double-click a Squirrel Setup.exe and there is no wizard, no directory prompt, and no UAC elevation; the application simply appears under %LocalAppData% and launches. Discord's Windows client has shipped this way for years; the classic Teams client did too. The design goal was frictionless consumer updates — close to the opposite of what a managed environment wants.
The consequences are blunt. Installation is strictly per-user: installing as an administrator delivers the application to the administrator and nobody else, every profile gets its own copy, and the uninstall entry lands in HKCU rather than HKLM. The bundled Update.exe keeps the app current on its own schedule, which fights version pinning and offline machines alike. Command-line control is thin and varies between applications, so read the vendor's documentation rather than assuming a switch family exists. Some vendors publish a separate machine-wide MSI that stages the per-user installer into each profile at sign-in; that is a wrapper, not an ordinary MSI, and the visible application still lives per-user.
6 MSIX and AppX: packages rather than programs
MSIX, and the older AppX format it extends, abandons the run-a-program model entirely. A package is a signed, zip-based container with a declarative manifest — an archive tool can look inside — and there is no author-written install logic. Windows performs the installation itself and tracks every file and registry entry, which is why removal leaves so little behind. AppX was tied to UWP applications; MSIX brings the same model to conventional Win32 software, and Microsoft's rebuilt Teams client ships this way. The documentation lives at learn.microsoft.com.
The vocabulary changes with the model. A user installs a package by double-clicking it or with Add-AppxPackage -Path package.msix; a machine is prepared by provisioning, via Add-AppxProvisionedPackage or DISM, which stages the package so each new user gets it registered at first sign-in. The payload is stored once under C:\Program Files\WindowsApps with per-user registration layered on top. Removal is Remove-AppxPackage, and packaged applications do not appear under the classic Uninstall registry key at all — enumerate them with Get-AppxPackage. A package signed with a certificate the machine does not trust will not install, so certificate distribution belongs in the deployment plan.
Conclusion
A lot of the pain in Windows deployment comes from treating every installer as a black box, and none of them are. Spend the first few minutes identifying the framework, and the switch family, install scope, uninstall string, and extraction route all turn into look-up work in documentation that already exists. Keep a short per-application note of what you found — the next rollout starts from that note instead of from scratch.