Read Properties from an MSI File
Today I was working writing auto-updating for some software. I wanted to base it on the Product Version property in the installer MSI file, so I needed some code to read that from the file.
It took a fair amount of searching and code tweaking, but I finally worked it all out.
- Add a reference to the COM Microsoft Windows Installer Object Library.
- Add a using WindowsInstaller;
- Add the following static method to your code (error checking removed for brevity.)
public static string GetMsiProperty( string msiFile, string property ) { string retVal = string.Empty; // Create an Installer instance Type classType = Type.GetTypeFromProgID( WindowsInstaller.Installer ); Object installerObj = Activator.CreateInstance( classType ); Installer installer = installerObj as Installer; // Open the msi file for reading // 0 - Read, 1 - Read/Write Database database = installer.OpenDatabase( msiFile, 0 ); // Fetch the requested property string sql = String.Format( SELECT Value FROM Property WHERE Property='{0}', property ); View view = database.OpenView( sql ); view.Execute( null ); // Read in the fetched record Record record = view.Fetch(); if ( record != null ) retVal = record.get_StringData( 1 ); return retVal; }</code>
If you want to look up the version, just pass in the name of the MSI file you want to inspect and "ProductVersion" for the property you want to return. For example;
string version = GetMsiProperty( msiFile, ProductVersion );
You can use this method to look up other properties in the installer. Some common ones you might want are ProductName, ProductCode, UpgradeCode, Manufacturer, ARPHELPLINK, ARPCOMMENTS, ARPCONTACT, ARPURLINFOABOUT and ARPURLUDATEINFO. For a full list of properties, see the MSDN Reference, but remember that most of the properties listed on that page are only for already installed applications and won't be included in the installer.
If you find this code useful or the code is not self-explanatory, please leave a comment.