Ich hab das ganze Script mal überarbeitet und einiges ausgebessert.
Also:
1. Erstelle Controls wenn möglich direkt mit dem Fenster und ändere nur den Inhalt/State später. (Neben $GUI_DISABLE gibt es auch $GUI_HIDE). Dabei hab ich auch gleich die Größe dynamischer gestaltet => Einfach die Variablen über der Gui ändern und alle Controls ändern die Größe entsprechend. Wenn es mehr Controls werden ist das Gold wert.
Normalerweise braucht es bei einem Login auch keiner Anleitung, was als nächstes zu tun ist... deshalb hab ich die mal rausgenommen. Die Information welcher User ausgewählt wurde muss auch nicht extra als Label dazukommen... Der User hat es ausgewählt und SIEHT was er ausgewählt hat. Es ist halt nur fürs debugging für dich interessant und sollte deshalb temporär mit dem ConsoleWrite/MsgBox ausgegeben werden. (Außer du hast es mit Menschen zu tun, die noch nie einen Computer gesehen haben... dann könnte es sinn machen).
2. Die Nutzer in einem Array speichern. Dadurch kannst du mit 1ner Zeile später Nutzer hinzufügen,... ohne die ganzen Funktionen,... zu erstellen. Zumal der Code immer gleich war. Merke: Wenn du mehrmals fast exakt den gleichen Code hast, dann solltest du ein Array/eine Funktion dafür benutzen.
3. Es wäre extrem unsicher, die Passwörter der Nutzer direkt in der Anwedung zu speichern. Wenn das unbedingt notwendig ist, speicher zumindest nur hashes. Also: Wenn ein neuer Nutzer dazukommt einfach in der Region: Generate passwordhash... die Zeilen auskommentieren und die passwörter eintragen, hashes generieren lassen und diese mit dem salt in das array $arUsers speichern. Danach UNBEDINGT die passwörter wieder aus der Region entfernen. (Alternativ einfach die passwörter als commandlineargument beim start übergeben, keine Ahnung, wie gut du dich mit so etwas auskennst.)
Hintergrund: Man kann die .exe am ende mit einem Texteditor öffnen und die Passwörter rauslesen. Mit hashes wird es sehr viel schwieriger (und extremst rechenintensiv) => fast unmöglich für normale nutzer und auch für experten zumindest sehr schwer. Falls dich das Thema interessiert such einfach mal nach "Passwörter sicher speichern" und hashes, dann wirst du schnell fündig.
#include <AutoItConstants.au3>
#include <ColorConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <FontConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WinAPIGdi.au3>
#include <WinAPIHObj.au3>
#include <WindowsConstants.au3>
#include <misc.au3>
#include <array.au3>
#include <Crypt.au3>
#Region ; Script Kopf
#cs ----------------------------------------------------------------------------
Script Function: Diese Script soll bei der Windowsanmeldung, bzw. von Hand gestartet werden können.
Die Aufgaben sollen sein:
- Benutzer via Dropdownbox auswählen
- Passwort eingeben
- Passwort überprüfen
- Wenn Passwort OK, dann ...
- verschiedene Netzwerklaufwerke auf der NAS verbinden
- verschiedene Outlook Profile mit dem jeweiligen Benutzer verbinden
- Optional: Protokolldatei schreiben, wer sich wann angemeldet hat
- Optional: Überlegung was passiert beim sperren oder Logout Prozess von Windows.
Erstellungendatum: 17.11.2021 - Start
Änderungsdatum:
Version: 0.0.0.*
History:
0.0.0.*: Entwicklungsphase
1.0.0.0: Initialerstellung
Info: Passwörter werden in der Globale Variablendeklaration gesetzt
#ce ----------------------------------------------------------------------------
#EndRegion ; Script Kopf
#Region ; Generate passwordhash with commandline (Maybe put the code in a different program)
; ReDim $CmdLine[4]
; $CmdLine[0]=3
; $CmdLine[1]="CoolPasswordToHash"
; $CmdLine[1]="OtherCoolPasswordToHash"
If Ubound($CmdLine) > 1 Then
_Crypt_Startup()
For $i=1 To UBound($CmdLine)-1 Step 1
$sSalt = __Crypt_GenerateSalt(12)
$sHash = _Crypt_HashData($CmdLine[$i]&$sSalt, $CALG_SHA_256)
ConsoleWrite("Hash "&$i&": "&$sHash&" SALT: "&$sSalt&@crlf)
Next
_Crypt_Shutdown()
exit
EndIf
#EndRegion ; Globale Variablendeklaration
#Region ; AutoIt-Spezifischen Optionen
Opt("GUICloseOnESC", 1) ; Wenn man die ESC Taste drückt, wird die GUI geschlossen, da eine $GUI_EVENT_CLOSE Nachricht gesendet wird
Opt("MustDeclareVars", 1) ; Variablen (Dim / Global / Local / Const) müssen deklariert sein. Wichtig für Fehlersuche
Opt("TrayIconDebug", 1) ; Zeigt die aktuelle Skriptzeile im Trayicon Tipp um das Debugging zu unterstützen
Opt("WinTitleMatchMode", 2) ; 1=vom Anfang, 2=enthält, 3=genau, 4=fortgeschritten, -1 bis -4=Groß-/Klein ignorieren
#EndRegion ; AutoIt-Spezifischen Optionen
#Region ; Globale Variablendeklaration
Global $iMsg, $hGUI, $hGUIMain, $hGUILogin, $idComboBox, $sComboRead = "", $sPassword, $sPasswortCheck
Global $sFileVersion = FileGetVersion(@AutoItExe)
Global $arUsers = [ _ ; USERNAME ; PASSWORDHASH ; SALT
["BenutzerA", "0xAAA79A151040DE772FB6D807C1CC554AA2F300C3D9D75362CE51B850708E6365", "vsaAOMmDiwBvP"], _
["BenutzerB", "0x9AAE126ECFC48AEDBE436C4AD29E703E7AD8429C77DEDECD0012E7298560F345", "FE3yRGBA1Emlv"], _
["Mitarbeiter", "0x4F179B63ADFB8DAF1BB66FF84BFA214C4CD72A4A83AEA14062E7DF91C80B4A21", "h1COZUA2FtfV5"] _
]
#EndRegion ; Globale Variablendeklaration
#Region ; GUI Erstellung
Global $iGuiMainWidth = @DesktopWidth, $iGuiMainHeight = @DesktopHeight
$hGUIMain = GUICreate("", $iGuiMainWidth, $iGuiMainHeight) ; Das Hauptfenster wird erstellt
GUISetState(@SW_MAXIMIZE, $hGUIMain) ; Hauptfenster maximieren, damit der Rand besser ausschaut
GUISetBkColor(0x4d4d4d) ; Ändert die Hintergrundfarbe in ein grau
GUISetState(@SW_SHOW, $hGUIMain) ; Das Hauptfenster neu aufbauen
Global $iGuiLoginWidth = 550, $iGuiLoginHeight = 200, $iGuiLoginSpaceLeft = 30, $iGuiLoginSpaceRight = 30, $iGuiLoginWidthWithoutSpace = $iGuiLoginWidth - $iGuiLoginSpaceLeft - $iGuiLoginSpaceRight
$hGUILogin = GUICreate(" Login - Firma Reik Raumausstattung", $iGuiLoginWidth, $iGuiLoginHeight, Default, Default, Default, Default, $hGUIMain) ; Das davor liegende Childfenster wird erstellt
GUISwitch($hGUILogin) ; Das Childfenster wird zum aktuellen Fenster angewendet, damit dort GUI Funktionen angewendet werden können.
GUISetBkColor(0x680000) ; Ändert die Hintergrundfarbe in ein rot
GUICtrlCreateLabel("Bitte wähle Deinen Benutzer aus:", $iGuiLoginSpaceLeft, 10, $iGuiLoginWidthWithoutSpace) ; Beschreibender Text erstellen
GUICtrlSetColor(-1, 0xFFFFFF) ; Setzt die Schriftfarbe auf weiss
GUICtrlSetFont(-1, 12)
$idComboBox = GUICtrlCreateCombo("", $iGuiLoginSpaceLeft, 50, $iGuiLoginWidthWithoutSpace) ; Dropdown Menü erstellen
GUICtrlSetFont(-1, 10)
Local $sUsers=""
For $i=0 to UBound($arUsers)-1 step 1
If not $sUsers = "" Then $sUsers&="|"
$sUsers&=$arUsers[$i][0]
next
GUICtrlSetData($idComboBox, $sUsers)
Global $idLabelPasswordResponse=GUICtrlCreateLabel("", $iGuiLoginSpaceLeft, 150, $iGuiLoginWidthWithoutSpace, 25) ; Schreibe erfolgreiche Passworteingabemeldung
GUICtrlSetFont(-1, 12)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateLabel("Passwort:", $iGuiLoginSpaceLeft, 90, $iGuiLoginWidthWithoutSpace) ; Schreibe Passwort
GUICtrlSetFont(-1, 12)
GUICtrlSetColor(-1, 0xFFFFFF) ; Setzt die Schriftfarbe auf weiss
Global $idInputPassword = GUICtrlCreateInput("", $iGuiLoginSpaceLeft, 120, $iGuiLoginWidthWithoutSpace, Default, BitOR($ES_PASSWORD, $ES_AUTOHSCROLL)) ; Inputfeld für Passwort
GUICtrlSetFont(-1, 12)
GUICtrlSetColor(-1, 0x000000) ; Setzt die Schriftfarbe auf weiss
GUICtrlSetState($idInputPassword, $GUI_DISABLE)
GUISetState(@SW_SHOW, $hGUILogin) ; Das Childfenster neu aufbauen
#EndRegion ; GUI Erstellung
#Region ; Hauptschleife
$iMsg = 0
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idComboBox
GUICtrlSetState($idInputPassword, $GUI_ENABLE)
EndSwitch
If _IsPressed("0D") and WinActive($hGUILogin) Then ; Check if ENTER was pressed and the Login window is currently active
_tryPassword(GUICtrlRead($idComboBox), GUICtrlRead($idInputPassword))
EndIf
WEnd
GUIDelete($hGUI) ; schließe die GUI
#EndRegion ; Hauptschleife
Func _tryPassword($sUser, $sPassword)
; search the user array for the index of the user
Local $iUserIndex=-1
For $i = 0 to UBound($arUsers)-1 Step 1
If $arUsers[$i][0] = $sUser Then
$iUserIndex=$i
ExitLoop
EndIf
Next
If $iUserIndex=-1 Then ; user not found
GUICtrlSetData($idLabelPasswordResponse, "Der Nutzer """&$sUser&""" konnte nicht gefunden werden!")
return false
EndIf
If _checkPassword($sPassword, $arUsers[$iUserIndex][1], $arUsers[$iUserIndex][2]) Then ; password correcty
GUICtrlSetData($idLabelPasswordResponse, "Das Passwort wurde korrekt eingegeben. Login wird fortgesetzt ...")
return true
Else ; password wrong
GUICtrlSetData($idLabelPasswordResponse, "Das Passwort war nicht korrekt. Bitte nochmals probieren!")
return false
EndIf
EndFunc
Func _checkPassword($sPassword, $sHash, $sSalt)
return _Crypt_HashData($sPassword&$sSalt, $CALG_SHA_256) = $sHash
EndFunc
Func __Crypt_GenerateSalt($length)
Local $sChars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Local $arChars=StringSplit($sChars,"", 1+2)
Local $sSalt=""
For $i=0 to $length Step 1
$sSalt&=$arChars[Random(0,UBound($arChars)-1, 1)]
Next
return $sSalt
EndFunc
Func _02_Steuerung($sBenutzer)
_03_Laufwerke($sBenutzer)
_04_Outlook()
EndFunc ;==>_02_Steuerung
Func _03_Laufwerke($sBenutzer) ; Benutzerlaufwerke managen
; Verbindungen trennen
GUICtrlCreateLabel("Loginscript von " & $sBenutzer & " wird gestartet", 150, 310, 400) ; Schreibe erfolgreiche Passworteingabemeldung
GUICtrlSetFont(-1, 12)
GUICtrlSetColor(-1, 0xFFFFFF) ; Setzt die Schriftfarbe auf weiss
GUISetState(@SW_SHOW, $hGUILogin) ; Das Childfenster neu aufbauen
; Laufwerke löschen - eventuell vorher Anwendungen schließen, die auf diese Laufwerke zugreifen.
; Kontrolliern ob Sie gelöscht sind
; Laufwerke neu mappen
EndFunc ;==>_03_Laufwerke
Func _04_Outlook() ; Outlookprofile managen
EndFunc ;==>_04_Outlook
Alles anzeigen
Edit: Fix mistake Line 136 using #sPasswort instead of the control $idInputPassword