<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alteridem Consulting &#187; MSI</title>
	<atom:link href="http://www.alteridem.net/category/msi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alteridem.net</link>
	<description>Software by Design</description>
	<lastBuildDate>Thu, 02 Sep 2010 17:52:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Read Properties from an MSI File</title>
		<link>http://www.alteridem.net/2008/05/20/read-properties-from-an-msi-file/</link>
		<comments>http://www.alteridem.net/2008/05/20/read-properties-from-an-msi-file/#comments</comments>
		<pubDate>Tue, 20 May 2008 18:52:10 +0000</pubDate>
		<dc:creator>Robert Prouse</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MSI]]></category>

		<guid isPermaLink="false">http://www.alteridem.net/?p=47</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>It took a fair amount of searching and code tweaking, but I finally worked it all out. </p>
<ol>
<li>Add a reference to the COM <strong>Microsoft Windows Installer Object Library</strong>.
<li>Add a <font face="Courier New"><font color="#0000ff">using</font> WindowsInstaller;</font>
<li>Add the following static method to your code (error checking removed for brevity.)</li>
</ol>
<pre name="code" class="c-sharp:nogutter">
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;
}
</pre>
<p>If you want to look up the version, just pass in the name of the MSI file you want to inspect and &#8220;ProductVersion&#8221; for the property you want to return. For example;</p>
<pre name="code" class="c-sharp:nogutter">
string version = GetMsiProperty( msiFile, “ProductVersion” );
</pre>
<p>You can use this method to look up other properties in the installer. Some common ones you might want are <strong>ProductName, ProductCode, UpgradeCode, Manufacturer, ARPHELPLINK, ARPCOMMENTS, ARPCONTACT, ARPURLINFOABOUT</strong> and <strong>ARPURLUDATEINFO</strong>. For a full list of properties, see the <a href="http://msdn.microsoft.com/en-us/library/aa370905(VS.85).aspx">MSDN Reference</a>, but remember that most of the properties listed on that page are only for already installed applications and won&#8217;t be included in the installer.</p>
<p>If you find this code useful or the code is not self-explanatory, please leave a comment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alteridem.net/2008/05/20/read-properties-from-an-msi-file/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
