Wake on LAN GUI

    • Offizieller Beitrag

    Überschreib mal die Funktion GetSubnetmask mit dieser und Probiers noch mal!

    [autoit]

    Func GetSubnetmask()
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $Output = ""
    $Output &= "Windows IP-Konfiguration" & @CRLF & @CRLF

    [/autoit][autoit][/autoit][autoit]

    $OEvent = ObjEvent("AutoIt.Error", "nothing") ; Bei Fehler weitermachen, entspricht "On Error Resume Next"

    [/autoit][autoit][/autoit][autoit]

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) Then
    For $objItem In $colItems
    Return $objItem.IPSubnet(0)
    Next
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Return ""
    EndFunc ;==>GetSubnetmask

    [/autoit]

    Der Aufruf muss dann so lauten

    [autoit]

    GetBroadcast("192.168.178.21", GetSubnetmask())

    [/autoit]
    • Offizieller Beitrag

    Probiert mal das Programm, ist nicht anderes als IPConfig, habt ihr vllt. mehrer Netzwerkkarten aktiv?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $Output = ""
    $Output &= "Windows IP-Konfiguration" & @CRLF & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    $OEvent = ObjEvent("AutoIt.Error", "nothing") ; Bei Fehler weitermachen, entspricht "On Error Resume Next"

    [/autoit] [autoit][/autoit] [autoit]

    $objWMIService=ObjGet("winmgmts:\\" &$strComputer &"\root\CIMV2")
    $colItems=$objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $Output &= @TAB & "Hostname. . . . . . . . . . . . . : " & $objItem.DNSHostName & @CRLF
    $Output &= @TAB & "Verbindungsspezifisches DNS-Suffix: " & $objItem.DNSDomainSuffixSearchOrder(0) & @CRLF
    $Output &= @TAB & "Beschreibung. . . . . . . . . . . : " & $objItem.Description & @CRLF
    $Output &= @TAB & "Physikalische Adresse . . . . . . : " & StringReplace($objItem.MACAddress,":","-") & @CRLF
    $Output &= @TAB & "DHCP-aktiviert. . . . . . . . . . : "
    If $objItem.DHCPEnabled Then
    $Output &= "Ja"
    Else
    $Output &= "Nein"
    EndIf
    $Output &= @CRLF
    $Output &= @TAB & "IP-Adresse. . . . . . . . . . . . : " & $objItem.IPAddress(0) & @CRLF
    $Output &= @TAB & "Subnetzmaske. . . . . . . . . . . : " & $objItem.IPSubnet(0) & @CRLF
    $Output &= @TAB & "Standardgateway . . . . . . . . . : " & $objItem.DefaultIPGateway(0) & @CRLF
    $Output &= @TAB & "DHCP-Server . . . . . . . . . . . : " & $objItem.DHCPServer & @CRLF
    $Output &= @TAB & "DNS-Server. . . . . . . . . . . . : " & $objItem.DNSServerSearchOrder(0) & @CRLF
    $iAnzDNSServ = 0
    For $DNSServer in $objItem.DNSServerSearchOrder
    $iAnzDNSServ += 1
    Next
    $iAnzDNSServ -= 1
    For $i = 1 To $iAnzDNSServ
    $Output &= @TAB & " " & $objItem.DNSServerSearchOrder($i) & @CRLF
    Next
    $Output &= @TAB & "Primärer WINS-Server. . . . . . . : " & $objItem.WINSPrimaryServer & @CRLF
    $Output &= @TAB & "Sekundärer WINS-Server. . . . . . : " & $objItem.WINSSecondaryServer & @CRLF
    $Output &= @TAB & "Lease erhalten. . . . . . . . . . : " & WMIDateStringToDate($objItem.DHCPLeaseObtained) & @CRLF
    $Output &= @TAB & "Lease läuft ab. . . . . . . . . . : " & WMIDateStringToDate($objItem.DHCPLeaseExpires) & @CRLF & @CRLF & @CRLF
    Next
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Dim $arDayString[8] = [ 7, "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" ]
    Dim $arMonthString[13] = [ 12, "Januar", "Februar", "März", "April", "Mai", "Juni", _
    "Juli", "August", "September", "Oktober", "November", "Dezember" ]

    If $dtmDate = "" Then Return ""

    [/autoit] [autoit][/autoit] [autoit]

    $strTag = StringMid($dtmDate, 7, 2)
    $strMonat = StringMid($dtmDate, 5, 2)
    $strJahr = StringLeft($dtmDate, 4)
    $strZeit = StringMid($dtmDate, 9, 2) &":" &StringMid($dtmDate, 11, 2) &":" &StringMid($dtmDate,13, 2)

    $strWochentag = $arDayString[_DateToDayOfWeek ( $strJahr, $strMonat, $strTag )]

    Return ($strWochentag & ", " & Int($strTag) & ". " & $arMonthString[$strMonat] & " " & $strJahr & " " & $strZeit)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $FrmIPConfig = GUICreate("IPConfig", 800, 600, -1, -1)
    $LblOutput = GUICtrlCreateEdit($Output, 16, 16, 768, 528, BitOR($SS_LEFT,$SS_SUNKEN,$WS_HSCROLL,$WS_VSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 12, 400, 0, "Courier New")
    GUICtrlSetBkColor(-1, 0xFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    $ButOk = GUICtrlCreateButton("&OK", 28, 560, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $ButOk
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit]
  • also bei mir funzt jetzt alles ;)

    hier das fertige GUI

    Spoiler anzeigen
    [autoit]


    ; ------------------------------------------------------------------------------------|
    ; ////////////////////////////////////////////////////////////////////////////////////|
    ; Bibliotheken und Optionen-START ----------------------------------------------------|

    [/autoit] [autoit][/autoit] [autoit]

    ; Bibliotheken --------------
    #include <GuiConstants.au3>
    #include <Constants.au3>
    #Include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; Optionen ----------------
    Opt("GUIOnEventMode",1)
    Opt("GUIEventOptions",1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Bibliotheken und Optionen-END ------------------------------------------------------|
    ; ////////////////////////////////////////////////////////////////////////////////////|
    ; Erstellen der GUI-START ------------------------------------------------------------|

    [/autoit] [autoit][/autoit] [autoit]

    $maingui=GUICreate("WOL GUI",150,90)
    GUICtrlCreateLabel("MAC", 20, 24, 25, 20)
    $MAC=GUICtrlCreateInput("", 55, 20, 83, 20)
    $button=GUICtrlCreateButton("W A K E U P", 10, 50, 130, 30)

    [/autoit] [autoit][/autoit] [autoit]

    ; Erstellen der GUI-END --------------------------------------------------------------|
    ; ////////////////////////////////////////////////////////////////////////////////////|
    ; Funktionen-START -------------------------------------------------------------------|

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetBroadcast($szIP, $szSN)
    Local $aszIP = StringSplit($szIP, ".")
    Local $aszSN = StringSplit($szSN, ".")
    Local $aszBC[5] = [4, 0, 0, 0, 0]
    For $cIndex = 1 To 4
    $aszBC[$cIndex] = BitOR($aszIP[$cIndex], BitXOR($aszSN[$cIndex], 255))
    Next
    Return $aszBC[1] & "." & $aszBC[2] & "." & $aszBC[3] & "." & $aszBC[4]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetSubnetmask()
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $Output = ""
    $Output &= "Windows IP-Konfiguration" & @CRLF & @CRLF
    $OEvent = ObjEvent("AutoIt.Error", "nothing") ; Bei Fehler weitermachen, entspricht "On Error Resume Next"
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) Then
    For $objItem In $colItems
    Return $objItem.IPSubnet(0)
    Next
    EndIf
    Return ""
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _send()
    If GUICtrlRead($MAC)<>"" Then
    UDPStartUp()
    $sock = UDPOpen(_GetBroadcast(@IPAddress1, _GetSubnetmask()), 7)
    UDPSend($sock, BinaryString('0xFFFFFFFFFFFF' & _Repeat(GUICtrlRead($MAC), 16)))
    UDPCloseSocket($sock)
    UDPShutdown()
    Else
    MsgBox(0,"","Geben Sie eine MAC-Adresse ein!")
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Repeat( $str, $reps )
    Local $ret = ''
    For $i = 1 to $reps
    $ret &= $str
    Next
    Return $ret
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _specialevents()
    Select
    Case @GUI_CTRLID = $GUI_EVENT_CLOSE
    Exit
    Case @GUI_CTRLID = $GUI_EVENT_MINIMIZE
    Case @GUI_CTRLID = $GUI_EVENT_RESTORE
    EndSelect
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; Funktionen-END ---------------------------------------------------------------------|
    ; ////////////////////////////////////////////////////////////////////////////////////|
    ; Events-START -----------------------------------------------------------------------|

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_SpecialEvents", $maingui)
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_SpecialEvents", $maingui)
    GUISetOnEvent($GUI_EVENT_RESTORE, "_SpecialEvents", $maingui)
    GUICtrlSetOnEvent($button, "_send")

    [/autoit] [autoit][/autoit] [autoit]

    ; Events-END -------------------------------------------------------------------------|
    ; ////////////////////////////////////////////////////////////////////////////////////|
    ; GUI-Schleife-START -----------------------------------------------------------------|

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    While 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; GUI-Schleife-END -------------------------------------------------------------------|
    ; ////////////////////////////////////////////////////////////////////////////////////|
    ; ------------------------------------------------------------------------------------|

    [/autoit]
  • Hi,

    ich habe mal eine GUI gebastelt, was bei mir ohne Probleme funktioniert. Die eigentliche WakeOnLan-Routine stammt aber nicht von mir.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <Constants.au3>
    #NoTrayIcon

    [/autoit] [autoit][/autoit] [autoit]

    $ini_Error="" ; INI-Datei vorhanden
    $list1=""; Variable um die Liste der PCs vorzubereiten

    [/autoit] [autoit][/autoit] [autoit]

    ;INI-File auswerten
    $ini_pfad=@ScriptDir & "\wakeonlan.ini"

    [/autoit] [autoit][/autoit] [autoit]

    Dim $name
    Dim $ip
    Dim $mac

    [/autoit] [autoit][/autoit] [autoit]

    if FileExists($ini_pfad) Then
    $name=IniReadSection($ini_pfad,"PC-Name")
    if @error=1 then $ini_Error="Fehler in der Section 'PC-Name'" & @CRLF
    $ip=IniReadSection($ini_pfad,"IP-Address")
    if @error=1 then $ini_Error=$ini_Error & "Fehler in der Section 'IP-Address'" & @CRLF
    $mac=IniReadSection($ini_pfad,"MAC-Address")
    if @error=1 then $ini_Error=$ini_Error & "Fehler in der Section 'MAC-Address'" & @CRLF
    if $ini_Error="" and ($name[0][0]<>$ip[0][0] or $name[0][0]<>$mac[0][0]) _
    then $ini_Error=$ini_Error & "Anzahl der Eintraege in den Sections nicht gleich!"
    Else
    $ini_Error="INI-Datei nicht gefunden!"
    EndIf
    if $ini_error="" then
    Dim $broadcast[$ip[0][0]+1]
    for $i=1 to $ip[0][0] ;$broadcast-Adresse definieren
    $broadcast[$i]=StringLeft($ip[$i][1],StringInStr($ip[$i][1],".",0,-1)) & "255"
    Next
    for $i=1 to $name[0][0]; vorbereiten der Liste
    $list1=$list1 & $name[$i][1] & "|"
    Next
    $GUI_WIN=GUICreate("WakeOnLAN v1.05",310,150)
    GUISetState(@sw_show,$GUI_WIN)
    $list2=GUICtrlCreateCombo($name[1][1],21,23,110,200,BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL,$WS_VSCROLL)) ; die Angabe der Größe ist unter W2K ERFORDERLICH
    $list1=Stringright($list1,StringLen($list1)-(stringlen($name[1][1])+1)) ;fuer die Liste den Namen des ersten PCs rausschneiden
    $list1=StringLeft($list1,StringLen($list1)-1) ;das Zeichen "|" am Ende rausschneiden
    if $list1<>"" Then
    GUICtrlSetData(-1,$list1,$name[1][1])
    Else
    GUICtrlSetData(-1,$name[1][1],$name[1][1])
    endif
    $button1=GUICtrlCreateButton("PC einschalten",171,20,120,30,-1,-1)
    $button2=GUICtrlCreateButton("PC anpingen",171,60,120,30,-1,-1)
    $button3=GUICtrlCreateButton("Alle PCs anpingen",171,100,120,30,-1,-1)

    While 1
    $msg=GUIGetMsg()
    If $msg=$GUI_EVENT_CLOSE Then ExitLoop
    if $msg=$button1 Then wecken()
    if $msg=$button2 Then pingen(0)
    if $msg=$button3 Then
    pingen(1)
    EndIf
    WEnd
    Else
    msgbox(16,"Error-Message:",$ini_Error)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func wecken()
    for $selected=1 to $name[0][0] ;Position des ausgewählten Eintrages aus der List2 ermitteln
    if $name[$selected][1]= GUICtrlRead($list2) then ExitLoop
    Next
    $var=Ping($ip[$selected][1],250)
    if $var=1 Then
    MsgBox(48,"Hinweis","Der PC ist bereits eingeschaltet!")
    Else
    _WakeOnLAN($mac[$selected][1],$broadcast[$selected])
    Msgbox(64,"Hinweis:", "Der Befehl wurde erfolgreich gesendet:" _
    & @CRLF & @CRLF & "PC-Name: " & $name[$selected][1] _
    & @CRLF & "Mac-Adresse: " & $mac[$selected][1] _
    & @CRLF &"Broadcast: " & $broadcast[$selected])
    EndIf
    EndFunc

    Func Pingen($ping_all)
    Local $PING_WIN, $ping_list
    GUISetState(@SW_DISABLE, $GUI_WIN)
    $PING_WIN= GUICreate("Ping", 600, 370, -1, -1, BitOr($WS_BORDER, $WS_CAPTION,$WS_SYSMENU, $WS_MINIMIZEBOX, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
    $ping_list = GUICtrlCreateListView('PC-Name |IP-Adresse |Mac-Adresse |Status ', 8, 8, 580, 320, -1, $LVS_EX_FULLROWSELECT)
    GUISetState(@SW_SHOW,$PING_WIN)
    $ping_button = GUICtrlCreateButton("Schließen", 8, 340, 125, 25, 0)
    ;************************wenn "Alle PCs anpingen" gewählt wurde*******************************
    if $ping_all=1 Then
    for $x=1 to $name[0][0]
    $var=Ping($ip[$x][1],500)
    if $var=0 Then
    $var="nicht erreichbar"
    Else
    $var="OK"
    EndIf
    $IID = GUICtrlCreateListViewItem($name[$x][1] & '|' & $ip[$x][1] & '|' & $mac[$x][1] & '|' & $var & '|' , $ping_list)
    next
    Do
    $msg2=GUIGetMsg()
    until $msg2=$ping_button Or $msg2=$GUI_EVENT_CLOSE
    ;**************wenn nur der ausgewählte PC angepingt werden soll***********************************
    Else
    for $selected=1 to $name[0][0] ;Position des ausgewählten Eintrages aus der List2 ermitteln
    if $name[$selected][1]= GUICtrlRead($list2) then ExitLoop
    Next
    Do
    $msg2=GUIGetMsg()
    $var=Ping($ip[$selected][1],500)
    if $var=0 Then
    $var="nicht erreichbar"
    Else
    $var="OK"
    EndIf
    $IID = GUICtrlCreateListViewItem($name[$selected][1] & '|' & $ip[$selected][1] & '|' & $mac[$selected][1] & '|' & $var & '|' , $ping_list)
    until $msg2=$ping_button Or $msg2=$GUI_EVENT_CLOSE
    EndIf
    GUISetState(@SW_ENABLE, $GUI_WIN)
    GUIDelete($PING_WIN)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ===================================================================
    ; Functions WakeOnLan $MACAdress=Mac-Address, $Bcast=Broadcast-Address
    ; ===================================================================
    Func _WakeOnLan($MACAddress,$Bcast)
    $MACAddress=StringReplace($MACAddress,"-","")
    UDPStartUp()
    $connexion = UDPOpen($Bcast, 7)
    $res = UDPSend($connexion, GenerateMagicPacket($MACAddress))
    UDPCloseSocket($connexion)
    UDPShutdown()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; This function convert a MAC Address Byte (e.g. "1f") to a char
    Func HexToChar($strHex)
    Return Chr(Dec($strHex))
    EndFunc

    [/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
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Ein Beispiel für die INI-Datei:

    Spoiler anzeigen


    [PC-Name]
    name1=PC01
    name2=PC02

    [IP-Address]
    ip1=172.20.31.1
    ip2=172.20.31.2

    [MAC-Address]
    mac1=00-0c-76-17-b3-6b
    mac2=00-0c-76-17-b3-bf

    Viele Grüße,
    Milko