Ich versuche, einige Informationen aus einer MSI-Datei wie oder CustomAction
zu extrahieren. Ich habe andere Skripte aus dem Internet verwendet und sie bearbeitet, aber mein Skript hat einige Probleme.Powershell Get MSI Informationen
Dies ist nur ein kleines Stück des ursprünglichen Codes ist, aber wenn ich diese ausführen, bekomme ich diese Fehlermeldung:
WARNUNG: Exception „InvokeMember“ mit „5“ Argumente (e) Aufruf: " Open View, Sql“
function Get-MSIFileInformationList {
[CmdletBinding()]
[OutputType([string])]
param(
[parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[ValidateNotNullOrEmpty()]
[System.IO.FileInfo]$Path,
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$FROM = "Property",
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$LIKE = "Property",
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$WHERE = "Property",
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$SELECT = "Property"
)
Begin
{
}
Process {
try {
# Read property from MSI database
$WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer
$MSIDatabase = $WindowsInstaller.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $null, $WindowsInstaller, @($Path.FullName, 0))
$Query = "SELECT $SELECT FROM $FROM WHERE $WHERE LIKE '%$($LIKE)%'"
# $Query = "SELECT Value FROM CustomAction WHERE Action = '$($CustomAction)'"
Write-Host 1
$View = $MSIDatabase.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $MSIDatabase, ($Query))
Write-Host 2
$View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null) | Out-Null
Write-Host 3
$Record = $View.GetType().InvokeMember("Fetch", "InvokeMethod", $null, $View, $null)
try {
Write-Host 4
$Value = $Record.GetType().InvokeMember("StringData", "GetProperty", $null, $Record, 1)
Write-Host 5
# Commit database and close view
$MSIDatabase.GetType().InvokeMember("Commit", "InvokeMethod", $null, $MSIDatabase, $null) | Out-Null
Write-Host 6
$View.GetType().InvokeMember("Close", "InvokeMethod", $null, $View, $null) | Out-Null
Write-Host 7
$MSIDatabase = $null
$View = $null
} catch {
$Value = "-"
}
# Return the value
return $Value
}
catch {
Write-Warning -Message $_.Exception.Message ; break
return ""
}
}
End {
# Run garbage collection and release ComObject [System.Runtime.Interopservices.Marshal]::ReleaseComObject($WindowsInstaller) | Out-Null
[System.GC]::Collect()
}
}
Mit welchen Parametern führen Sie den Befehl aus? Es sieht so aus, als ob diese Zeile fehlschlägt: $ View = $ MSIDatabase.GetType(). InvokeMember ("OpenView", "InvokeMethod", $ null, $ MSIDatabase, ($ Query)) 'aber das könnte sein, weil' $ MSIDatabase' oder '$ Query' werden nicht korrekt ausgefüllt. –
Rufen Sie [Installer.LastErrorRecord() '] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa369430 (v = vs.85) .aspx) auf, um detaillierte Fehlerinformationen zu erhalten. – zett42