lessmsi: pulling the files and tables out of a Windows Installer package
A tool to view and extract the contents of an Windows Installer (.msi) file.
At a glance
- What is it?
- lessmsi is a C# utility with a command line, a GUI and a Windows Explorer shell entry that reads and extracts MSI files, licensed MIT and last pushed on 2026-04-02. It targets Windows only and exists to let packaging engineers inspect an installer without running it.
- Who is it for?
- Adopt lessmsi if you build or audit Windows Installer packages on Windows and need to see the embedded files and the underlying tables without running the installer. Do not reach for it on macOS or Linux, and do not treat it as a repacking or repackaging tool, since the README documents no rebuild, repack or transform command.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Activity is slowing. The repository last received commits 6 months ago.
- What is it written in?
- Mainly C#, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem lessmsi solves: an MSI is a database, not a zip
A Windows Installer file is often treated as an archive, which leads people to reach for a generic unzip tool and get nowhere useful. The README states the shape of the problem directly: MSI files are based on an internal database of tables, and lessmsi ships a viewer for those tables. That framing matters for anyone who has to answer questions about an installer that cannot be executed on the machine they are sitting at, or that must be understood before a change order goes out.
The audience is narrow and identifiable from the project's own topic list and features: people who work a lot with installers. The README describes the tool as a utility with a graphical user interface and a command line interface that can be used to view and extract the contents of an MSI file.
That constraint is the whole value proposition. When you extract an installer to see what it would drop on a machine, you get the payload. When you open the table viewer, you get the metadata that produced it: the file table, the component table, the registry entries, the property sheet. The README calls the viewer useful for people who work a lot with installers, and that is the honest scope.
Three front ends over one extraction path
The same capability is exposed three ways, which is the practical reason to pick this over a one-off script. The command line covers automation, the GUI covers inspection on a desktop, and the Explorer integration covers the case where the installer is sitting in a folder and nobody wants to open a terminal.
The Explorer integration is the least conventional of the three. lessmsi registers a context menu entry so that right-clicking an .msi file offers "Extract Files", which extracts it into a folder in place. The README shows how it is controlled: select Preferences from the Edit menu to enable or disable the explorer integration. That preference toggle is the entire configuration surface described anywhere in the README, which tells you how little there is to configure.
The GUI adds a files tab for viewing detailed information about any MSI file and a separate table tab for the internal database. Screenshots in the repository under `misc/` show both tabs. The Graphical interface is Windows-native in spirit, and the project ships a screenshot of the preferences dialog rather than a config file format, which is consistent with there being nothing else to set.
Extracting from the command line, and where the README stops
The command line form given in the README is short enough to memorise:
lessmsi x <msiFileName> [<outputDir>]The `x` subcommand takes the MSI file and an optional output directory. When the output directory is omitted the behaviour is not spelled out in the README, so do not assume a default path; pass one explicitly until you have confirmed what happens without it.
Everything else is deferred to a wiki page rather than the README itself. The README links to the Command Line wiki at `https://github.com/activescott/lessmsi/wiki/Command-Line` for more usage. That is where you would look for additional verbs, for listing an archive without writing to disk, or for anything that controls how tables are read. Treat the one-line form above as the documented minimum, not the complete surface. The README also does not document a quiet mode, an exit code contract, or a verbose flag, so scripts that depend on any of those need to check the wiki first.
Installation has exactly two documented paths: install via Chocolatey from the package page, or download a zip from the releases page. There is no dotnet tool install line, no NuGet package name, and no container recipe in the README, so there is nothing to copy here beyond what the project states. For a first run, the smallest honest tutorial is: install by one of those two routes, then point the `x` subcommand at a sample installer and a directory you choose.
Targeting the oldest supported Windows means targeting .NET Framework 4.8
The most interesting constraint in the repository is a deliberate downgrade. The README states that the latest versions of lessmsi should support the oldest version of Windows that Microsoft still officially supports, which forces the project to target a .NET Framework version shipped in that oldest Windows release.
The worked example is explicit. As of 2024, Windows 10 is the oldest still supported Windows, and .NET Framework 4.8 is included in reasonably current Windows 10 updates, so 4.8 is the ideal target. The README then explains why 4.8.1 must not be targeted: as of April 2024 .NET Framework 4.8.1 is available but is only included in Windows 11 and in no Windows 10 version, so targeting it would exclude part of the audience the project deliberately serves.
Read that as a policy, not an accident. Every new release inherits a ceiling set by whatever Windows version Microsoft currently supports. When Windows 10 drops off that list, the target framework has to move again, and anyone self-building lessmsi from source has to follow that change. The repository is laid out with `src/`, `lib/`, `Reference/` and `contrib/` directories and an `appveyor.yml`, so a source build is a real path for teams who need to patch it, but it is a Windows build.
Building from source needs a Windows VM, Git Bash and a Developer Command Prompt
The development environment section is unusually specific and worth reading before you fork. The maintainer describes a path that starts from VMWare Fusion Player on macOS, then a Microsoft supplied Windows virtual machine with developer tools and SDKs, then Chocolatey installed as described at `https://chocolatey.org/install`.
Tooling is installed from the Command Prompt, and the README insists on `cmd` rather than PowerShell:
# install git for windows (this also installs "bash" via "Git Bash")
$ winget install git.git
# install chocolatey (this is required to run the MSBuild script and create the chocolatey package that is deployed by CI)
$ winget install chocolateyThe next step moves to Git Bash for the SSH key and the clone:
$ mkdir /c/src
$ cd /c/src
$ git clone [email protected]:activescott/lessmsi.gitThe build then goes back to a Developer Command Prompt for Visual Studio, again as `cmd`:
$ cd \src\lessmsi\src
$ .\build.batThe README notes that the path must be reopened after the winget installs so that cpack and git land on PATH, and that the maintainer usually starts the prompted version number at 0.0.1. Contributors are asked to make sure the build passes and that unit tests are run before a pull request is merged.
Where lessmsi is the wrong tool
Several boundaries are clear from the repository layout and the README's silence. First, it is a Windows program: the Explorer integration, the C# implementation, the.NET Framework targeting rule and the `build.bat` build script all assume Windows. Running it on macOS or Linux is not a supported path in the documentation.
Second, it extracts and views. There is no documented command to modify an MSI and write a new one, and no repack or transform mode appears anywhere in the README. If your goal is to change what an installer installs, lessmsi is not the tool described here. Packaging authors who need to author, patch or rebuild installers are outside its stated scope.
Third, it is a GUI plus CLI application with a per-user Explorer preference, not a service, a library or a library targeting.NET. If you need MSI parsing inside a build pipeline written in another language, the README offers no package to reference and no API surface, only an executable and a wiki page.
On maintenance: the repository is not archived and the last push was on 2026-04-02, with releases v2.12.7, v2.12.8 and v2.12.9 landing on 2026-03-30 and 2026-04-02. The MIT licence permits reuse and redistribution in commercial and non commercial work; that is a licensing fact, not advice about your situation.
How lessmsi compares to running the installer or reading it by hand
The alternative most teams reach for first is not another extractor but Windows itself: run the.msi with administrative install semantics, or use msiexec to lay it down, and inspect the target directory. lessmsi reads the package and writes files out without running its logic, which is the entire difference in approach and the reason packaging engineers reach for it on machines they would rather not modify.
The other alternative is writing your own reader against the installer COM interfaces, or using a general purpose archive utility. A general archive tool is the wrong shape because an MSI is a database of tables, not a flat archive, which is exactly the observation the README makes before describing its table viewer. Rolling your own reader costs you the table layer that the tool already renders.
The trade-off lessmsi accepts is platform lock-in. You get a focused reader with a GUI, a CLI, Explorer integration and a table view, and you give up any path to running it off Windows.
Editorial conclusion
Adopt lessmsi if you build or audit Windows Installer packages on Windows and need to see the embedded files and the underlying tables without running the installer. Do not reach for it on macOS or Linux, and do not treat it as a repacking or repackaging tool, since the README documents no rebuild, repack or transform command. Verify first that your workflow really is read-only extraction by checking the wiki Command Line page for the flags it does not spell out here, and confirm the .NET Framework version your build machines carry against the targeting rule described in the README.
Frequently asked questions
How do I install lessmsi?
The README gives two options: install via Chocolatey from the lessmsi package page, or download a zip from the project's releases page. No dotnet global tool or container image is documented.
What command extracts an MSI file from the command line?
The documented form is `lessmsi x <msiFileName> [<outputDir>]`, where the output directory is optional. Further verbs and flags live in the Command Line wiki rather than the README.
Can lessmsi show me what is inside an MSI without installing it?
Yes. It extracts MSI contents to a folder and, in the GUI, opens the internal database of tables that the package is built on, so you can inspect files and table metadata without running installer logic.
Does lessmsi run on macOS or Linux?
The documentation describes a Windows only tool: Windows Explorer integration, a .NET Framework 4.8 target and a `build.bat` build script. No cross platform path is described, and contributing is set up around a Windows virtual machine.
Which licence is lessmsi released under?
MIT. The repository carries an MIT LICENSE file and the package is published through Chocolatey under that licence.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/activescott-lessmsi)Was this useful?