From ed8e109fadd9e715d1326150731f6619005e0d56 Mon Sep 17 00:00:00 2001 From: Lord Hepipud Date: Fri, 13 Aug 2021 22:46:56 +0200 Subject: [PATCH] Fixes MSI package reader on Windows 2012 R2 --- .../repository/Read-IcingaMSIMetadata.psm1 | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/core/repository/Read-IcingaMSIMetadata.psm1 b/lib/core/repository/Read-IcingaMSIMetadata.psm1 index 508d313..795f19f 100644 --- a/lib/core/repository/Read-IcingaMSIMetadata.psm1 +++ b/lib/core/repository/Read-IcingaMSIMetadata.psm1 @@ -25,21 +25,25 @@ function Read-IcingaMSIMetadata() try { $InstallerInstance = New-Object -ComObject 'WindowsInstaller.Installer'; - $MSIPackage = $InstallerInstance.OpenDatabase($File, 0); + #$MSIPackage = $InstallerInstance.OpenDatabase($File, 0); # Not Working on Windows 2012 R2 + $MSIPackage = $InstallerInstance.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $Null, $InstallerInstance, @($File, 0)); foreach ($PackageInfo in $MSIObjects) { $MSIQuery = [string]::Format( "SELECT `Value` FROM `Property` WHERE `Property` = '{0}'", $PackageInfo ); - $MSIDb = $MSIPackage.OpenView($MSIQuery); + #$MSIDb = $MSIPackage.OpenView($MSIQuery); # Not Working on Windows 2012 R2 + $MSIDb = $MSIPackage.GetType().InvokeMember('OpenView', 'InvokeMethod', $Null, $MSIPackage, $MSIQuery); if ($null -eq $MSIDb) { continue; } - $MSIDb.Execute(); - $MSITable = $MSIDb.Fetch(); + #$MSIDb.Execute(); # Not Working on Windows 2012 R2 + $MSIDb.GetType().InvokeMember('Execute', 'InvokeMethod', $Null, $MSIDb, $Null); + #$MSITable = $MSIDb.Fetch(); # Not Working on Windows 2012 R2 + $MSITable = $MSIDb.GetType().InvokeMember('Fetch' , 'InvokeMethod', $Null, $MSIDb, $Null); if ($null -eq $MSITable) { continue; @@ -47,13 +51,16 @@ function Read-IcingaMSIMetadata() $MSIPackageData[$PackageInfo] = $MSITable.GetType().InvokeMember('StringData', 'GetProperty', $null, $MSITable, 1); - $MSIDb.Close(); - $MSIPackage.Commit(); + #$MSIDb.Close(); # Not Working on Windows 2012 R2 + $MSIDb.GetType().InvokeMember('Close', 'InvokeMethod', $null, $MSIDb, $null); + [void]([System.Runtime.InteropServices.Marshal]::ReleaseComObject($MSIDb)); + $MSIDb = $null; } - $MSIPackage.Commit(); - $MSIPackage = $null; + [void]([System.Runtime.InteropServices.Marshal]::ReleaseComObject($MSIPackage)); [void]([System.Runtime.InteropServices.Marshal]::ReleaseComObject($InstallerInstance)); + $MSIPackage = $null; + $InstallerInstance = $null; if ($AgentFile.Name.Contains('x86_64')) { $MSIPackageData.Add('Architecture', 'x64')