Guten Abend liebe Leute,
Ich würde gerne via WMI überprüfen, ob ein bestimmtes MSI Product (Property "ProductCode") bereits auf der Maschine installiert ist und welcher Wert das Property "ALLUSERS" hat.
Dazu habe ich nachfolgendes Script erstellt. Aber es dauert im günstigsten Fall 7,8 im ungünstigsten Fall 9,8 Sec.
Evtl. ist es ja möglich diese Routine zu optimieren?
$COMPUTERNAME = EnvGet ("COMPUTERNAME")
InstalledProduct()
Exit
Func InstalledProduct()
[/autoit][autoit][/autoit][autoit]Local $ProductCode, $ProductName ,$Val
Local $objItems
Local $objWMI
$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$objWMI = ObjGet("winmgmts:\\" & $COMPUTERNAME & "\root\CIMV2")
;$objItems = $objWMI.ExecQuery('Select * from Win32_Property Where Name = {2C1B3E20-EE87-4E70-A0CD-5FCFD0F2D9B4}', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
$objItems = $objWMI.ExecQuery('Select * from Win32_Property', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($objItems) Then
For $objItem In $objItems
$Caption = $objItem.Caption
$ProductCode = $objItem.ProductCode
$Val = $objItem.Value
If $ProductCode = "{2C1B3E20-EE87-4E70-A0CD-5FCFD0F2D9B4}" And $Caption = "ALLUSERS" Then ConsoleWrite("> Product Code : " & $ProductCode & @CRLF & "> ALLUSERS State : " & $Val & @CRLF)
Next
EndIf
EndFunc
Auf der anderen Seite habe ich ein VBS. Evtl. kann man ja das in AutoIt umsetzen?
Hier wird das ProductEx Object verwendet. Um dies korrekt verwenden zu können muss bei Euch der Windows Installer 3.1 installiert sein.
Ist ja bei mir der Fall, allerdings funktioniert das ansteuern dieses Object in AutoIt bei mir nicht.
Set oMSI = CreateObject("WindowsInstaller.Installer")
Function IsProductInstalled(strProductCode)
Dim oProducts
Dim strTemp
IsProductInstalled = False
On Error Resume Next
Err.Clear
Set oProducts = oMsi.ProductsEx(strProductCode,"",4) ' list only Products that installed in machine context
If Err.Number <> 0 Then
On Error Goto 0
' Your Windows Installer Version does not support the ProductsEx property!
Set oProducts = oMsi.Products
For Each strTemp In oProducts
If UCase(strTemp) = UCase(strProductCode) Then
IsProductInstalled = True
End If
Next
Else
On Error Goto 0
If oProducts.Count > 0 Then
IsProductInstalled = True
Else
Set oProducts = oMsi.ProductsEx(strProductCode,"s-1-1-0",1+2+4) ' list all products
If oProducts.Count > 0 Then
' WARNING: The Product is not installed using ALLUSERS = 1
End If
End If
End If
Set oProducts = Nothing
End Function
Im VBS ist es vertretbar schnell.
Kann mir jemand helfen? Ich sitze jetzt schon 1 Woche daran.
Viele Grüße,
Axel