Beiträge von mumpel
-
-
Am Ende ist es wichtig, dass auch andere den Code verstehen.
-
Für die Zukunft werde ich mir auch in AutoIt das selbe angewöhnen wie in VBA. Nämlich sprechende Namen mit dem Kürzel des Typs davor (var für Variant, str für String, int für Integer, lng für Long, obj für Object etc. pp.). Z.B. $strEditbox1 = für den Inhalt der ersten Textbox.
-
Ich komme aus VBA. Bei großen Projekten habe ich jede Funktion/Prozedur in je ein eigenes Modul gepackt. Jedes Modul hat einen sprechenden Namen. Heißt die UDF/Prozedur "Makro1", bekommt das Modul den Namen "mdlMakro1". Dadurch können natürlich auch mal 30 Module und mehr im Projekt sein. Das ist einfacher als in AutoIt.

-
Für mich ist der Unterstrich gewöhnungsbedürftig.
-
Danke! Na dann muss ich den nicht zwingend verwenden. In VBA macht man das ja auch nicht.

-
Hallo!
Eine kleine Verständnisfrage. Manche Programmierer beginnen Funktionsnamen mit einem Unterstrich (Func _Funktionsname). Hat der Unterstrich eine wichtige Bedeutung oder einen Grund? Ich kenne sowas nicht.
Gruß, René
-
Kleine Verbesserung. Jetzt kann ein Zufallscode und ein Zufallskennwort generiert werden. Jeweils 25-stellig mit Großbuchstaben und Zahlen.
-
Poste den Quellcode doch bitte auch hier im Thread. Dann kann sich jeder Interessierte die .exe-Datei(en) selbst kompilieren, ohne sie erst von Deine Website herunterladen zu müssen.
Auch keine schlechte Idee (Obwohl ich auf meiner HP die Download-Zahlen besser unter Kontrolle habe. 😉 ). Vielleicht kann ja jemand nicht mehr benötigte Dinge aus den Dateien entfernen, so dass es hinterher trotzdem noch läuft. Derzeit habe ich nicht mehr benötigte Dinge über den Rand hinaus verschoben, da ich feste Werte möchte.
-
Jetzt ist mein Projekt fertig. http://www.rholtz-office.de/counters/getfile.php?id=914
Zum Test die "2FA-QR-Code erstellen.exe" aufrufen.
1. Zuerst wählt man den Pfad, in dem der QR-Code gepeichert wird.
2. Dann gibt man den Dateinamen für den QR-Code an.
3. Jetzt gibt man einen Code aus Zahlen und Großbuchstaben an.
4. Mit Klick auf "Secret berechnen" wird der Code in Base32 umgewandelt.
5. Jetzt gibt man den Herausgeber (Issuer) und einen Kontonamen an. Der Kontoname wird später im Authenticator angezeigt.
6. Mit Klick auf "Code erstellen" wird der QR-Code generiert (PNG-Datei), den man dann im Authenticator scannt.
Jetzt kann man auch gleich noch den Secret verschlüsseln. Dazu gibt man zuerst ein Verschlüsselungskennwort an. Mit Klick auf "Verschlüsseln" wird das Verschlüsselungskennwort gehasht (AES512), und mit diesem Hash der Secret verschlüsselt (AES256). Zusätzlich wird auch gleich der passende Quellcode in die Zwischenablage geschrieben, den man dann in sein Projekt übernehmen kann.
Das Testprojekt enthält auch einen Test für das Einmalkennwort. Hierfür könnt ihr den QR-Code im Authenticator scannen und in "TOTP_Test2.exe" testen (Um gut zu testen, auch mal falsche Codes eingeben). Der Quellcode dafür ist enthalten.
Sollten bei euch Fehlermeldungen angezeigt werden, dann bitte hier reinschreiben.
-
Umgekehrt sollte man Deklarationen mittels Global innerhalb von Funktionen aber tunlichst vermeiden.
"Global" ist vergleichbar mit "Public" in VBA. Das sind beides globale Variablen, die Projektweit verfügbar sind, egal in welchem Modul sie stehen (Eine "au3" in AutoIt ist das was ein allgemeines Modul in VBA ist).
-
Naja die Fehlermeldung zeigt ja schon auf die entsprechende Zeile...
Aber trotzdem übersieht man manchmal solche Kleinigkeiten.

Ich muss nauch noch andere Scripte bereinigen (auch aus dem Internet). Das Problem auch hier, dass die Meldung nur von der Exe ausgegeben wird. Aber nur sporatisch, und das verstehe ich gleich garnicht.
-
Der Fehler ist inzwischen bereinigt.
-
Benötigst Du wirklich eine CUI und .exe mit Übergabe von Kommandozeilenparametern usw. ?
Nein, das brauche ich nicht. Danke! für die Bereinigung.
-
du hast immer sehr gute Ansätze
Auch nur aus dem Internet.
aber du programmierst noch mehr sprachen oder
Nur in VBA. In AutoIt bin ich Laie. Aber ich habe, durch jahrelange Erfahrungen in VBA, ein Codeverständis entwickelt, auch für andere Sprachen (AutoIt, HTML, PHP, Javascript, CSS3).
-
Hallo!
Ich suche eine Möglichkeit, einen Base32 (für 2FA) zu erstellen. Ich habe auch etwas gefunden (https://www.autoitscript.com/forum/topic/59…2-encode-decode). Nur wirft die Exe einen Fehler aus ("Eine Variable ist nicht deklariert"). Nur finde ich den Fehler nicht, da der Script-Editor keinen Scriptfehler findet. Gibt es noch eine Möglichkeit, einen Scriptfehler zu finden? Oder wie kann ich noch Beispiel finden? Das Meiste was ich finde ist Base64. Danke!
Gruß, René
-
Wenn man lange genug sucht, findet man was.
Für alle, die sich für TOTP in AutIt interessieren, hier ein kleines Codebeispiel von mir.C
Alles anzeigenOpt("MustDeclareVars", 1) #RequireAdmin #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=icon\bl-xl_1.ico #AutoIt3Wrapper_Compression=4 #AutoIt3Wrapper_Compile_Both=n #AutoIt3Wrapper_UseX64=Y #AutoIt3Wrapper_UseUpx=N #AutoIt3Wrapper_Res_Language=1031 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <Crypt.au3> #include <MsgBoxConstants.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <FontConstants.au3> #include <GuiEdit.au3> #include <Date.au3> ; Hier werden die Variablen deklariert Global $PASSWORD_FOR_ENCRYPTION_HASH, $PASSWORD_TO_ENCRYPT_ENCRYPTED, $PASSWORD_DECRYPTED, $strTestingCode,$reas, $FileOpen ; Hash des Passwortes, welches zur Prüfung auf Korrektheit des Kennworts aus dem Parameter dient ; Im Klartext: $PASSWORD_FOR_ENCRYPTION_HASH = '0x**************************************' ; Verschlüsselter Secret des TOTP-Kontos ; Im Klartext: $PASSWORD_TO_ENCRYPT_ENCRYPTED = '0x**************************************' ; Vorheriges Starten der Crypt-Bibliothek für mehr Performance. _Crypt_Startup() ; Entschlüsseln des Secrets $PASSWORD_DECRYPTED = _Crypt_DecryptData($PASSWORD_TO_ENCRYPT_ENCRYPTED, $PASSWORD_FOR_ENCRYPTION_HASH, $CALG_AES_256) ; Beenden der Crypt-Bibliothek _Crypt_Shutdown() ; WICHTIG: das entschlüsselte Kennwort muss von einem Binär-Code in einen lesbaren String umgewandelt werden $PASSWORD_DECRYPTED = BinaryToString($PASSWORD_DECRYPTED) ; Hier wird der Inhalt von $strRead ausgelesen. Ist der Wert leer, oder enthält den Wert "Code ungültig", wird der Lizenzcode-Dialog angezeigt ; Schriftart festlegen Local Const $sFont = "Arial Black Narrow" ; Dialog erstellen Local $hGUI = GUICreate("Testprojekt Einmalcode", 500, 120, -1, -1) ; Schließen-Schaltfläche erzeugen Local $idButton_Close = GUICtrlCreateButton("Beenden", 130,72,100,30,$BS_DEFPUSHBUTTON) ; Eintragen-Schaltfläche erzeugen Local $idButton_Read = GUICtrlCreateButton("Code prüfen", 20,72,100,30,$BS_DEFPUSHBUTTON) ; Eingabefeld 'Lizenzcode" erzeugen Local $sText = GUICtrlCreateEdit("Hier Einmalcode eingeben", 20,20,460,26, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $WS_BORDER)) GUICtrlSetFont(-1, 12, $FW_NORMAL, $sFont) GUICtrlSetState($sText, $GUI_FOCUS) ; Dialog anzeigen GUISetState(@SW_SHOW) ; Schiebt den Text im Eingabefeld nach Links _GUICtrlEdit_SetMargins($sText, BitOR($EC_LEFTMARGIN, $EC_RIGHTMARGIN), 5, 5) ; Markiert den Text im Eingabefeld _GUICtrlEdit_SetSel($sText, 0, -1) ; Warten bis Anender Dialog schließt While 1 Switch GUIGetMsg() Case $idButton_Read Local $easy1 = _GenerateTOTP($PASSWORD_DECRYPTED, True, Default, 30, 6) If $easy1 = GUICtrlRead($sText) Then GUICtrlSetData($sText, "Der Einmalcode ist gültig") GUICtrlSetState($sText, $GUI_FOCUS) _GUICtrlEdit_SetSel($sText, 0, -1) Else GUICtrlSetData($sText, "Der Einmalcode ist ungültig") GUICtrlSetState($sText, $GUI_FOCUS) _GUICtrlEdit_SetSel($sText, 0, -1) EndIf Case $idButton_Close Exit EndSwitch WEnd ; Entfernt bestehende/offene GUI GUIDelete($hGUI) ; http://tools.ietf.org/html/rfc6238 Func _GenerateTOTP($key, $keyIsBase32 = True, $time = Default, $period = 30, $digits = 6) Local $DIGITS_POWER[9] = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000] ; time is some number of seconds If $time = Default Then $time = _GetUnixTimeUTC() $time = StringFormat("%016X", Floor($time / $period)) If $keyIsBase32 Then $key = _Base32ToHex($key, True) ; return binary Else $key = StringToBinary($key) EndIf ; HMAC function expects binary arguments Local $hash = _HMAC_SHA1($key, Binary("0x" & $time)) Local $offset = BitAND(BinaryMid($hash, BinaryLen($hash), 1), 0xf) Local $otp = BitOR(BitShift(BitAND(BinaryMid($hash, $offset + 1, 1), 0x7f), -24), _ BitShift(BitAND(BinaryMid($hash, $offset + 2, 1), 0xff), -16), _ BitShift(BitAND(BinaryMid($hash, $offset + 3, 1), 0xff), -8), _ BitAND(BinaryMid($hash, $offset + 4, 1), 0xff) _ ) $otp = Mod($otp, $DIGITS_POWER[$digits]) Return StringFormat("%0" & $digits & "i", $otp) EndFunc ;; http://www.autoitscript.com/forum/topic/153617-seconds-since-epoch-aka-unix-timestamp/ Func _GetUnixTimeUTC() ; returns number of seconds since EPOCH in UTC Local $aSysTimeInfo = _Date_Time_GetTimeZoneInformation() Local $utcTime = "" Local $sDate = _NowCalc() If $aSysTimeInfo[0] = 2 Then $utcTime = _DateAdd('n', $aSysTimeInfo[1] + $aSysTimeInfo[7], $sDate) Else $utcTime = _DateAdd('n', $aSysTimeInfo[1], $sDate) EndIf Return _DateDiff('s', "1970/01/01 00:00:00", $utcTime) EndFunc ;; http://tomeko.net/online_tools/base32.php?lang=en Func _Base32ToHex($sInput, $returnBinary = False) $sInput = StringRegExpReplace(StringUpper($sInput), "[^A-Z2-7]", "") Local $key = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" Local $buffer = 0, $bitsLeft = 0, $i = 0, $count = 0, $output = "", $val While $i < StringLen($sInput) $val = StringInStr($key, StringMid($sInput, $i + 1, 1)) - 1 ; StringInStr returns 1 as 1st position If $val >=0 And $val < 32 Then $buffer = BitOR(BitShift($buffer, -5), $val) $bitsLeft += 5 If $bitsLeft >= 8 Then $output &= Chr(BitAND(BitShift($buffer, $bitsLeft - 8), 0xFF)) $bitsLeft -= 8 EndIf EndIf $i += 1 WEnd If $bitsLeft > 0 Then $buffer = BitShift($buffer, -5) $output &= Chr(BitAND(BitShift($buffer, $bitsLeft - 3), 0xFF)) EndIf If $returnBinary Then Return StringToBinary($output) Else Return $output EndIf EndFunc ; http://www.autoitscript.com/forum/topic/145556-solved-hmac-sha1/?p=1028830 Func _HMAC_SHA1($key, $message) If Not IsBinary($key) Then $key = Binary($key) If Not IsBinary($message) Then $message = Binary($message) Local $blocksize = 64 Local $a_opad[$blocksize], $a_ipad[$blocksize] Local Const $oconst = 0x5C, $iconst = 0x36 Local $opad = Binary(''), $ipad = Binary('') If BinaryLen($key) > $blocksize Then $key = _Crypt_HashData($key, $CALG_SHA1) For $i = 1 To BinaryLen($key) $a_ipad[$i-1] = Number(BinaryMid($key, $i, 1)) $a_opad[$i-1] = Number(BinaryMid($key, $i, 1)) Next For $i = 0 To $blocksize - 1 $a_opad[$i] = BitXOR($a_opad[$i], $oconst) $a_ipad[$i] = BitXOR($a_ipad[$i], $iconst) Next For $i = 0 To $blocksize - 1 $ipad &= Binary('0x' & Hex($a_ipad[$i], 2)) $opad &= Binary('0x' & Hex($a_opad[$i], 2)) Next Return _Crypt_HashData($opad & _Crypt_HashData($ipad & $message, $CALG_SHA1), $CALG_SHA1) EndFunc Func _HMAC_MD5($key, $message) If Not IsBinary($key) Then $key = Binary($key) If Not IsBinary($message) Then $message = Binary($message) Local $blocksize = 64 Local $a_opad[$blocksize], $a_ipad[$blocksize] Local Const $oconst = 0x5C, $iconst = 0x36 Local $opad = Binary(''), $ipad = Binary('') If BinaryLen($key) > $blocksize Then $key = _Crypt_HashData($key, $CALG_MD5) For $i = 1 To BinaryLen($key) $a_ipad[$i-1] = Number(BinaryMid($key, $i, 1)) $a_opad[$i-1] = Number(BinaryMid($key, $i, 1)) Next For $i = 0 To $blocksize - 1 $a_opad[$i] = BitXOR($a_opad[$i], $oconst) $a_ipad[$i] = BitXOR($a_ipad[$i], $iconst) Next For $i = 0 To $blocksize - 1 $ipad &= Binary('0x' & Hex($a_ipad[$i], 2)) $opad &= Binary('0x' & Hex($a_opad[$i], 2)) Next Return _Crypt_HashData($opad & _Crypt_HashData($ipad & $message, $CALG_MD5), $CALG_MD5) EndFunc -
Hallo!
Code
Alles anzeigen' Quelle: https://stackoverflow.com/questions/75025085/2fa-of-the-google-authenticator-app-with-vba Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Private Declare Sub GetSystemTime Lib "Kernel32" (ByRef lpSystemTime As SYSTEMTIME) Function otpOut() Dim Key As String, Secret As String, Time As String, hmac As String, ch As String, p1 As String, p2 As String, otp As String Dim offset As Long, d As Long, i As Long, n As Long, j As Long, a As Long Secret = UCase("AWSD1F") n = 0 j = 0 For i = 1 To Len(Secret) ch = Mid$(Secret, i, 1) If ch >= "A" And ch <= "Z" Then d = asc(ch) - asc("A") ElseIf ch >= "2" And ch <= "7" Then d = asc(ch) - asc("0") + 24 End If n = (ShiftLeft(n, 5)) + d j = j + 5 If j >= 8 Then j = j - 8 Key = Key & WorksheetFunction.Dec2Hex(ShiftRight((n And ShiftLeft(255, j)), j), 2) End If Next i Time = Right("0000000000000000" & Hex(WorksheetFunction.Floor(CurrentTimeMillis() / 1000 / 30, 1)), 16) hmac = HEX_HMACSHA1(Time, Key) offset = Hex2UInt(Right(hmac, 1)) p2 = Hex2UInt("7fffffff") If offset = 0 Then p1 = Hex2UInt(Left(hmac, 8)) Else p1 = Hex2UInt(Mid(hmac, offset * 2 + 1, 8)) End If otpOut = Right(WorksheetFunction.Bitand(p1, p2), 6) End Function Function CurrentTimeMillis() As Double Dim st As SYSTEMTIME GetSystemTime st Dim t_Start, t_Now t_Start = DateSerial(1970, 1, 1) ' Starting time for Linux t_Now = DateSerial(st.wYear, st.wMonth, st.wDay) + _ TimeSerial(st.wHour, st.wMinute, st.wSecond) CurrentTimeMillis = DateDiff("s", t_Start, t_Now) * 1000 + st.wMilliseconds End Function Function Hex2UInt(h As String) As Double Dim dbl As Double: dbl = CDbl("&h" & h) If dbl < 0 Then dbl = CDbl("&h1" & h) - 4294967296# End If Hex2UInt = dbl End Function Public Function HEX_HMACSHA1(ByVal sTextToHash As String, ByVal sSharedSecretKey As String) As String Dim asc As Object Dim enc As Object Dim TextToHash() As Byte Dim SharedSecretKey() As Byte Dim Bytes() As Byte Dim sHexString As String Dim i As Long Set asc = CreateObject("System.Text.UTF8Encoding") Set enc = CreateObject("System.Security.Cryptography.HMACSHA1") TextToHash = HexStringToByteArray(sTextToHash) SharedSecretKey = HexStringToByteArray(sSharedSecretKey) enc.Key = SharedSecretKey Bytes = enc.ComputeHash_2((TextToHash)) HEX_HMACSHA1 = ByteArrayToHexStr(Bytes) Set asc = Nothing Set enc = Nothing End Function Function HexStringToByteArray(strInput As String) As Byte() Dim rMatch As Object Dim s As String Dim arrayMatches() As Byte Dim i As Long With New RegExp .Global = True .IgnoreCase = True .Pattern = "([A-F0-9]{2})" If .Test(strInput) Then For Each rMatch In .Execute(strInput) ReDim Preserve arrayMatches(i) arrayMatches(i) = Hex2UInt(rMatch.Value) i = i + 1 Next End If End With HexStringToByteArray = arrayMatches End Function Function ByteArrayToHexStr(b() As Byte) As String Dim n As Long, i As Long ByteArrayToHexStr = Space$(2 * (UBound(b) - LBound(b)) + 2) n = 1 For i = LBound(b) To UBound(b) Mid$(ByteArrayToHexStr, n, 2) = Right$("00" & Hex$(b(i)), 2) n = n + 2 Next End Function Public Static Function ShiftLeft(ByVal Value As Long, ByVal ShiftCount As Long) As Long Dim Pow2(0 To 31) As Long Dim i As Long Dim mask As Long Select Case ShiftCount Case 1 To 31 If i = 0 Then Pow2(0) = 1 For i = 1 To 30 Pow2(i) = 2 * Pow2(i - 1) Next i End If mask = Pow2(31 - ShiftCount) If Value And mask Then ShiftLeft = (Value And (mask - 1)) * Pow2(ShiftCount) Or &H80000000 Else ShiftLeft = (Value And (mask - 1)) * Pow2(ShiftCount) End If Case 0 ShiftLeft = Value End Select End Function Public Static Function ShiftRight(ByVal Value As Long, ByVal ShiftCount As Long) As Long Dim lPow2(0 To 30) As Long Dim i As Long Select Case ShiftCount Case 0 To 30 If i = 0 Then lPow2(0) = 1 For i = 1 To 30 lPow2(i) = 2 * lPow2(i - 1) Next End If If Value And &H80000000 Then ShiftRight = Int(Value / lPow2(ShiftCount)) Else ShiftRight = Value \ lPow2(ShiftCount) End If Case 31 If Value And &H80000000 Then ShiftRight = -1 Else ShiftRight = 0 End If End Select End Function1. Könnte mal bitte jemand schauen wie es in AutoIt aussehen könnte? Vielleicht ist es ja in AutoIt sogar leichter. ("WorksheetFunction" liese sich vielleicht sogar nutzen, mit der passenden Referenzierung. Stellt sich die Frage ob das nötig ist.
).2. Gibt es irgendwo eine Seite, auf der man das lernen kann? Vielleicht sogar mit Vergleich zwischen VBA und AutoIt? Wie/wo habt ihr das gelernt?
Danke!
Gruß, René
-
Fehler doch noch gefunden. Immer diese Denkfehler. Die Positionierungen passten nicht.
-
Die dritte Zeile ist nicht mehr drin. Trotzdem komme ich mit der Maus nicht rein. Ich finde den Fehler nicht.
Code
Alles anzeigen; Font type to be used for setting the font of the controls. Local Const $sFont = "Arial Black Narrow" Local $strText = "Sie starten das Projekt zum ersten Mal. Sie benötigen einen Lizenzcode. " & _ "Diesen können Sie beim Autor anfordern, sofern Sie zur Nutzung berechtigt sind. " & _ @CRLF & @CRLF & "Ihre PC-ID lautet " & $stringCodeBeginn & @CRLF & @CRLF & _ "Teilen Sie den Lizenzcode dem Autor mit. Die ID wird automatisch in die Zwischenablage eingefügt, wenn Sie das Eingabefeld leer lassen. " & _ "Wenn Sie bereits einen Lizenzcode haben, dann geben Sie ihn in das Eingabefeld ein und klicken auf 'Eintragen'. Sonst klicken Sie auf 'Abbrechen'." ; Create a GUI with various controls. Local $hGUI = GUICreate("Lizenzcode eingeben", 800, 380) ; Create label controls. GUICtrlCreateLabel($strText, 10, 10, 780, 330) GUICtrlSetFont(-1, 16, $FW_NORMAL, $sFont) ;Set the font of the previous control. Local $sText = GUICtrlCreateEdit("ID eingeben", 10, 260, 780, 20, BitOR($GUI_SS_DEFAULT_EDIT, $GUI_SS_DEFAULT_INPUT, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL)) GUICtrlSetFont(-1, 10, $FW_NORMAL, $sFont) ;Set the font of the previous control. Local $idButton_Close = GUICtrlCreateButton("Abbrechen", 700, 330, 85, 25) Local $idButton_Read = GUICtrlCreateButton("Eintragen", 600, 330, 85, 25) ; Display the GUI. GUISetState(@SW_SHOW) ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $idButton_Read IniWrite(@ScriptDir & "\files\Lizenzcode.ini", "Kennwort", "Open", GUICtrlRead($sText)) IniWrite(@ScriptDir & "\files\Lizenzcode.ini", "Kennwort", "PC-ID", $stringCodeBeginn) ExitLoop Case $idButton_Close ClipPut($stringCodeBeginn) Exit EndSwitch WEnd ; Delete the previous GUI and all controls. GUIDelete($hGUI)