Guide ยท MSI
How to read an MSI verbose log
Every failed install has a reason, and it is almost always four lines above the part everyone searches for.
First, produce one
Windows does not keep MSI logs by default. You have to ask for one.
msiexec /i package.msi /l*v C:\Windows\Temp\install.log /qn
/l*v means everything, verbose. Anything less and the line you need will
be the line that was not logged.
To capture every install on a machine without changing each command, set the logging
policy. Create Logging as a REG_SZ with the value
voicewarmupx under
HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer. Every install then
writes an MSI*.LOG into %TEMP%. Turn it off afterwards, it is
noisy and it never cleans up after itself.
An install running as SYSTEM writes to C:\Windows\Temp, not to your
profile. Intune Win32 app logs are under
C:\ProgramData\Microsoft\IntuneManagementExtension\Logs. If you are
looking in your own %TEMP% and finding nothing, that is why.
The one search everyone knows
Select-String -Path install.log -Pattern "Return value 3" -Context 8,0
Windows Installer writes Action ended ... Return value 3 after an action
fails. The -Context 8,0 is the important part: it shows the eight lines
before the failure, which is where the actual reason sits. The failure line
itself only tells you which action died.
The return value table, properly
Most guides say "0 means the action was skipped". That is wrong, and it is worth knowing because 0 is a real problem rather than a shrug. Here is Microsoft's actual mapping of logged action return values:
0ERROR_FUNCTION_NOT_CALLED, a function could not be executed1ERROR_SUCCESS, the action completed successfully2ERROR_INSTALL_USEREXIT, a user cancelled installation3ERROR_INSTALL_FAILURE, a fatal error4ERROR_INSTALL_SUSPEND, the installation suspended, incomplete5ERROR_SUCCESS, the action completed successfully6ERROR_INVALID_HANDLE_STATE, the handle is in an invalid state7ERROR_INVALID_DATA, the data is invalid8ERROR_INSTALL_ALREADY_RUNNING, another installation is in progress
So 1 and 5 are both success. Anything else deserves a look, and 3 is the one that stops the install and triggers rollback.
What to read once you are there
The custom action line
If a custom action failed you will often see a line naming it directly, along with the error the action itself returned. That number is the vendor's error, not a Windows error, and it is the thing to take to the vendor.
The Note lines
Lines like Note: 1: 2262 carry Windows Installer's internal diagnostic
codes. They are terse, but they tell you which table or which operation was involved,
and they usually appear right beside the failure.
The properties dump
Near the end, the log prints every property and its value:
Property(S): INSTALLDIR = .... This answers most of the questions people
ask about a failed deployment. Where did it try to install. Did the transform apply.
Was the license key property actually set. It is the fastest way to prove that the
command line you thought you deployed is the one that ran.
The final status
Installation success or error status: 1603 is the exit code the installer
returned. 1603 is the generic fatal error, and
0x80070643 is the same code wrapped as an HRESULT when
Windows Update or a deployment tool reports it.
3010 means the install succeeded and a restart is needed. If your deployment tool reports it as a failure, the tool is misconfigured, not the package.
Or let the tool do it
The log analyzer reads MSI logs directly: it finds the action that returned 3, names the product and version, pulls the Note diagnostics, and explains the final exit code. It runs in your browser, so the log stays on your machine, which matters because an MSI log lists your file paths, your machine name, and occasionally property values you would rather not paste into someone else's service.
Open the log analyzerReturn value table checked against Microsoft's Logging of Action Return Values.