[HN Gopher] Show HN: Inspect and extract files from MSI installe...
___________________________________________________________________
Show HN: Inspect and extract files from MSI installers directly in
your browser
Hey everyone! I'm excited to share a small web app I built that
allows you to view and extract the contents of Windows MSI
installers directly in your browser. It's essentially a web-based
"lessmsi" powered by Pyodide. You can try it out at:
https://pymsi.readthedocs.io/en/latest/msi_viewer.html My
motivation for building this was from part of my day job -- I often
get Windows MSI installers and need to extract files while
preserving the relative directory structure and filenames, as they
would appear after a full installation. The existing tools I found
were good but limited in which platforms they support: lessmsi
works great on Windows, while msitools works for Linux/macOS.
Neither is a truly cross-platform solution that works on any major
OS. So we developed pymsi (a pure Python library, available on
GitHub at https://github.com/nightlark/pymsi) to handle reading and
extracting MSI files from Python. Then I realized that since pymsi
has no native dependencies, it could potentially run in a web
browser using Pyodide. After a bit of "vibe coding" and fixing some
"hallucinated" functions/classes that don't exist in pymsi, the
result was this client-side web app. If you need an MSI file to
experiment with, older versions of PowerToys included the installer
in .msi form, such as this one:
https://github.com/microsoft/PowerToys/releases/download/v0....
Note that the underlying pymsi library hasn't been extensively
tested against a bunch of MSI installers yet, so there might still
be lingering bugs. If you come across any issues, please don't
hesitate to report them in on the GitHub repository
(https://github.com/nightlark/pymsi/issues). I'd love to hear your
feedback and answer any questions!
Author : rmast
Score : 121 points
Date : 2025-06-20 20:04 UTC (1 days ago)
(HTM) web link (pymsi.readthedocs.io)
(TXT) w3m dump (pymsi.readthedocs.io)
| rmast wrote:
| As a side note, I just tried it in mobile Safari on my iPhone --
| at least inspecting MSI files works, extracting files may work as
| well (not sure where it is placing the "downloaded" zip file).
| jasonjmcghee wrote:
| My safari puts things in icloud drive / downloads
| lxgr wrote:
| That's configurable in the Safari settings, fwiw (I
| personally prefer my downloads to not automatically become
| uploads, especially on mobile data).
| pragma_x wrote:
| I feel like this would also solve the "I just need the printer
| driver file(s), not everything else" use-case. Nice work.
| blangk wrote:
| Printer drivers rarely if ever come in MSI format. They most
| commonly use self extracting exe archive.
| nebula8804 wrote:
| Yeah, start the installer, quickly look at the temp directory
| for the files, nab em then quit the installer. This and many
| other janky techniques are what I use to survive in the
| jungles of the Windows platform.
|
| I would also like to promote one of my most favorite tools
| ever: InstallWatch Pro by Epsilon Squared
|
| It takes a complete HDD and Registry snapshot, you install
| something then it takes another snapshot and shows you the
| diff in a easy to read format.
| wiseleo wrote:
| Thank you for InstallWatch Pro mention. That app tends to
| get reinvented every so often. I remember seeing something
| like it as early as 1996.
| nebula8804 wrote:
| Yeah Im sure even ChatGPT can spit out a script that can
| do this work. It just seems like this particular software
| by this company is really simple and super solid.
|
| I wish there was an equivalent for MacOS & Linux as the
| scripts I have tried to make(or had ChatGPT try to make)
| just don't cut the mustard. I'd rather just have some
| commercial software do this even if I have to pay for a
| license.
| Lanrei wrote:
| Neat. I usually just use 7zip to open .exe and .msi files.
| hypercube33 wrote:
| I don't think 7zip really can see into a lot of janky MSI files
| to get the actual installed content, can it?...it can
| technically break open NSIS files and get the source but that
| is disabled in code after 15.05 (GitHub has a mod to renable
| source extraction fyi) and yes self extracting exe files.
| rmast wrote:
| My experience with 7zip has been that it can read the tables
| and cab files from MSI files, but when you go to extract the
| contents you just get the raw files without the directory
| restructure associated with the MSI file (and the names of
| the extracted files can also have issues).
| atmanactive wrote:
| Let's not forget Universal Extractor:
| https://github.com/Bioruebe/UniExtract2
| WarOnPrivacy wrote:
| I _had_ forgotten. For years and years it was part of my
| install everywhere kit. This is a good reacquaintance.
| danielodievich wrote:
| I was there at Microsoft in the beginning of MSI, which was what,
| Office XP? Gosh or was it 2003? The tooling for dealing with them
| was super jank then. I could have never predicted that you'd be
| able to just casually open it in a browser. Nice job man!
| EvanAnderson wrote:
| I remember dealing with installing the Windows Installer
| redistributable on Windows 98. The Wikipedia[0] article cites
| Office 2000 shipped w/ Windows Installer 1.0.
|
| [0] https://en.wikipedia.org/wiki/Windows_Installer
| simonw wrote:
| This is really cool! Suggestion: find a small MSI file that you
| can host as part of the demo and add a "load example file" button
| - that way people can try it out even if they don't have an MSI
| file to hand already.
| hypercube33 wrote:
| I don't know the license around it but hosting orca.msi would
| be a silly thing to do
| rmast wrote:
| It looks like orca.msi uses external cab files, so maybe a
| bit harder to do than just fetching a single file MSI into
| the Pyodide file system. If the license allows, it would be
| interesting to have as an option for the example.
| rmast wrote:
| Thanks for the suggestion! I just added a button to load a
| small example MSI file.
| pragmatick wrote:
| Minor thing: When I load the page and click "Load example file"
| while Pyodide is still loading I see a stacktrace for a short
| time. Perhaps disable the button until it's loaded?
___________________________________________________________________
(page generated 2025-06-21 23:01 UTC)