#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
Local Const $sDBDir = @ScriptDir & "\Datenbank\"
Local Const $sDBName = "ThinClientManager"
Local Const $sBroadcast = "10.1.255.255"
Local $hQuery, $aRow, $aResult, $iRows, $iColumns
#Region ### START Koda GUI section ### Form=
$hGui = GUICreate("ThinClientManager", 799, 614, Default, Default)
$cmMenue = GUICtrlCreateMenu("Menü")
$cmMenueBeenden = GUICtrlCreateMenuItem("Beenden", $cmMenue)
$cmEinstellungen = GUICtrlCreateMenu("Einstellungen")
$cmEinstellungenClient = GUICtrlCreateMenu("ThinClients", $cmEinstellungen)
$cmEinstellungenClientAdd = GUICtrlCreateMenuItem("Hinzufügen", $cmEinstellungenClient)
$cmEinstellungenClientDel = GUICtrlCreateMenuItem("Entfernen", $cmEinstellungenClient)
$cmEinstellungenBefehle = GUICtrlCreateMenu("Befehle", $cmEinstellungen)
$cmEinstellungenBefehleAdd = GUICtrlCreateMenuItem("Hinzufügen", $cmEinstellungenBefehle)
$cmEinstellungenBefehleDel = GUICtrlCreateMenuItem("Entfernen", $cmEinstellungenBefehle)
$cRoomCombo = GUICtrlCreateCombo("Raum 1", 9, 8, 303, 25)
GUICtrlSetData($cRoomCombo, "Raum 2|Raum 3|Raum 4", "Raum 1")
GUICtrlSetState($cRoomCombo,32)
If $CmdLine[0] = 0 Then
$sRoomlisted = GUICtrlRead($cRoomCombo)
Else
$sRoomlisted = $CmdLine[1]
EndIf
$cListViewThinClients = GUICtrlCreateListView("", 9, 40, 300, 539)
$hListViewThinClients = GUICtrlGetHandle($cListViewThinClients)
_GUICtrlListView_AddColumn($hListViewThinClients, "Hostname", 270)
$cListViewCommands = GUICtrlCreateListView("", 329, 40, 300, 539)
$hListViewCommands = GUICtrlGetHandle($cListViewCommands)
_GUICtrlListView_AddColumn($hListViewCommands, "Befehl", 270)
$cRun = GUICtrlCreateButton("Befehl ausführen", 648, 48, 137, 57)
#EndRegion ### END Koda GUI section ###
$sSQliteDll = _SQLite_Startup()
If @error Then
MsgBox(16, "SQLite Fehler", "SQLite.dll konnte nicht geladen werden!")
_SQLite_Close()
_SQLite_Shutdown()
Exit
EndIf
If Not FileExists($sDBDir) Then DirCreate($sDBDir)
$hSQliteDB = _SQLite_Open($sDBDir & $sDBName & ".sql")
If Not _SQLite_ErrMsg($hSQliteDB) = "not an Error" Then MsgBox(64, "Error", _SQLite_ErrMsg($hSQliteDB))
If Not _SQLite_Exec($hSQliteDB, "SELECT * FROM t_THINCLIENTS;", $hQuery) = $SQLITE_OK Then
_SQLite_Exec($hSQliteDB, "BEGIN IMMEDIATE TRANSACTION")
_SQLite_Exec($hSQliteDB, "CREATE TABLE t_THINCLIENTS (t_tHOSTNAME,t_tMACADRESS,t_tROOM);")
_SQLite_Exec($hSQliteDB, "COMMIT TRANSACTION")
_SQLite_QueryFinalize($hQuery)
EndIf
If Not _SQLite_Exec($hSQliteDB, "SELECT * FROM t_COMMANDS;", $hQuery) = $SQLITE_OK Then
_SQLite_Exec($hSQliteDB, "BEGIN IMMEDIATE TRANSACTION")
_SQLite_Exec($hSQliteDB, "CREATE TABLE t_COMMANDS (t_cCOMMAND,t_cCOMMANDNAME);")
_SQLite_Exec($hSQliteDB, "COMMIT TRANSACTION")
_SQLite_QueryFinalize($hQuery)
EndIf
If Not _SQLite_ErrMsg($hSQliteDB) = "not an Error" Then MsgBox(64, "Error", _SQLite_ErrMsg($hSQliteDB))
_UpdateThinClientlist()
_UpdateBefehlelist()
GUISetState(@SW_SHOW)
AdlibRegister(_onlinecheck(), 10000)
While True
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3, $cmMenueBeenden
AdlibUnRegister(_onlinecheck())
_SQLite_Close()
_SQLite_Shutdown()
Exit
Case $cRoomCombo
_UpdateThinClientlist()
Case $cmEinstellungenBefehleAdd
$sBefehlNameReturn = InputBox("Befehl hinzufügen", "Geben Sie bitte den Anzeigenamen des Befehls ein", "Herunterfahren", Default, Default, Default, Default, Default, Default, $hGui)
_SQLite_Query($hSQliteDB, "SELECT t_cCOMMANDNAME FROM t_COMMANDS WHERE t_cCOMMANDNAME = '" & $sBefehlNameReturn & "';", $hQuery)
Select
Case _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
MsgBox(48, "Warnung", $sBefehlNameReturn & @CRLF & " Name existiert bereits")
Case $sBefehlNameReturn <> ""
$sBefehlcmdReturn = InputBox("Befehl hinzufügen", "Geben Sie den Befehl ein, welcher ausgeführt werden soll", "shutdown -s -t 00 -f", Default, Default, Default, Default, Default, Default, $hGui)
Select
Case $sBefehlcmdReturn <> ""
_SQLite_Exec($hSQliteDB, "BEGIN IMMEDIATE TRANSACTION")
_SQLite_Exec($hSQliteDB, "SAVEPOINT BeforeAdd")
$iRval = _SQLite_Exec($hSQliteDB, "INSERT INTO t_COMMANDS VALUES ('" & $sBefehlcmdReturn & "','" & $sBefehlNameReturn & "');")
Select
Case $iRval = $SQLITE_OK
_SQLite_Exec($hSQliteDB, "RELEASE SAVEPOINT BeforeAdd")
_SQLite_Exec($hSQliteDB, "COMMIT TRANSACTION")
Case Else
MsgBox(16, "Error", _SQLite_ErrMsg($hSQliteDB), 0, $hGui)
_SQLite_Exec($hSQliteDB, "ROLLBACK TRANSACTION TO SAVEPOINT BeforeAdd")
EndSelect
EndSelect
EndSelect
_SQLite_QueryFinalize($hQuery)
_UpdateBefehlelist()
Case $cmEinstellungenClientAdd
$sThinClientNameReturn = InputBox("ThinClient hinzufügen", "Geben Sie bitte den Hostname des Thinclients ein", "R1TC1", Default, Default, Default, Default, Default, Default, $hGui)
_SQLite_Query($hSQliteDB, "SELECT t_tHOSTNAME FROM t_THINCLIENTS WHERE t_tHOSTNAME = '" & $sThinClientNameReturn & "';", $hQuery)
Select
Case _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
MsgBox(48, "Warnung", $sThinClientNameReturn & @CRLF & " Name Existiert bereits")
Case $sThinClientNameReturn <> ""
$sThinClientMACReturn = InputBox("ThinClient hinzufügen", "Geben Sie bitte die MAC-Adresse des Thinclients ein" & @CRLF & "MAC muss das Format 78-E7-D1-B6-EC-55 haben!", "78-E7-D1-B6-EC-55", Default, Default, Default, Default, Default, Default, $hGui)
$sThinClientROOMReturn = InputBox("ThinClient hinzufügen", "Geben Sie bitte die Raumnummer des Thinclients ein", 1, Default, Default, Default, Default, Default, Default, $hGui)
Select
Case $sThinClientROOMReturn <> 1 And $sThinClientROOMReturn <> 2 And $sThinClientROOMReturn <> 3 And $sThinClientROOMReturn <> 4 And $sThinClientROOMReturn <> 5
MsgBox(16, "Error", "Raum existiert nicht!", 0, $hGui)
Case $sThinClientMACReturn <> ""
_SQLite_Exec($hSQliteDB, "BEGIN IMMEDIATE TRANSACTION")
_SQLite_Exec($hSQliteDB, "SAVEPOINT BeforeAdd")
$iRval = _SQLite_Exec($hSQliteDB, "INSERT INTO t_THINCLIENTS VALUES ('" & $sThinClientNameReturn & "','" & $sThinClientMACReturn & "','" & $sThinClientROOMReturn & "');")
Select
Case $iRval = $SQLITE_OK
_SQLite_Exec($hSQliteDB, "RELEASE SAVEPOINT BeforeAdd")
_SQLite_Exec($hSQliteDB, "COMMIT TRANSACTION")
Case Else
MsgBox(16, "Error", _SQLite_ErrMsg($hSQliteDB), 0, $hGui)
_SQLite_Exec($hSQliteDB, "ROLLBACK TRANSACTION TO SAVEPOINT BeforeAdd")
EndSelect
EndSelect
EndSelect
_SQLite_QueryFinalize($hQuery)
_UpdateThinClientlist()
Case $cmEinstellungenClientDel
$sThinClientNameReturn = InputBox("ThinClient Löschen", "Geben Sie bitte den Hostname des Thinclients ein", "HOSTNAME", Default, Default, Default, Default, Default, Default, $hGui)
_SQLite_Query($hSQliteDB, "SELECT t_tHOSTNAME FROM t_THINCLIENTS WHERE t_tHOSTNAME = '" & $sThinClientNameReturn & "';", $hQuery)
Select
Case $sThinClientNameReturn = ""
Case _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
_SQLite_QueryFinalize($hQuery)
_SQLite_Exec($hSQliteDB, "BEGIN IMMEDIATE TRANSACTION")
_SQLite_Exec($hSQliteDB, "SAVEPOINT BeforeDelete")
$iRval = _SQLite_Exec($hSQliteDB, "DELETE FROM t_THINCLIENTS WHERE t_tHOSTNAME = '" & $sThinClientNameReturn & "';")
Select
Case $iRval = $SQLITE_OK
_SQLite_Exec($hSQliteDB, "RELEASE SAVEPOINT BeforeDelete")
_SQLite_Exec($hSQliteDB, "COMMIT TRANSACTION")
MsgBox(0, "", "Löschen erfolgreich")
Case Else
MsgBox(16, "Error", _SQLite_ErrMsg($hSQliteDB), 0, $hGui)
_SQLite_Exec($hSQliteDB, "ROLLBACK TRANSACTION TO SAVEPOINT BeforeDelete")
EndSelect
Case Else
MsgBox(48, "Warning", "Hostname existiert nicht!", 0, $hGui)
EndSelect
_UpdateThinClientlist()
Case $cRun
$aReturnCommandsSelected = _GUICtrlListView_GetSelectedIndices($hListViewCommands)
$sReturnCommandsSelected = _GUICtrlListView_GetItemText($hListViewCommands, $aReturnCommandsSelected, 0)
$aReturnHostSelected = _GUICtrlListView_GetSelectedIndices($hListViewThinClients)
$sReturnHostSelected = _GUICtrlListView_GetItemText($hListViewThinClients, $aReturnHostSelected, 0)
Switch $aReturnCommandsSelected
Case ""
MsgBox(0, "", "Es muss ein Befehl ausgewählt werden!")
Case Else
Switch $sReturnCommandsSelected
Case "VNC Verbindung aufbauen"
ShellExecute(@ScriptDir & "\vncviewer.exe", $sReturnHostSelected & " /autoscaling /password lcs")
Case "ThinClient starten"
$iRval = _SQLite_GetTable2d($hSQliteDB, "SELECT t_tMACADRESS FROM t_THINCLIENTS WHERE t_tHOSTNAME = '" & $sReturnHostSelected & "';", $aResult, $iRows, $iColumns)
Select
Case UBound($aResult) <> 2
MsgBox(16, "Error", "Fehlgeschlagen", 0, $hGui)
Case $iRval = $SQLITE_OK
ShellExecute(@ScriptDir & "\Wake.exe", $aResult[1][0] & " " & $sBroadcast, @ScriptDir, Default, @SW_HIDE)
Case Else
MsgBox(16, "Error", _SQLite_ErrMsg($hSQliteDB), 0, $hGui)
EndSelect
Case Else
$iRval = _SQLite_GetTable2d($hSQliteDB, "SELECT t_cCOMMAND FROM t_COMMANDS WHERE t_cCOMMANDNAME = '" & $sReturnCommandsSelected & "';", $aResult, $iRows, $iColumns)
Select
Case UBound($aResult) <> 2
MsgBox(16, "Error", "Fehlgeschlagen", 0, $hGui)
Case $iRval = $SQLITE_OK
TCPStartup()
$socket = TCPConnect(_getipfromhostname($sReturnHostSelected), 61545)
$sendedBytes = TCPSend($socket, $aResult[1][0])
Switch $sendedBytes
Case 0
MsgBox(16, "Error", "Der Befehl konnte nicht gesendet werden.")
EndSwitch
Case Else
MsgBox(16, "Error", _SQLite_ErrMsg($hSQliteDB), 0, $hGui)
EndSelect
TCPCloseSocket($socket)
TCPShutdown()
EndSwitch
EndSwitch
EndSwitch
WEnd
AdlibUnRegister(_onlinecheck())
Func _UpdateThinClientlist()
$iRval = _SQLite_GetTable2d($hSQliteDB, "SELECT t_tHOSTNAME FROM t_THINCLIENTS WHERE t_tROOM = '" & StringRight($sRoomlisted, 1) & "';", $aResult, $iRows, $iColumns)
If $iRval = $SQLITE_OK Then
_GUICtrlListView_BeginUpdate($hListViewThinClients)
_GUICtrlListView_DeleteAllItems($hListViewThinClients)
_GUICtrlListView_AddArray($hListViewThinClients, $aResult)
_GUICtrlListView_DeleteItem($hListViewThinClients, 0)
_GUICtrlListView_EndUpdate($hListViewThinClients)
Else
MsgBox(16, "Error", _SQLite_ErrMsg($hSQliteDB))
EndIf
EndFunc ;==>_UpdateThinClientlist
Func _UpdateBefehlelist()
$iRval = _SQLite_GetTable2d($hSQliteDB, "SELECT t_cCOMMANDNAME FROM t_COMMANDS;", $aResult, $iRows, $iColumns)
If $iRval = $SQLITE_OK Then
_GUICtrlListView_BeginUpdate($hListViewCommands)
_GUICtrlListView_DeleteAllItems($hListViewCommands)
_GUICtrlListView_AddArray($hListViewCommands, $aResult)
_GUICtrlListView_DeleteItem($hListViewCommands, 0)
_GUICtrlListView_InsertItem($hListViewCommands, "ThinClient starten", 0)
_GUICtrlListView_InsertItem($hListViewCommands, "VNC Verbindung aufbauen", 1)
_GUICtrlListView_EndUpdate($hListViewCommands)
Else
MsgBox(16, "Error", _SQLite_ErrMsg($hSQliteDB))
EndIf
EndFunc ;==>_UpdateBefehlelist
Func _onlinecheck()
$aReturnCurrentClients = _GUICtrlListView_GetItemTextArray($hListViewThinClients)
For $i = 1 To $aReturnCurrentClients[0]
If Ping($aReturnCurrentClients[$i], 500) <> 0 Then
ConsoleWrite("online" & @CRLF)
Else
ConsoleWrite("offline" & @CRLF)
EndIf
Next
EndFunc ;==>_onlinecheck
Func _getipfromhostname($sHostname)
Local $sPingPID = Run(@ComSpec & " /c ping " & $sHostname & " /4 /n 1", @SystemDir, @SW_HIDE, 0x8)
While True
Local $sLine = StdoutRead($sPingPID)
If @error Then ExitLoop
If StringRegExp($sLine, "\[.*\]") = 1 Then
Local $aReturnIP = StringRegExp($sLine, "\[.*\]", 1)
Return StringTrimRight(StringTrimLeft($aReturnIP[0], 1), 1)
EndIf
WEnd
Return SetError(0, @extended, -1)
EndFunc ;==>_getipfromhostname