Reg auslesen - 64bit geht nicht (Funktion von BugFix)

  • Hi,
    Ich habe Win 7 64bit.
    ich will einen bestimmten Regeintrag auslesen.
    Dazu verwende ich BugFixs Funktion

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <RegFunc.au3>
    $reg_schluessel100 = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages"

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

    $subkeys = _GetRegSubKeys2($reg_schluessel100)

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

    ;~ sleep(3000)
    _ArrayDisplay($subkeys)

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

    Func _GetRegSubKeys2($HKEY)
    If StringInStr($HKEY, '\') Then
    If StringRight($HKEY, 1) = '\' Then
    $HKEY = StringTrimRight($HKEY, 1)
    Local $strKeyPath = ''
    Else
    Local $strKeyPath = StringRight($HKEY, StringLen($HKEY)-StringInStr($HKEY, '\') )
    $HKEY = StringLeft($HKEY, StringInStr($HKEY, '\')-1)
    EndIf
    Else
    Local $strKeyPath = ''
    EndIf

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

    Select
    Case $HKEY = "HKEY_LOCAL_MACHINE" Or $HKEY = "HKLM"
    $HKEY = 0x80000002
    Case $HKEY = "HKEY_USERS" Or $HKEY = "HKU"
    $HKEY = 0x80000003
    Case $HKEY = "HKEY_CURRENT_USER" Or $HKEY = "HKCU"
    $HKEY = 0x80000001
    Case $HKEY = "HKEY_CLASSES_ROOT" Or $HKEY = "HKCR"
    $HKEY = 0x80000000
    Case $HKEY = "HKEY_CURRENT_CONFIG" Or $HKEY = "HKCC"
    $HKEY = 0x80000005
    EndSelect

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

    Local $arrSubKeys = '', $subkey
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

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

    $oReg.EnumKey ($HKEY, $strKeyPath, $arrSubKeys)
    Return $arrSubKeys
    ;~ _ArrayDisplay($arrSubKeys)
    ;~ MsgBox(0,0,$arrSubKeys)
    EndFunc ;==>_GetRegSubKeys

    [/autoit]

    Kompiliere ich das Skript unter 64bit bekomme ich ein Array zurück.
    Kompiliere ich es unter 32bit bekomme ich keines zurück.

    Kann dies bitte mal noch einer testen.
    Was müsste man ändern, dass es auch 32bit kompiliert und 64bit läuft?

  • so gehts auch nicht

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <RegFunc.au3>
    ;~ $reg_schluessel100 = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages"
    $reg_schluessel100 = "HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages"

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

    $subkeys = _GetRegSubKeys2($reg_schluessel100)

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

    ;~ sleep(3000)
    _ArrayDisplay($subkeys)

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

    Func _GetRegSubKeys2($HKEY)
    If StringInStr($HKEY, '\') Then
    If StringRight($HKEY, 1) = '\' Then
    $HKEY = StringTrimRight($HKEY, 1)
    Local $strKeyPath = ''
    Else
    Local $strKeyPath = StringRight($HKEY, StringLen($HKEY)-StringInStr($HKEY, '\') )
    $HKEY = StringLeft($HKEY, StringInStr($HKEY, '\')-1)
    EndIf
    Else
    Local $strKeyPath = ''
    EndIf

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

    Select
    Case $HKEY = "HKEY_LOCAL_MACHINE" Or $HKEY = "HKLM64"
    $HKEY = 0x80000002
    Case $HKEY = "HKEY_USERS" Or $HKEY = "HKU"
    $HKEY = 0x80000003
    Case $HKEY = "HKEY_CURRENT_USER" Or $HKEY = "HKCU"
    $HKEY = 0x80000001
    Case $HKEY = "HKEY_CLASSES_ROOT" Or $HKEY = "HKCR"
    $HKEY = 0x80000000
    Case $HKEY = "HKEY_CURRENT_CONFIG" Or $HKEY = "HKCC"
    $HKEY = 0x80000005
    EndSelect

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

    Local $arrSubKeys = '', $subkey
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

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

    $oReg.EnumKey ($HKEY, $strKeyPath, $arrSubKeys)
    Return $arrSubKeys
    ;~ _ArrayDisplay($arrSubKeys)
    ;~ MsgBox(0,0,$arrSubKeys)
    EndFunc ;==>_GetRegSubKeys

    [/autoit]
  • Das mit dem HKLM64 funktioniert nur bei AutoIt-Reg-Funktionen.
    Die Funktion welche du verwendest macht das ja über ein Objekt.
    Da müsste man in der Doku dazu schauen wie man die Reflection ausschaltet.
    Wenn du direkt API-Funktionen nutzt kannst du das per "RegDisableReflectionKey".
    Wie sich das bei dem Objekt verhält und ob es überhaupt dort geht - keine Ahnung.

  • Gerade gemacht!


    Wow da hast du jetzt aber eine stelle gefunden das lustige ist wenn du ein code nich in exe gewandelt hats kann man die sachen auslesen sobalt aber kompiliert dann nicht meher auch nicht mehr der code über autoit ????? ?(
    Irgendwie komisch !

    LG Kleiner

  • Lustig ist das alle datein die kompiliert nicht gehen auch nicht die .au3 nixht mal nach einem neustart aber ertellt man eine neue .au3 mit dem selben inhalt kann man den zweig wieder auslesen!


    LG Kleiner

  • Also bei mir geht die .au3.
    Auch wenn ich sie in x64 kompiliere geht sie.
    Nur wenn ich sie in x86 kompiliere gehts nicht

  • Nimm eine eigene Funktion welche die AutoIt-Regfunktionen nutzt.
    Dann sollte auch die Sache mit "HKLM64" funktionieren.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $reg_schluessel100 = "HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages"

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

    $subkeys = _GetRegSubKeys($reg_schluessel100)
    _ArrayDisplay($subkeys)

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

    ; by AspirinJunkie
    ; needs .Net
    Func _GetRegSubKeys($HKEY)
    Local $iCount = 1, $sSubKey
    Local $cRetQueue = ObjCreate("System.Collections.Queue")
    If @error Then Return SetError(1, 0, -1)

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

    While 1
    $sSubKey = RegEnumKey($HKEY, $iCount)
    If @error <> 0 Then ExitLoop
    $iCount += 1
    $cRetQueue.Enqueue($sSubKey)
    WEnd
    Return $cRetQueue.ToArray
    EndFunc

    [/autoit]
  • Hier eine Funktion, um die installierte Software auszulesen:

    Spoiler anzeigen
    [autoit]


    ;Coded by UEZ 2009
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseX64=y
    #include <array.au3>
    Global $server = "localhost"
    If $CmdLine[0] > 0 Then $server = $CmdLine[1]

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

    $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $server & "\root\cimv2")

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

    ConsoleWrite(@CRLF & "Installed software on " & $server & @CRLF & @CRLF)
    Software($server)

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

    Func Software($srv) ; registry read version 2
    Local $function_name = "Software"
    Local $objReg, $HKLM, $BaseKey, $BaseKey64, $server, $arrSubKeys, $SubKey, $Value, $objRegService, $chk_nr, $chk_url, $chk_sc
    Local $software, $Key, $key_value, $SW_DisplayName, $SW_DisplayVersion, $SW_Publisher, $SW_InstallDate, $line, $TimeStamp
    Local $filename_sw = $function_name & "_" & $srv
    Local $filename_error_current = $function_name & "_" & $srv & "_error.log"
    $HKLM = 0x80000002
    $BaseKey = "Software\Microsoft\Windows\CurrentVersion\Uninstall\"
    $BaseKey64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
    If @OSArch = "X64" And ($srv = @ComputerName Or _
    $srv = "localhost" Or _
    $srv = @IPAddress1 Or _
    $srv = @IPAddress2 Or _
    $srv = @IPAddress3 Or _
    $srv = @IPAddress4) Then
    $i = 1
    While 1
    $Key = RegEnumKey("HKEY_LOCAL_MACHINE\" & $BaseKey, $i)
    If @error <> 0 Then ExitLoop
    $key_value = RegRead("HKEY_LOCAL_MACHINE\" & $BaseKey & "\" & $Key, "DisplayName")
    $chk_sc = RegRead("HKEY_LOCAL_MACHINE\" & $BaseKey & "\" & $Key, "SystemComponent")
    $chk_url = RegRead("HKEY_LOCAL_MACHINE\" & $BaseKey & "\" & $Key, "MoreInfoURL")
    $chk_nr = RegRead("HKEY_LOCAL_MACHINE\" & $BaseKey & "\" & $Key, "NoRemove")
    If $key_value <> "" And _
    StringIsASCII($key_value) <> 0 And _
    $key_value <> "Security Update for" And _
    $key_value <> "Hotfix for" And _
    $key_value <> "Update for Office" And _
    $key_value <> "Windows 2000 Hotfix" And _
    StringInStr(StringLower($Key), StringLower("InstallShield_")) = 0 And _
    StringInStr(StringLower($chk_url), StringLower("http://support.microsoft.com/kb/")) = 0 And _
    $chk_nr <> 1 And $chk_sc <> 1 Then
    $SW_DisplayName = StringStripWS($key_value, 7)
    $SW_Publisher = RegRead("HKEY_LOCAL_MACHINE\" & $BaseKey & "\" & $Key, "Publisher")
    $SW_InstallDate = RegRead("HKEY_LOCAL_MACHINE\" & $BaseKey & "\" & $Key, "InstallDate")
    $SW_DisplayVersion = RegRead("HKEY_LOCAL_MACHINE\" & $BaseKey & "\" & $Key, "DisplayVersion")
    $software &= $srv & ";" & $SW_DisplayName & ";" & $SW_DisplayVersion & ";" & $SW_Publisher & ";" & $SW_InstallDate & ";" & @CRLF
    EndIf
    $i += 1
    WEnd

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

    $i = 1
    While 1
    $Key = RegEnumKey("HKEY_LOCAL_MACHINE64\" & $BaseKey, $i)
    If @error <> 0 Then ExitLoop
    $key_value = RegRead("HKEY_LOCAL_MACHINE64\" & $BaseKey & "\" & $Key, "DisplayName")
    $chk_sc = RegRead("HKEY_LOCAL_MACHINE64\" & $BaseKey & "\" & $Key, "SystemComponent")
    $chk_url = RegRead("HKEY_LOCAL_MACHINE64\" & $BaseKey & "\" & $Key, "MoreInfoURL")
    $chk_nr = RegRead("HKEY_LOCAL_MACHINE64\" & $BaseKey & "\" & $Key, "NoRemove")
    If $key_value <> "" And _
    StringIsASCII($key_value) <> 0 And _
    $key_value <> "Security Update for" And _
    $key_value <> "Hotfix for" And _
    $key_value <> "Update for Office" And _
    $key_value <> "Windows 2000 Hotfix" And _
    StringInStr(StringLower($Key), StringLower("InstallShield_")) = 0 And _
    StringInStr(StringLower($chk_url), StringLower("http://support.microsoft.com/kb/")) = 0 And _
    $chk_nr <> 1 And $chk_sc <> 1 Then
    $SW_DisplayName = StringStripWS($key_value, 7)
    $SW_Publisher = RegRead("HKEY_LOCAL_MACHINE64\" & $BaseKey & "\" & $Key, "Publisher")
    $SW_InstallDate = RegRead("HKEY_LOCAL_MACHINE64\" & $BaseKey & "\" & $Key, "InstallDate")
    $SW_DisplayVersion = RegRead("HKEY_LOCAL_MACHINE64\" & $BaseKey & "\" & $Key, "DisplayVersion")
    $software &= $srv & ";" & $SW_DisplayName & ";" & $SW_DisplayVersion & ";" & $SW_Publisher & ";" & $SW_InstallDate & ";" & @CRLF
    EndIf
    $i += 1
    WEnd
    Else
    If StringLower(@OSVersion) <> StringLower("WIN_2000") Then
    $objWMILocator = ObjCreate("WbemScripting.SWbemLocator")
    $objRegService = $objWMILocator.ConnectServer($srv, "\root\default", "", "", "", "", 0x80)
    $objReg = $objRegService.Get("StdRegProv")
    Else
    $objReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $srv & "\root\default:StdRegProv")
    EndIf

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

    If IsObj($objReg) Then
    $objReg.EnumKey($HKLM, $BaseKey, $arrSubKeys)
    For $SubKey In $arrSubKeys
    $SW_DisplayName = ""
    $SW_DisplayVersion = ""
    $SW_Publisher = ""
    $SW_InstallDate = ""
    $Key = $objReg.GetStringValue($HKLM, $BaseKey & $SubKey, "DisplayName", $Value)
    $objReg.GetDWORDValue($HKLM, $BaseKey & $SubKey, "NoRemove", $chk_nr)
    $objReg.GetDWORDValue($HKLM, $BaseKey & $SubKey, "SystemComponent", $chk_sc)
    $objReg.GetStringValue($HKLM, $BaseKey & $SubKey, "MoreInfoURL", $chk_url)
    If $Key <> 0 Or StringLeft($SubKey, 2) = "KB" Or StringLeft($SubKey, 1) = "Q" Then
    $Key = $objReg.GetStringValue($HKLM, $BaseKey & $SubKey, "QuietDisplayName", $Value)
    EndIf
    If $Value <> "" And StringIsASCII($Value) <> 0 _
    And $Key = 0 And StringInStr(StringLower($Value), StringLower("Security Update for")) = 0 _
    And StringInStr(StringLower($Value), StringLower("Update for Windows")) = 0 _
    And StringInStr(StringLower($Value), StringLower("Hotfix for")) = 0 _
    And StringInStr(StringLower($Value), StringLower("Update for Office")) = 0 _
    And StringInStr(StringLower($SubKey), StringLower("InstallShield_")) = 0 _
    And StringInStr(StringLower($Value), StringLower("Windows 2000 Hotfix")) = 0 _
    And StringInStr(StringLower($chk_url), StringLower("http://support.microsoft.com/kb/")) = 0 _
    And $chk_nr <> 1 _
    And $chk_sc <> 1 Then
    $SW_DisplayName = $Value

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

    $Key = $objReg.GetStringValue($HKLM, $BaseKey & $SubKey, "DisplayVersion", $Value)
    If $Value <> "" And StringIsASCII($Value) <> 0 Then
    $SW_DisplayVersion = StringStripWS($Value, 7)
    EndIf

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

    $Key = $objReg.GetStringValue($HKLM, $BaseKey & $SubKey, "Publisher", $Value)
    If $Value <> "" And StringIsASCII($Value) <> 0 Then
    $SW_Publisher = StringStripWS($Value, 7)
    EndIf

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

    $Key = $objReg.GetStringValue($HKLM, $BaseKey & $SubKey, "InstallDate", $Value)
    If $Value <> "" And StringIsASCII($Value) <> 0 Then $SW_InstallDate = $Value
    $line = $srv & ";" & $SW_DisplayName & ";" & $SW_DisplayVersion & ";" & $SW_Publisher & ";" & $SW_InstallDate & ";" & @CRLF
    $software &= $line
    EndIf
    Next

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

    Dim $arrSubKeys
    $objReg.EnumKey($HKLM, $BaseKey64, $arrSubKeys)
    If UBound($arrSubKeys) > 0 Then
    For $SubKey In $arrSubKeys
    $SW_DisplayName = ""
    $SW_DisplayVersion = ""
    $SW_Publisher = ""
    $SW_InstallDate = ""
    $Key = $objReg.GetStringValue($HKLM, $BaseKey64 & $SubKey, "DisplayName", $Value)
    $objReg.GetDWORDValue($HKLM, $BaseKey64 & $SubKey, "NoRemove", $chk_nr)
    $objReg.GetDWORDValue($HKLM, $BaseKey64 & $SubKey, "SystemComponent", $chk_sc)
    $objReg.GetStringValue($HKLM, $BaseKey64 & $SubKey, "MoreInfoURL", $chk_url)
    If $Key <> 0 Or StringLeft($SubKey, 2) = "KB" Or StringLeft($SubKey, 1) = "Q" Then
    $Key = $objReg.GetStringValue($HKLM, $BaseKey64 & $SubKey, "QuietDisplayName", $Value)
    EndIf
    If $Value <> "" And StringIsASCII($Value) <> 0 _
    And $Key = 0 And StringInStr(StringLower($Value), StringLower("Security Update for")) = 0 _
    And StringInStr(StringLower($Value), StringLower("Update for Windows")) = 0 _
    And StringInStr(StringLower($Value), StringLower("Hotfix for")) = 0 _
    And StringInStr(StringLower($Value), StringLower("Update for Office")) = 0 _
    And StringInStr(StringLower($SubKey), StringLower("InstallShield_")) = 0 _
    And StringInStr(StringLower($Value), StringLower("Windows 2000 Hotfix")) = 0 _
    And StringInStr(StringLower($chk_url), StringLower("http://support.microsoft.com/kb/")) = 0 _
    And $chk_nr <> 1 _
    And $chk_nr <> 1 Then
    $SW_DisplayName = $Value

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

    $Key = $objReg.GetStringValue($HKLM, $BaseKey64 & $SubKey, "DisplayVersion", $Value)
    If $Value <> "" And StringIsASCII($Value) <> 0 Then
    $SW_DisplayVersion = StringStripWS($Value, 7)
    EndIf

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

    $Key = $objReg.GetStringValue($HKLM, $BaseKey64 & $SubKey, "Publisher", $Value)
    If $Value <> "" And StringIsASCII($Value) <> 0 Then
    $SW_Publisher = StringStripWS($Value, 7)
    EndIf

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

    $Key = $objReg.GetStringValue($HKLM, $BaseKey64 & $SubKey, "InstallDate", $Value)
    If $Value <> "" And StringIsASCII($Value) <> 0 Then $SW_InstallDate = $Value
    $line = $srv & ";" & $SW_DisplayName & ";" & $SW_DisplayVersion & ";" & $SW_Publisher & ";" & $SW_InstallDate & ";" & @CRLF
    $software &= $line
    EndIf
    Next
    EndIf
    EndIf
    EndIf
    ConsoleWrite($software & @CRLF)
    EndFunc ;==>Software

    [/autoit]

    Sollte sowohl als x32 als auch x64 unter einem x64 OS laufen!

    Einfach kompilieren und in der CMD starten!

    In der Zeile #AutoIt3Wrapper_UseX64=y kann eingestellt werden, ob x32 oder x64 kompiliert werden soll!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Danke allen,
    ich nehme nun die Version von AspirinJunkie.
    Sie funktioniert einwandfrei, egal ob 32bit oder 64bit.
    Die Geschwindigkeit passt auch ^^