Dieses Skript habe ich für mein Heimnetzwerk geschrieben, in dem Netzwerk befinden sich 4 Rechner, von denen einer als "Server" fungiert. Auf diesem Server sind Daten, für die anderen Rechner freigegeben. Zwar ist der Server ein stromsparender PC, aber der muss ja auch nicht immer unnötig laufen, deshalb hatte ich die Idee den Server immer nur anzuschalten, wenn man einen anderen Rechner im Netzwerk hochfährt.
Das Skript bewerkstelligt folgendes:
Client(ein Rechner im Netzwerk) wird hochgefahren, im Autostart-Ordner befindet sich die "Client.exe"
der Client pingt den Server an, wenn keine Antwort kommt wird der Server per WakeOnLan gestartet.
Auf dem Server ist die automatische Benutzeranmeldung konfiguriert, dadurch muss auf dem Rechner keine Eingabe getätigt werden, die Server.exe, die sich im Autostart-Ordner des Server befindet wird gestartet. Nun schickt die Client.exe den Befehl an den Server er solle den Client doch bitte auf der Nutzungs-Liste eintragen. Andere Clients können sich nun auch noch auf dieser Liste eintragen. Wenn nun ein Client beendet wird signalisiert die Client.exe dem Server, dass sie keinen Zugriff mehr benötigt, der Eintrag des Clients wird aus der Nutzungs-Liste entfernt, wenn kein anderer Client in der Liste eingetragen ist wird der Server heruntergefahren. Wer einen passenden Namen kennt darf ihn natürlich vorschlagen.
Bis jetzt ist das Skript speziell auf mein Netzwerk abgestimmt, ihr müsst also noch die IP des Servers, dessen MAC-Adresse für WakeOnLan und die Broadcast-Adresse einfügen.
"Server.au3"
#include <Array.au3>
Dim $Clients, $recv = ""
TCPStartup()
$ip = "127.0.0.1"
Global $MSocket = TCPListen($ip, 5433)
While 1
$Socket = TCPAccept($MSocket)
If $Socket <> -1 Then; Eingehende Verbindung
While 1
$recvn = TCPRecv($Socket, 2048)
$recv &= $recvn
$split = StringSplit($recv,"|")
If Not @error Then
If StringLen($split[1]) == Number($split[2]) Then; Rechner hinzufügen
If Not IsArray($Clients) Then
Dim $Clients[1]
$Clients[0]=$split[1]
Else
_ArrayAdd($Clients, $split[1])
EndIf
TCPCloseSocket($Socket)
$Socket = -1
ExitLoop
ElseIf StringLen($split[1]) == -Number($split[2]) Then; Rechner löschen
$index = _ArraySearch($Clients, $split[1])
If Not @error Then; Wenn Rechner in Liste
_ArrayDelete($Clients, $index); Array-Eintrag löschen
If Not IsArray($Clients) Then; letzter EIntrag gelöscht --> herunterfahren
TCPCloseSocket($Socket)
TCPCloseSocket($MSocket)
$Socket = -1
TCPShutdown()
Shutdown(9)
Exit
EndIf
EndIf
EndIf
EndIf
WEnd
$recv = ""
EndIf
Sleep(50)
WEnd
"Client.au3"
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.1.1 (beta)
Author: myName
Script Function:
Template AutoIt script.
#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]; Script Start - Add your code below here
TCPStartup()
Global $ip = "192.168.2.100"; Server-IP
Global $mac = "xxxxxxxxxxxxx"; Mac-Adresse ohne ":"
Global $bip = "192.168.2.255"; Broadcast-IP
Ping($ip)
If @error Then
WOL($mac, $bip); WakeOnLan
EndIf
Do
$Socket = TCPConnect($ip, 5433)
Until $Socket <> -1; Versuchen auf anderen Rechner zu connecten
TCPSend($Socket, @ComputerName & "|" & StringLen(@ComputerName)); Rechner zur Liste auf dem Server hinzufügen
TCPCloseSocket($Socket)
TCPShutdown()
While 1
Sleep(500); Nix machen
WEnd
Func OnAutoItExit(); wird beim Beenden/Herunterfahren aufgerufen
TCPStartup()
$Socket = TCPConnect($ip, 5433)
TCPSend($Socket, @ComputerName & "|" & - StringLen(@ComputerName)); Rechner von der Liste auf dem Server löschen
TCPCloseSocket($Socket)
TCPShutdown()
EndFunc ;==>OnAutoItExit
Func WOL($MACAddress, $IPBroadcast)
$IPAddress = $IPBroadcast
UDPStartup()
[/autoit] [autoit][/autoit] [autoit]$connexion = UDPOpen($IPAddress, 7)
$res = UDPSend($connexion, GenerateMagicPacket($MACAddress))
UDPCloseSocket($connexion)
UDPShutdown()
EndFunc ;==>WOL
; ===================================================================
; Functions
; ===================================================================
; This function convert a MAC Address Byte (e.g. "1f") to a char
Func HexToChar($strHex)
Return Chr(Dec($strHex))
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>HexToChar
[/autoit] [autoit][/autoit] [autoit]; This function generate the "Magic Packet"
Func GenerateMagicPacket($strMACAddress)
$MagicPacket = ""
$MACData = ""
For $p = 1 To 11 Step 2
$MACData = $MACData & HexToChar(StringMid($strMACAddress, $p, 2))
Next
For $p = 1 To 6
$MagicPacket = HexToChar("ff") & $MagicPacket
Next
For $p = 1 To 16
$MagicPacket = $MagicPacket & $MACData
Next
Return $MagicPacket
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>GenerateMagicPacket
[/autoit]
Würde mich über Feedback freuen