Auslesen der installierten Software

  • Hallo zusammen,

    ich suche nach einer Möglichkeit, wie ich alle auf dem PC installierte Software auslesen kann.
    Hier habe ich schon einiges dazu finden können: [ gelöst ] Installierte Software aus Registry auslesen (VBS -> AU3).
    Doch stellt sich mir die Frage, was der QuietDisplayName ist.

    Wenn ich die Version der Software angeben will, ist das doch auch immer die Version, die in der Registry unter DisplayVersion steht oder?

    LG FKFK

  • Servous, also Software liste geht so
    http://www.autoitscript.com/forum/topic/78…emote-computer/
    //Skript übernommen, Link oben / Versionsanzeige mit eingefügt

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $ret = _SoftwareInfo()
    _ArrayDisplay($ret, '')

    [/autoit] [autoit][/autoit] [autoit]

    Func _SoftwareInfo($s_RemoteComputer = '')
    Local $Count = 1

    [/autoit] [autoit][/autoit] [autoit]

    If $s_RemoteComputer <> '' Then $s_RemoteComputer = '\\' & StringReplace($s_RemoteComputer, '\', '') & '\'
    Local Const $regkey = $s_RemoteComputer & 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $key = RegEnumKey ($regkey, $Count)
    If @error <> 0 then ExitLoop
    $line = RegRead ($regkey & '\' & $key, 'Displayname')
    $version = RegRead($regkey & '\' & $key, 'DisplayVersion')
    $line = StringReplace ($line, ' (remove only)', '')

    [/autoit] [autoit][/autoit] [autoit]

    If $line <> '' Then
    If Not IsDeclared('avArray') Then Dim $avArray[1][2]
    ReDim $avArray[UBound($avArray) + 1][2]
    $avArray[UBound($avArray) - 1][0] = $line
    $avArray[UBound($avArray) - 1][1] = $version
    EndIf
    $Count = $Count + 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsDeclared('avArray') Or Not IsArray($avArray) Then
    Return(SetError(1, 0, ''))
    Else
    $avArray[0][0] = UBound($avArray) - 1
    Return(SetError(0,0, $avArray))
    EndIf
    EndFunc

    [/autoit]

    QuiteDisplayName habe ich bei mir keinen in der Reg. also weiß ich leider nicht was der macht , hab dir mal ein Script angehängt mit dem du Namen + Version bekommst

    Gruß Marvin

  • Hallo alle zusammen,

    nun sind drei Jahre um und fast überall gibt es 64 bit :)
    So stehe ich vor einer neuen Frage:
    Windows legt installierte Software in der Registry unter HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall und unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    Mein Skript zeigt mir in beiden Fällen nur die Software von Wow6432Node an, wahrscheinlich weil es 32 bit ist.
    Gibt es eine Möglichkeit aus beiden Pfaden die Software auszulesen oder muss ich ein 64bit-Skript und für die 32bit-PCs ein 32bit-Skript erstellen?

    LG FKFK

  • Danke Oscar für den Link! Ich habe das auch schon so ähnlich umgesetzt, allerdings zeigt meine 32bit-Exe in beiden Registry-Pfaden das gleiche an. Windows nimmt meines Wissens ja bei 32bit-Exen den Wow6432Node und gibt ihn als den Pfad aus, unter dem die 64bit-Software gespeichert wäre. Dadurch sieht die 32bit-Exe immer nur die 32bit-Software.

  • So, ich habe nun am Anfang

    [autoit]

    If @OSArch = 'X64' And Not @AutoItX64 Then
    Run(StringTrimRight(@ScriptName, 4) & '_x64.exe') ;Führt bei x64-Installation x64-AutoIt aus
    Exit
    EndIf

    [/autoit]


    geschrieben, damit bei 32bit 32bit-AutoIt und bei 64bit 64bit-AutoIt gestartet wird.
    Und lese die Software nun per ergänzte _CI_GetSoftware-UDF aus.

    [autoit]

    #cs===============================================================================
    Function Name: _CI_GetSoftware($s_RemoteComputer = '')
    Description:: Liest die installierte Software mit Version aus der Registry
    Parameter(s): $s_RemoteComputer = Remotecomputer (Optional)
    Author(s): Protex @ AutoIt.de und Danny35d @ autoitscript.com
    Überarbeitet: FKFK (UDF)
    Return values: Erfolg: Array mit der installierten Software
    [0][1] befindet sich die Anzahl der installierten Software.
    [x>1][0] -> Programmname
    [x>1][1] -> Version, sofern vorhanden
    #ce===============================================================================

    [/autoit][autoit][/autoit][autoit]

    Func _CI_GetSoftware($s_RemoteComputer = '')
    Local $Count = 1 ;Erstellen der Counter-Variable
    Local $aReturn[2][2] = [['', ''],['Programm:', 'Version:']]

    [/autoit][autoit][/autoit][autoit]

    If $s_RemoteComputer <> '' Then $s_RemoteComputer = '\\' & StringReplace($s_RemoteComputer, '\', '') & '\' ;Wenn ein Remotecomputer angegeben ist, werden alle angegbenen "" entfernt und "\" davor geschrieben
    ;~ Local Const $regkey = $s_RemoteComputer & 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' ;Auszulesender Schlüssel über den die installierte Software gefunden werden kann
    Local Const $aRegKeys[2] = [$s_RemoteComputer & 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _ ;Auszulesender Schlüssel über den die installierte Software gefunden werden kann
    $s_RemoteComputer & 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'] ;Auszulesender Schlüssel über den die installierte Software gefunden werden kann

    [/autoit][autoit][/autoit][autoit]

    For $sRegKey In $aRegKeys ;Dauerschleife zum Auslesen der installierten Software, Ende, wenn alles ausgelesen wurde
    While 1
    $key = RegEnumKey($sRegKey, $Count) ;Auszulesender Unterschlüssel wird ermittelt: Schlüssel und Position entsprechend Count -> Rückgabe des Unterschlüssels
    If @error <> 0 Then ExitLoop ;Sofern der letzte Unterschlüssel erreicht wurde -> Schleife wird verlassen
    $line = RegRead($sRegKey & '\' & $key, 'Displayname') ;Softwarebezeichnung wird ausgelesen
    $version = RegRead($sRegKey & '\' & $key, 'DisplayVersion') ;Software-Version wird ausgelesen
    $line = StringReplace($line, ' (remove only)', '') ;Die Aussage (remove only) wird aus dem String entfernt, sofern vorhanden

    [/autoit][autoit][/autoit][autoit]

    If $line <> '' Then ;Sollte der Softwarename nicht leer sein, werden dem Array Daten zugewiesen
    ReDim $aReturn[UBound($aReturn) + 1][2] ;Erweiterung des Arrays
    $aReturn[UBound($aReturn) - 1][0] = $line ;Zuweisung der Softwarebezeichnung
    $aReturn[UBound($aReturn) - 1][1] = $version ;Zuweisung der Software-Version
    EndIf
    $Count = $Count + 1 ;Erhöhung des Counters
    WEnd
    Next

    [/autoit][autoit][/autoit][autoit]

    If Not IsDeclared('aReturn') Or Not IsArray($aReturn) Then ;Überprüft das Array auf Fehler und gibt, sofern vorhanden, Fehler zurück
    Return (SetError(1, 0, ''))
    ElseIf Not UBound($aReturn, 0) = 2 Then ; Überprüft auf richtige Dimensionen-Zahl und gibt ansonsten einen Fehler zurück
    Return SetError(2, 0, "")
    Else
    $aReturn[0][0] = 'Installierte Software:'
    $aReturn[0][1] = UBound($aReturn) - 1 ;Sofern keine Fehler vorhanden sind, wird die Anzahl der installierten Software ins Array gespeichert
    Return (SetError(0, 0, $aReturn))
    EndIf
    EndFunc ;==>_CI_GetSoftware

    [/autoit]