Script soll Netzwerkverbindung überprüfen.

  • Tagchen zusammen,

    ich bin mal wieder beim AutoIT gelandet und hände auch schon wieder an einem Problem. Folgendes will ich umsetzten.

    Das Script soll als Dienstlaufen auf einen TabletPC (XP). Diese Script soll ein Dialogfenster öffnen, sobald das TabletPC ans Netzwerk angeschlossen wird.

    KAnn ich/Wie kann ich mit AutoIT überprüfen ob ein Netzwerk vorhanden ist.

    OK, ich könnte einen Dauerping laufen lassen und sobald ist eine Antwort bekomme häng ich am Netz. Doch ist es nicht noch anders Möglich ??

    Grüße
    CrazyER

    Einmal editiert, zuletzt von CrazyER (29. Januar 2009 um 10:55)

  • Moin,

    wenn Du mit festen IP's arbeitest, wirst Du ein Problem bekommen. Da wirst Du um ein Ping nicht herumkommen.

    Für DHCP ohne Alternative IP:

    [autoit]


    Dim $LocalIP
    $strComputer = "Localhost"
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE")
    For $objItem In $colItems
    $LocalIP = $objItem.IPAddress(0)
    Next

    [/autoit]

    Du wertest dann $LoclaIP entsprechend Deinen Vorgaben aus.

    Weitere Parameter können noch in der For Schleife ergänzt und abgefragt werden (Variablen sind noch zu definieren):

    $LocalMask = $objItem.IPSubnet(0)
    $LocalGateway = $objItem.DefaultIPGateway(0)
    $DNS[0] = $objItem.DNSServerSearchOrder(0)
    $DNS[1] = $objItem.DNSServerSearchOrder(1)


    ;-))

    Stefan
    [edit]

    Besser:

    [autoit]

    Dim $status, $nwkartenname
    $strComputer = "Localhost"
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter where NetConnectionStatus = 2")
    For $objItem In $colItems
    $status = $objItem.NetConnectionStatus
    $nwkartenname = $objitem.Name
    MsgBox (0,"", $status & " " & $nwkartenname)
    Next

    [/autoit]

    NetConnectionstatus = 2 Netzwerk verbunden

    NetConnectionStatus = 7 Netzwerk nicht verbunden (z.Bsp Kabel gezogen)

    Einmal editiert, zuletzt von ojo (28. Januar 2009 um 11:37)

  • frag doch einfach z.B. @IPAddress1 (oder 2,3,4 je nach dem welche Verbunden wird) <> 0.0.0.0 ab

    sollte mit DHCP gehen *grübel*

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • Falls nur mit DHCP, ja. Feste IP's nein.

    Ansonsten noch zu berücksichtigen (Punkt 1 aus Hilfe):

    1) @IPAddress1 IP address of first network adapter. Tends to return 127.0.0.1 on some computers.

    2) Windows ARPA, falls aktiv, vergibt 169.x.x.x Adressen, falls DHCP Request fehlschlägt.

    ;-))

    Stefan

  • erstmal DANKE für die Hilfsbereitschaft.

    Die Lösung von ojo gefällt mir sehr gut. Nur funktioniert es nicht ;o))

    Ich bekomme nun den Netzwerkkartentyp ausgegeben, aber nicht den Status darüber.


    PS: For in ?? ich kenne nur For to. Aber du kannst es mir bestimmt im kurzem erklären.

    DANKE !!!

  • frag doch mit ipconfig die vergebenen IP's ab wenns nicht connected ist steht da halt

    Zitat

    Ethernetadapter LAN-Verbindung1:

    Medienstatus. . . . . . . . . . . : Es besteht keine Verbindung


    und sonst steht halt je nach Netzwerk die Ip da (wenn du die hast kannst du ja noch mit nem Ping sicherstellen das auch wirklich das Netz funktioniert)

    Zitat

    Ethernetadapter Drahtlose Netzwerkverbindung:

    Verbindungsspezifisches DNS-Suffix:
    IP-Adresse. . . . . . . . . . . . : 192.168.X.X
    Subnetzmaske. . . . . . . . . . . : 255.255.255.0
    Standardgateway . . . . . . . . . : 192.168.X.1


    DIY

  • [autoit]

    Dim $status, $nwkartenname
    $strComputer = "Localhost"
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter where NetConnectionStatus = 2")
    For $objItem In $colItems
    $nwkartenname = $objitem.Name
    Select
    Case $objItem.NetConnectionStatus = 0
    $status = "Disconnected"
    Case $objItem.NetConnectionStatus = 1
    $status = "Connecting"
    Case $objItem.NetConnectionStatus = 2
    $status = "Connected"
    Case $objItem.NetConnectionStatus = 3
    $status = "Disconnecting"
    Case $objItem.NetConnectionStatus = 4
    $status = "Hardware not present"
    Case $objItem.NetConnectionStatus = 5
    $status = "Hardware disabled"
    Case $objItem.NetConnectionStatus = 6
    $status = "Hardware malfunction"
    Case $objItem.NetConnectionStatus = 7
    $status = "Media disconnected"
    Case $objItem.NetConnectionStatus = 8
    $status = "Authenticating"
    Case $objItem.NetConnectionStatus = 9
    $status = "Authentication succeeded"
    Case $objItem.NetConnectionStatus = 10
    $status = "Authentication failed"
    Case $objItem.NetConnectionStatus = 11
    $status = "Invalid address"
    Case $objItem.NetConnectionStatus = 12
    $status = "Credentials required"
    EndSelect
    MsgBox (0,"", $status & @CRLF & $nwkartenname)
    Next

    [/autoit]

    Das sollte eine Messagebox mit z.Bsp folgender Anzeige bringen:

    Connected

    Intel(R) 82566DM Gigabit Network Connection.

    Ansonsten poste mal deinen Code oder lad Dir den WMI Browser ScriptomaticV2.hta aus dem Internet und schau mal lokal was dieser anzeigt.

    ;-))

    Stefan

  • soo das Script funktioniert. Muss nur noch ne Endlosschleife drum bauen.

    gibt es dafür eigentlich ein bestimmte Funktion, die dann den Speicher wieder frei räumt ?? OK, das skript hat "nur" 255KB so viel Arbeitsspeicher hab ich noch. Aber generell, gibt es sowas??

  • also irgendwie krieg ichs nicht ganz hin. (Bin wohl doch ein geborener Programiere *ggg*)

    Hier mal mein Code:

    [autoit]

    Dim $status, $nwkartenname, $counter, $x
    $counter = 1
    $strComputer = "Localhost"
    While $counter = 1
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter where NetConnectionStatus = 2")
    For $objItem In $colItems
    $nwkartenname = $objitem.Name
    $status = $objItem.NetConnectionStatus
    If $nwkartenname = "Marvell Yukon 88E8055 PCI-E Gigabit Ethernet Controller" And $status = 2 And $x = 0 Then
    MsgBox (48,"Hinweis ","BLABLABLABLALBALBALBL.")
    $x = 1
    ElseIf $status <> 2 Then
    $x = 0
    EndIf
    Next
    WEnd

    [/autoit]

    Eigentlich garnicht so schlecht. Wenn ich das Skript ausführe läuft es los. Sobald ich das LAN Kabel anschließe, bekomm ich mein blablalba. Kann ich mit OK wegklicken und ist ok. Skript läuft weiter. Wenn ich das LAN Kabel wieder abklemme, passiert auch nichts. Soweit alles richtig. ABER: Wenn ich dann wieder das LAN Kabel anschließe, sollte doch wieder die MsgBox aufgehen, DAS tut sie aber nicht. Warum ??

    Könnte mich mal bitte jemand von der Leitung stossen ?? ;o))

  • Mit der Zeile:

    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter where NetConnectionStatus = 2")

    bekommst Du nur die Network-Adapter die den Status '2' haben. Damit wird Deine Variable 'x' nie wieder auf
    '0' gesetzt.

    Ich tippe drauf einfach den Teil ' where NetConnectionStatus = 2' weglassen.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • @mehrsolala

    also ich probiere bei wmi immer mit der wbemtest.exe :)
    bei verbinden root\cimv2
    dann auf abfrage gehen dort die SELECT abfrage reinschreiben bei dem ergebnis doppelklicken und man sieht schön alle eigenschaften des objektes :)

    @thread xD
    bei mir geht das auch... ich hab aber die WHERE bedingung in der abfrage weggelassen...

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • hab mal die SELECT * FROM Win32_NetworkAdapter gemacht
    da kommt Fehler

    Zitat

    Nummer: 0x80041013
    Einrichtung: WMI
    Beschreibung: Fehler beim Laden des Anbieters

  • moin moin zusammen

    jetzt werd ich total bekloppt :o))

    Wenn ich mein Skript auf meinen PC startet (Netzwerkkarte angepasst) dann funktioert es wunderbar. Text kommt und ich klick OK und gut ist.

    ABER auf dem TabletPC, auf dem es nachher laufen soll verhält es sich anders. Meldung kommt, ich klick ok, und die Meldung kommt immer wieder. Als wenn er mein $x nicht auf eins 1 setzen würde. Wie kann sowas sein ??

    Hier nochmal mein Skript:

    [autoit]

    Dim $status, $nwkartenname, $counter, $x
    $counter = 1
    $strComputer = "Localhost"
    While $counter = 1
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")
    For $objItem In $colItems
    $nwkartenname = $objitem.Name
    $status = $objItem.NetConnectionStatus
    If $nwkartenname = "Marvell Yukon 88E8055 PCI-E Gigabit Ethernet Controller" And $status = 2 And $x = 0 Then
    MsgBox (48,"Hinweis ","blablablablablablablablablablabla")
    $x = 1
    Else
    If $status > 2 Then
    $x = 0
    EndIf
    EndIf
    Next
    WEnd

    [/autoit]
  • sooo blödes ding läuft nun. Habe nun meine Netzwerkkarte direkt in die Abfrage mit rein genommen.

    [autoit]

    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter where ProductName = 'Marvell Yukon 88E8055 PCI-E Gigabit Ethernet Controller' ")

    [/autoit]

    Keine Ahnung, warum das andere vorher nicht funzte, aber vielleicht hat noch jemand einen Tipp.
    Dennoch sag ich nochmal DANKE an alle mitwirkenden ;o))