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: