Hallo zusammen,
ich habe ein SingleSignOn-Skript geschrieben, welches Benutzernamen und Kennwort einer Anwendung automatisch beim Start des Programmes durch den User eingibt.
Da das Ganze auf einem Terminalserver ausgeführt wird, bin ich um jedes Quäntchen Speicher froh, welches eingespart werden kann. Daher auch mein DLL-Aufruf in der While-Schleife (Auslagerungsdatei ?!).
Welche Tipps, gerade für die letzte While-Schleife, welche ja letztendlich bis zum Programmende durchläuft, würdet ihr mir geben? Lieber mit Switch und Case arbeiten? Den DLL-Schließen-Befehl besser außerhalb der Schleife anbringen?
Vielen Dank !
[autoit]#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=P:\PWMITDLLcloseinschleife.exe
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
AutoIt Version: 1.0
Author:
PW-Single-Sign-On
#ce ----------------------------------------------------------------------------
#include <file.au3>
#include <misc.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <INet.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
Global Const $h_PsAPI = DllOpen("psapi.dll")
$usr = @username
; Prüft vor dem Starten, ob es sich um den Terminalserver handelt.
If not (@computername = "XXXX" or "XXXX" and @LogonDNSDomain = "XXXX") Then
MsgBox(64,"XXXX - PW AutoLogin","PW kann auf diesem Endgerät nicht gestartet werden.")
_AlarmView("Es wurde versucht, PW auf einem nicht zugelassenen Endgerät zu starten: "&@Computername&" "&@LogonDNSDomain)
Exit
EndIf
; Prüft vor dem Starten, ob bereits eine PW.exe im Taskmanager gestartet ist.
If _Singleton("PWSSO",1) = 0 Then
MsgBox(64,"XXXX - PW AutoLogin","PW wird bereits ausgeführt und kann nicht erneut gestartet werden.")
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " hat versucht, PW doppelt zu starten.")
Exit
Else
EndIf
; Start von PW.exe
$PID = run ("\\srv\PW\client\PW.exe")
; Prüft, ob die PW.Exe startet
If not ProcessWait("PW.exe",10) = true Then
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " erhielt eine Fehlermeldung, da die PW.exe nicht gestartet werden konnte.")
_AlarmView("PW.exe kann nicht gestartet werden")
MsgBox(48,"XXXX - PW AutoLogin","Fehler !")
Exit
Else
EndIf
; Prüft bis zum Erscheinen des PW-Anmeldefensters in Form einer Schleife, ob ein Fehlerdialog (Dienst nicht gestartet o.ä.) erscheint.
While 1
If Not WinActive("[CLASS:TFrmPopErrorDlg]", "") = 0 Then
Send("{Enter}")
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " erhielt vor PW-Anmeldung einen Fehler (TFrmPopErrorDlg)")
_AlarmView("TFrmPopErrorDlg vor Programmstart aufgetreten")
MsgBox(0, "Fehler aufgetreten", "Fehler aufgetreten")
Send("{Enter}")
Exit
EndIf
If Not WinActive("[CLASS:TMessageForm]", "") = 0 Then
Send("{ESC}")
Send("{ESC}")
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " erhielt vor PW-Anmeldung einen Fehler (TMessageForm)")
_AlarmView("TMessageForm vor Programmstart aufgetreten")
MsgBox(0, "Fehler aufgetreten", "Fehler aufgetreten")
Exit
EndIf
$var = WinExists("PW-Anmeldung")
If $var = 1 then ExitLoop
sleep(100)
WEnd
WinWait("PW-Anmeldung")
[/autoit][autoit][/autoit][autoit]; Eingabe von Benutzernamen und Kennwort.
BlockInput(1)
ControlSend("PW-Anmeldung", "", "[CLASS:TEdit; INSTANCE:2]",@Username)
ControlSend("PW-Anmeldung", "", "[CLASS:TEdit; INSTANCE:1]", "testtest")
ControlSend("PW-Anmeldung", "", "", "{Enter}")
BLOCKINPUT(0)
; Prüft, ob Benutzername oder Kennwort abgewiesen werden.
WinWait("[CLASS:TMessageForm]", "",1)
If WinExists("[CLASS:TMessageForm]", "") Then
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " erzeugte einen Anmeldefehler.")
_AlarmView("Benutzername oder Kennwort abgewiesen")
MsgBox(0, "jjjj", "PW falsch")
ProcessClose($PID)
Exit
Else
EndIf
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " angemeldet")
; Startet das Dispo-Auswahlfenster.
;WinWaitActive("[CLASS:TMainForm]", "")
;ControlSend("[CLASS:TMainForm]", "", "", "{F12}")
;sleep(100)
;ControlSend("[CLASS:TMainForm]", "", "", "{P}")
;sleep(100)
;ControlSend("[CLASS:TMainForm]", "", "", "{D}")
;sleep(100)
;ControlSend("[CLASS:TMainForm]", "", "", "{D}")
; Überwacht ab der erfolgreichen Anmeldung, ob die Abmeldung bzw. das Programmende eintritt oder versucht wird, das Kennwort zu ändern.
While 1
sleep(100)
If Not ProcessExists($PID) Then
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " abgemeldet")
MsgBox(0, "ende", "ende")
Exit
EndIf
sleep(100)
If WinActive("[CLASS:TFrmDBValidatePassword]", "") Then
Send("{ESC}")
Send("{ESC}")
Send("{Enter}")
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " hat versucht, eine Passwortänderung durchzuführen.")
MsgBox(0, "jjjj", "jjjj")
EndIf
sleep(100)
If WinActive("[CLASS:TFrmLogin2]", "") Then
_FileWriteLog(@ScriptDir & "\"&$usr&".log", @Username & " abgemeldet (und PW-Anmeldedialog geöffnet.")
MsgBox(0, "F", "Fenster erkannt")
Exit
EndIf
DllCall($h_PsAPI, 'int', 'EmptyWorkingSet', 'long', -1)
DllClose($h_PsAPI)
WEnd
; eMail-Funktion
Func _AlarmView($text = "Kein Parameter")
$s_SmtpServer = "192.168.9.2"
$s_Username = ""
$s_Password = ""
$IPPort = 25
$s_FromName = "PW"
$s_FromAddress = "PW"
$s_ToAddress = "AlarmView@192.168.9.2"
$s_Subject = "PW-Fehlermeldung steht an"
Dim $as_Body[2]
$as_Body[0] = "Es wurde eine Fehlermeldung ausgegeben."
$as_Body[1] = ""&@Username &" erzeugte den Fehler: "& $text
$Response = _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body, @computername, -1)
$err = @error
If $Response = 1 Then
Else
EndIf
Endfunc