Packaging knowledge
Reading PSADT exit codes
0, 3010, 1641, 1603: what the return codes mean, how Intune interprets them and when a restart is triggered.
What Intune does with the code
Intune reads the package's return code and decides: success, success with restart, failure, retry. That decision depends on the code, not on what the log says.
A package that “completed” but returns 0 although the installer returned 1603 is misconfigured, not successful.
The four codes that matter
0 is success without restart. 3010 is success, restart required. 1641 is success, restart already initiated. 1603 is a fatal error during installation.
The difference between 3010 and 1641 matters: with 3010 Intune can schedule the restart; with 1641 it has already been triggered. Treat them the same and you either schedule twice or not at all.
1603 and its causes
1603 is a bucket, not a single error. Common causes: missing rights, a locked file, a previous product still installed, a missing dependency, or a target directory that cannot be written.
The code says “it failed”, not “why”. The reason is in the MSI log or the vendor log.
Other codes worth knowing
1618 means another installation is already running — a sign of missing serialisation. 1602 means user cancellation, which should not happen in a silent run. 1625 points to a policy blocking the installation.
These are not curiosities: they explain why a package works on ten devices and fails on three.
Reading the log correctly
The exit code is at the end of the run; the cause is above it. The code tells you it failed, the log tells you where. You need both.
Test matrix
Test four cases: fresh install, install over an existing version, uninstall, and reinstall after uninstall. Each case needs an expected code. Without that matrix, “it runs” is a snapshot.
---