Parse MSI installers by call MSI database [C#]

Purpose: Parse MSI installer, to get information such as product name, product code, properties etc.

MSI is a standard windows install techonoly, so there are APIs for developers to access. But they are c/c++ methods, instead of C#. After google, i found the ‘Wrapping the Windows Installer 2.0 API’(http://www.codeproject.com/KB/cs/msiinterop.aspx), which is can let .net developers access MSI api easily.

After download the library, you can visit MSI datatable like this

 

 1:  using System;
 2:  using WindowsInstaller;
 3:   
 4:  namespace MsiTest
 5:  {
 6:      class Program
 7:      {
 8:          static void Main(string[] args)
 9:          {
10:              test("c:\\xxx.msi");
11:          }
12:   
13:          private static void test(string fileName)
14:          {
15:              IntPtr databasePtr;
16:              var retDatabase = MsiInterop.MsiOpenDatabase(fileName, MsiDbPersistMode.ReadOnly, out databasePtr);
17:   
18:              IntPtr viewPtr;
19:              var ret = MsiInterop.MsiDatabaseOpenView(databasePtr, "SELECT Value FROM Property where Property = 'SecureCustomProperties'", out viewPtr);
20:   
21:              IntPtr recordPtr = IntPtr.Zero;
22:              ret = MsiInterop.MsiViewExecute(viewPtr, IntPtr.Zero);
23:              ret = MsiInterop.MsiViewFetch(viewPtr, ref recordPtr);
24:   
25:              uint buffer_length = 2550;
26:              string return_buffer = new string(' ', (int)buffer_length);
27:              MsiInterop.MsiRecordGetString(recordPtr, 1, return_buffer, ref buffer_length);
28:              MsiInterop.MsiCloseAllHandles();
29:   
30:              Console.WriteLine(return_buffer.Trim());
31:          }
32:   
33:      }
34:  }
35:   
36:   
posted on 2011-11-17 14:07  Jack Niu  阅读(679)  评论(0编辑  收藏  举报

Affiliate Marketing and Web Technology