Create MSI packages via command lines: Unleash the power of automation
Automation is probably one of the most used words in the IT Industry these days. We can't enter a room without hearing about it in the software packaging industry. However, sometimes simplicity is key.
If you want to explore how much automation you can introduce into your software packaging process, check out this article: “How much can you automate your software packaging process? An IT Pro perspective.”
In this article, we want to get down to basics and explore if it’s possible to create MSI packages using the command line.
As we dive deeper into the topic of creating MSI packages from the command line, we'll now shift our focus to a specific aspect of automation - the use of the Installer Object from the Windows Installer technology.
What is the Installer Object?
The Installer Object is a component of the Windows Installer technology that provides a set of programming interfaces for working with MSI packages. It is a powerful tool for automating software packaging and deployment tasks and is commonly used in enterprise software development and deployment scenarios.It enables software developers to manipulate and modify MSI packages programmatically using a range of methods and properties. The Installer Object can be accessed through the Component Object Model (COM) and requires the automation support to be loaded before it can be used.
Let's take a closer look at these methods and explore what each of them can do.
Method | Description |
---|---|
AddSource | Adds a source to the list of valid network sources in the sourcelist. |
AdvertiseProduct | Advertises an installation package. |
AdvertiseScript | Advertises an installation package. |
ApplyMultiplePatches | Applies one or more patches to products eligible to receive the patch. Sets the PATCH property to the path of the patch packages provided. |
ApplyPatch | Invokes an installation and sets the PATCH property to the path of the patch package for each product listed by the patch package as eligible to receive the patch. |
ClearSourceList | Removes all network sources from the source list. |
CollectUserInfo | Invokes a user interface wizard sequence that collects and stores both user information and the product code. |
ConfigureFeature | Configures the installed state of a product feature. |
ConfigureProduct | Installs or uninstalls a product. |
CreateAdvertiseScript | Generates an advertised script. |
CreateRecord | Returns a new Record object with the requested number of fields. |
EnableLog | Enables logging of the selected message type for all subsequent installation sessions in the current process space. |
ExtractPatchXMLData | Extracts information from a patch as an XML string. |
FileHash | Takes the path to a file and returns a 128-bit hash of that file. |
FileSignatureInfo | Takes the path to a file and returns a SAFEARRAY of bytes that represents the hash or the encoded certificate. |
FileSize | Returns the size of the specified file. |
FileVersion | Returns the version string or language string of the specified path. |
ForceSourceListResolution | Forces the installer to search the source list for a valid product source the next time a source is required. |
InstallProduct | Opens an installer package and initializes an installation session. |
LastErrorRecord | Returns a Record object that contains error parameters for the most recent error from the function that produced the error record. |
OpenDatabase | Opens an existing database or creates a new one. |
OpenPackage | Opens an installer package for use with functions that access the product database and install engine. |
OpenProduct | Opens an installer package for an installed product using the product code. |
ProvideAssembly | Returns the installed path of an assembly. |
ProvideComponent | Returns the full component path and performs any necessary installation. |
ProvideQualifiedComponent | Returns the full component path and performs any necessary installation. |
RegistryValue | Reads information about a specified registry key of value. |
ReinstallFeature | Reinstalls features or corrects problems with installed features. |
ReinstallProduct | Reinstalls a product or corrects installation problems in an installed product. |
RemovePatches | Removes one or more patches to products eligible to receive the patch. |
UseFeature | Increments the usage count for a particular feature and returns the installation state for that feature. |
The OpenDatabase method offers multiple openMode options, two of which are:
Mode | Parameter | Definition |
---|---|---|
msiOpenDatabaseModeCreate | 3 | Creates a new database, transact mode read/write. |
msiOpenDatabaseModeCreateDirect | 4 | Creates a new database, direct mode read/write. |
Knowing these, we can develop the following PowerShell script to create the MSI package by using the command line:
$MSIFilePath = "C:\Users\User\Desktop\test.msi" $WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer $WindowsInstallerDatabase = $WindowsInstaller.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $null, $WindowsInstaller, @(($MSIFilePath), 4)) $WindowsInstallerDatabase.GetType().InvokeMember("Commit", "InvokeMethod", $Null, $WindowsInstallerDatabase, $Null) [System.Runtime.Interopservices.Marshal]::ReleaseComObject($WindowsInstallerDatabase) | Out-Null
As you can see, we're creating the test.msi using msiOpenDatabaseModeCreateDirect. As the Microsoft documentation mentions, we need to call the commit method and release the COM object once we've completed the operation.
Executing the script above will create the MSI in the designated location without any errors. However, upon opening the MSI file, you will notice that there are no tables or data present.
As you can probably guess, our first step would be to populate the script with all the necessary tables for the database before we can begin adding the required information. However, using the built-in PowerShell functionality is probably near to impossible to create and manipulate MSI packages.
One alternative would be to use the more superior interop library Microsoft.Deployment.WindowsInstaller, which is found in the Windows Installer XML Deployment Tools Foundation.
Another free alternative is the WiX Toolset, but it has its downsides: a steep learning curve, requires programming knowledge, and has a higher cost for feature creation.
How to use Advanced Installer to Create MSI Packages from command line?
When it comes to creating MSI packages through PowerShell automation, including PowerShell automation, Advanced Installer is the go-to solution. As the top alternative to the WiX Toolset, it offers a user-friendly interface and powerful command-line interface that makes it easy to create and manipulate MSI packages.
Sign up for a 30-day full feature trial and experience the benefits of Advanced Installer's advanced features and user-friendly interface for yourself.Download now!
Advanced Installer offers a range of features and capabilities, including the ability to create MSI packages from scratch using CLI interfaces and support for repackaging an installer solely through the command line.
Moreover, if you plan to use batch files or cmd.exe in your PowerShell scripts, you can benefit from the Advanced Installer CLI support.
Here’s how the Advanced Installer command lines for creating a project, adding files, registries and building the project look like:
"AdvancedInstaller.com" /newproject "C:\MyProject\Sample.aip" -type "professional" -lang "en" -overwrite "AdvancedInstaller.com" /edit "C:\MyProject\Sample.aip" /NewReg -RegValue HKUD\Software\[Manufacturer]\[ProductName]\Settings\AppSettings -Data #x36 "AdvancedInstaller.com" /edit "C:\MyProject\Sample.aip" /AddFile APPDIR C:\Windows\notepad.exe "AdvancedInstaller.com" /edit "C:\MyProject\Sample.aip" /NewFeature Samples "AdvancedInstaller.com" /edit "C:\MyProject\Sample.aip" /SetCurrentFeature Samples "AdvancedInstaller.com" /edit "C:\MyProject\Sample.aip" /AddFile APPDIR C:\foo.edi "AdvancedInstaller.com" /edit "C:\MyProject\Sample.aip" /SetCurrentFeature MainFeature "AdvancedInstaller.com" /edit "C:\MyProject\Sample.aip" /NewShortcut -name NOTEPAD -dir SHORTCUTDIR -target APPDIR\notepad.exe -wkdir APPDIR "AdvancedInstaller.com" /build "C:\MyProject\Sample.aip"
The command lines need to be executed in the installation folder of advinst.exe, located in Program Files (x86).
For those who prefer using PowerShell, we offer multiple Automation Interfaces for configuring and building your Installer Project. Check the full list on our Advanced Installer PowerShell Automation Interfaces page.
Conclusion
In today's world where automation plays a crucial role, it's essential to not overlook the fundamentals that enable us to have greater control over our code.
Command-line tools for creating MSI packages provide a powerful way to automate software packaging and deployment tasks in enterprise software development and deployment scenarios.
We hope you found this article helpful.