REG_BINARY Ausgabe als Reg-Datei abspeichern

  • Hi,

    Bei der Ausgabe von

    [autoit]

    $var = RegRead("HKEY_CURRENT_USER\Identities\{6032B060-BF5F-4541-B137-B0FAD1A84C93}", "Password2")

    [/autoit]


    erhält man einen alphanumerischen String z. B. hex:01000000D08C9DDF0115D111 ....

    Um den Wert aber in eine Reg-Datei schreiben zu können, muss er so aussehen:
    "Password2"=hex:01,00,00,00,d0,8c,9d,df,01,15,d1,11,8c,7a,00,c0,4f,c2,97,eb,01,\
    00,00,00,61,97,54,f1,1a,ba,ef,4f,89,f9,12,5c,2c,57,6b,dd,00,00,00,00,02,00,\

    Gibt es dafür einen Befehl oder fertige Funktion?

    Danke

    Grüße
    Guido

    • Offizieller Beitrag

    https://autoit.de/index.php?page…36642#post36642

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function Name...._RegRead($KEY, $VALUE [, $Bin2Str=1])
    ; Description......Liest einen Registryschlüssel aus
    ; Schlüssel vom Typ REG_BINARY können wahlweise als
    ; ASCII-String zurückgegeben werden.
    ; Parameter(s).....$KEY Registryschlüssel
    ; $VALUE Registrywert
    ; $Bin2Str 0 = Value wird normal gelesen
    ; 1 = Binärwert wird in ASCII-String gewandelt (Standard)
    ; Return Value(s)..Erfolg: der Registrywert
    ; Fehler: 1 set @error:
    ; 1 Schlüssel kann nicht geöffnet werden
    ; 2 Hauptschlüssel kann nicht geöffnet werden
    ; 3 Fernzugriff auf die Registry nicht möglich
    ; 4 Key oder Value nicht übergeben
    ; -1 Wert kann nicht geöffnet werden
    ; -2 Typ des Wertes wird nicht unterstützt
    ; Author(s)........BugFix ([email='bugfix@autoit.de'][/email])
    ; AutoIt ver.......3.3.2.0
    ;===============================================================================
    Func _RegReadBinary($KEY, $VALUE, $Bin2Str=1)
    If $KEY = '' Or $VALUE = '' Then Return SetError(4,0,1)
    If $Bin2Str <> 1 Then $Bin2Str = 0
    Local $reg = RegRead($KEY, $VALUE)
    Local $err = @error, $ext = @extended
    If $err Then Return SetError($err,0,1)
    If $ext <> 3 Or $Bin2Str = 0 Then Return $reg
    Local $val = ''
    $reg = StringTrimLeft($reg, 2)
    For $i = 1 To StringLen($reg) - 2 Step 2
    $tmp = BinaryToString('0x' & StringMid($reg, $i, 2))
    If $tmp <> "" Then
    $val = $val & $tmp
    EndIf
    Next
    Return $val
    EndFunc ;==>_RegReadBinary

    [/autoit]
  • Hallo Bugfix,

    vielen Dank für die schnelle Antwort, ich sehe bei mir aber nur Gemüse. :(


    ConsoleWrite(_RegReadBinary("HKEY_CURRENT_USER\Identities\{6032B060-BF5F-4541-B137-B0FAD1A84C93}","Password2"))

  • error = 0
    Das Script läuft ja sauber durch, ich bekomme allerdings nur Sonderzeichen angezeigt.

  • Hallo Greenhorn,

    das ist klar bei Exe und DLL, aber mir geht es doch um einen binären Registry Eintrag, den ich in eine Reg-Datei schreiben möchte.
    Das Ergebnis aus Reg-Read muss ich daher in dieses Format bringen:

    Code
    "Password2"=hex:01,00,00,00,d0,8c,9d,df,01,15,d1,11,8c,7a,00,c0,4f,c2,97,eb,01,\
      00,00,00,61,97,54,f1,1a,ba,ef,4f,89,f9,12,5c,2c,57,6b,dd,00,00,00,00,02,00,\


    D. h. nach jedem zweiten Zeichen ein Komma und ab der zweiten Reihe einen Zeilenumbruch nach 25 "Einheiten" machen.

    • Offizieller Beitrag

    Achso, du willst den Wert also nicht in den tatsächlichen Inhalt umsetzen, sondern nur paarweise Hexgruppen ausgeben.
    Dazu die Funktion etwas umgebaut:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function........._RegReadGrouped($KEY, $VALUE)
    ; Description......Liest einen Registryschlüssel (REG_BINARY) aus und gruppiert den Wert
    ; Parameter(s).....$KEY Registryschlüssel
    ; $VALUE Registrywert
    ; Return Value(s)..Erfolg: der Registrywert in der Form: "hex:01,00,D0,....."
    ; Fehler: 1 set @error:
    ; 1 Schlüssel kann nicht geöffnet werden
    ; 2 Hauptschlüssel kann nicht geöffnet werden
    ; 3 Fernzugriff auf die Registry nicht möglich
    ; 4 Key oder Value nicht übergeben
    ; -1 Wert kann nicht geöffnet werden
    ; -2 Typ des Wertes wird nicht unterstützt
    ; Author(s)........BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _RegReadGrouped($KEY, $VALUE)
    If $KEY = '' Or $VALUE = '' Then Return SetError(4,0,1)
    Local $reg = RegRead($KEY, $VALUE)
    Local $err = @error
    If $err Then Return SetError($err,0,1)
    Local $sOut = 'hex:'
    $reg = StringTrimLeft($reg, 2)
    For $i = 1 To StringLen($reg) - 2 Step 2
    $sOut &= StringMid($reg, $i, 2) & ','
    Next
    Return StringTrimRight($sOut, 1)
    EndFunc ;==>_RegReadGrouped

    [/autoit]

    Den Umbruch kannst du dir selbst einbauen.

  • Ja, genau.
    Deine Lösung hat sich jetzt mit meiner Überschnitten.

    Hier die komplette Funktion, falls jemand auf das gleiche Problem stoßen sollte.

    [autoit]


    ConsoleWrite(_RegReadBinary("HKEY_CURRENT_USER\Identities\{6032B060-BF5F-4541-B137-B0FAD1A84C93}","Password2"))

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

    Func _RegReadBinary($KEY, $VALUE)
    Local $reg
    Local $val, $tmp
    Local $k

    $reg = RegRead($KEY, $VALUE)
    $reg = StringTrimLeft($reg, 2)
    For $i = 1 To StringLen($reg) Step 2
    $tmp = StringMid($reg, $i, 2) & ","
    If $tmp <> "" Then
    $val = $val & $tmp
    if $i == 41 then
    $val = $val & "\" & @CRLF
    $k = 91
    EndIf
    if $i == $k and $i <> StringLen($reg)-1 Then
    $val = $val & "\" & @CRLF
    $k += 50
    EndIf
    EndIf
    Next
    if StringRight($val,1) == "," Then $val = StringTrimRight($val,1)
    Return $val
    EndFunc ;==>_RegReadBinary

    [/autoit]

    Vielen Dank für eure Tipps.