Code anpassen: WLAN-Verbindung deaktivieren/aktivieren

  • VBScript

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Code anpassen: WLAN-Verbindung deaktivieren/aktivieren

    Hallo,

    ich habe folgenden Code gefunden und angepasst, der die Netzwerk-Verbindung "WiFi" je nach Status aktiviert/deaktiviert. Ich bekomme den Code leider nicht so geändert, dass das Script grundsätzlich die Netzwerk-Verbindung "WiFi" deaktiviert und wieder aktiviert. Die Toggle-Funktion möchte ich nicht. Kann mir jemand helfen?

    Vielen Dank.

    Gruß
    frankieman

    Visual Basic-Quellcode

    1. '~ Toggle a SPECIFIED NIC on or off
    2. Option Explicit
    3. Const NETWORK_CONNECTIONS = &H31&
    4. Dim objShell, objFolder, objFolderItem, objEnable, objDisable
    5. Dim folder_Object, target_NIC
    6. Dim NIC, clsVerb
    7. Dim str_NIC_Name, strEnable, strDisable
    8. Dim bEnabled, bDisabled
    9. ' ========================================================
    10. ' ===== place the name of your network adapter here ======
    11. ' examples:
    12. ' str_NIC_Name = "Local Area Connection 2"
    13. ' str_NIC_Name = "Wireless Connection 1"
    14. ' ========================================================
    15. str_NIC_Name = "wifi"
    16. ' ========================================================
    17. 'strEnable = "En&able"
    18. 'strDisable = "Disa&ble"
    19. strEnable = "&Aktivieren"
    20. strDisable = "&Deaktivieren"
    21. ' create objects and get items
    22. Set objShell = CreateObject("Shell.Application")
    23. Set objFolder = objShell.Namespace(NETWORK_CONNECTIONS)
    24. Set objFolderItem = objFolder.Self
    25. Set folder_Object = objFolderItem.GetFolder
    26. ' see if the namespace exists
    27. If folder_Object Is Nothing Then
    28. Wscript.Echo "Could not find Network Connections"
    29. WScript.Quit
    30. End If
    31. Set target_NIC = Nothing
    32. ' look at each NIC and match to the chosen name
    33. For Each NIC In folder_Object.Items
    34. If LCase(NIC.Name) = LCase(str_NIC_Name) Then
    35. ' proper NIC is found, get it
    36. Set target_NIC = NIC
    37. End If
    38. Next
    39. If target_NIC Is Nothing Then
    40. WScript.Echo "Unable to locate proper NIC"
    41. WScript.Quit
    42. End If
    43. Set objEnable = Nothing
    44. Set objDisable = Nothing
    45. bEnabled = True
    46. For Each clsVerb In target_NIC.Verbs
    47. '~ Wscript.Echo clsVerb
    48. If clsVerb.Name = strEnable Then
    49. Set objEnable = clsVerb
    50. bEnabled = False
    51. End If
    52. If clsVerb.Name = strDisable Then
    53. Set objDisable = clsVerb
    54. End If
    55. Next
    56. If bEnabled Then
    57. objDisable.DoIt
    58. Else
    59. objEnable.DoIt
    60. End If
    61. '~ Give the connection time to stop/start
    62. WScript.Sleep 1000
    63. WScript.Quit

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „frankieman“ ()

    Danke, dass du mir helfen willst. Aber das kann nicht funktionieren. Ich möchte mit dem Code:

    1. Die Netzwerkverbindung aktivieren, wenn die Verbindung deaktiviert ist und
    2. die Netzwerkverbindung deaktivieren und wieder aktivieren, wenn sie aktiviert ist.

    Gruß
    frankieman
    Es hilft doch enorm, wenn du deine Wünsche richtig formulierst.

    Visual Basic-Quellcode

    1. If bEnabled Then objDisable.DoIt
    2. WScript.Sleep 1000
    3. objEnable.DoIt
    Aber mit ein klein wenig Nachdenken hättest du womöglich selbst drauf kommen können. ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das Löschen der Zeilen bringt nicht das gewünschte Ergebnis und ich komme trotz kommentierter Zeilen nicht darauf, was geändert werden muss. Ich bin kein Coder und kann nur ein bißchen VBA. Mehr nicht. Ich habe auch keine Entwicklungsumgebung für VBS installiert und will es auch nicht. Ich wollte lediglich einen kleinen Code angepasst haben, den man in anderen VBA-Foren funktionierend bekommt, wenn höflich nachgefragt wird und keine ungetesteten Code-Schnipsel. Momentan habe ich das Gefühl gegen die Wand zu laufen. Vielleicht verlange ich aber auch zu viel oder bin verkehrt davor ...

    Gruß
    frankieman

    frankieman schrieb:

    Ich wollte lediglich einen kleinen Code angepasst haben, den man in anderen VBA-Foren funktionierend bekommt
    C&P ist halt nur dann sinnvoll, wenn man versteht, was man kopiert.
    Im Übrigen ist der Code VBS und nicht VBA, weshalb ihn dir vielleicht dort keiner angepasst hat.

    Ich habe auch keine Entwicklungsumgebung für VBS installiert und will es auch nicht.
    Interessant. Statt dessen spielst du jetzt hier den Beleidigten.
    Tipp: Mit einer VBA-Entwicklungsumgebung kann man mit Minimalanpassungen auch VBS debuggen.


    Nicht deinetwegen, sondern weil mich das Thema gereizt hat und den Spagetti-Code nicht sehen konnte, habe ich das Ganze mal etwas strukturiert:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Const EnableVerb = "&Aktivieren"
    3. Const DisableVerb = "&Deaktivieren"
    4. Dim NIC
    5. Set NIC = Adapter("Wireless Network Connection 2")
    6. If NIC Is Nothing Then ErrorExit "NIC not found"
    7. 'Toggle NIC
    8. DisableEnable NIC
    9. Sub Toggle(NIC)
    10. If IsEnabled(NIC) Then Disable NIC Else Enable NIC
    11. End Sub
    12. Sub DisableEnable(NIC)
    13. Disable NIC
    14. Enable NIC
    15. End Sub
    16. Sub Disable(NIC)
    17. ExecuteAction NIC, DisableVerb
    18. End Sub
    19. Sub Enable(NIC)
    20. ExecuteAction NIC, EnableVerb
    21. End Sub
    22. Sub ExecuteAction(NIC, Action)
    23. Dim Verb
    24. For Each Verb In NIC.Verbs
    25. If Verb.Name = Action Then
    26. Verb.DoIt
    27. WScript.Sleep 1000
    28. Exit For
    29. End If
    30. Next
    31. End Sub
    32. Function IsEnabled(NIC)
    33. Dim Verb
    34. For Each Verb In NIC.Verbs
    35. If Verb.Name = EnableVerb Then Exit For
    36. If Verb.Name = DisableVerb Then
    37. IsEnabled = True
    38. Exit For
    39. End If
    40. Next
    41. End Function
    42. Function Adapter(Name)
    43. Const NETWORK_CONNECTIONS = &H31&
    44. Dim Shell, Connections, FolderItem, Folder
    45. Set Shell = CreateObject("Shell.Application")
    46. Set Connections = Shell.Namespace(NETWORK_CONNECTIONS)
    47. Set FolderItem = Connections.Self
    48. Set Folder = FolderItem.GetFolder
    49. For Each Adapter In Folder.Items
    50. If LCase(Adapter.Name) = LCase(Name) Then Exit Function
    51. Next
    52. Set Adapter = Nothing
    53. End Function
    54. Sub ErrorExit(Message)
    55. MsgBox Message
    56. WScript.Quit
    57. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Ich will das Thema nicht unnötig anheizen. Nur so viel: Mit deinen Kommentaren und Annahmen auf meine Zitate liegst du verkehrt oder hast mein Geschriebenes nicht verstanden. Back to topic.

    Danke, dass du mir helfen willst. Wenn ich das Script nun ausführe, bleibt es bei der Togglefunktion. Mit anderen Worten: Ist der Netzwerkadapter aktiviert, so wird er deaktiviert und nicht wieder aktiviert. Ich habe den QT mal in VBA importiert, durch den Debugger im Einzelschritt gejagt und festgestellt, das beim Reaktivieren der NIC Verb.Name <> Action ist, weshalb die Aktiverung nicht erfolgt.

    Visual Basic-Quellcode

    1. For Each Verb In NIC.Verbs
    2. If Verb.Name = Action Then 'wird nicht ausgeführt, da Verb.Name ="&Deaktivieren" ist und Action = "&Aktivieren"
    3. Verb.DoIt
    4. 'WScript.Sleep 1000
    5. Exit For
    6. End If
    7. Next


    Und bei dir läuft das?

    Gruß
    frankieman
    Also bei mir geht Alles Einwandfrei ?

    Aktiv -- Deaktiv !!!

    Anhang ;)

    Natürlich sollte man den Wlan -Adapter benennen ;)



    Dateien
    :D Ein Programm sollte nicht nur Hand und Fuß, sondern auch Herz und Hirn haben. (Michael Anton) :D

    MFG Jörg ;)

    Muss jeder vermeintliche Programmierer ne Signatur haben ??
    Der "Gag" soll sein, mit einem Klick deaktivieren und wieder aktivieren zu können. Und das läuft mit dem Script bei mir einfach nicht. Es geht nur:
    Wenn aktiviert, dann deaktivieren
    Wenn deaktiviert, dann aktivieren

    Hintergund ist folgender: Mein Notebook hat eine neue Netzwerkkarte erhalten, das die Verbindung zum Router nicht immer herstellen kann, obwohl die Netzwerkkarte aktiviert ist. Ich möchte mit dem Script die Karte mit einem Klick durch Deaktivieren und Aktivierung zur Verbindungsherstellung bringen.

    Ich habe Windows 8.1. Liegt es vielleicht daran?

    Gruß
    frankieman

    frankieman schrieb:

    Der "Gag" soll sein, mit einem Klick deaktivieren und wieder aktivieren zu können.
    Der "Gag" an dem Script ist das Sleep.
    Das soll Warten bis das das Verb entsprechend umgeschaltet hat.
    Wenn du das auskommentierst geht natürlich nichts.
    Wenn das bei dir trotz Sleep nicht funktioniert, ist dein Rechner zu langsam und du musst den Timeout erhöhen.

    Oder du machst es gleich richtig und loopst in einer Schleife, bis der Adapter den Status (und damit das Verb) umgeschaltet hat.
    Aber dann bitte zusätzlichen Schleifenabbruch mit einbringen, um Endlosschleifen zu vermeiden.

    frankieman schrieb:

    Ich habe Windows 8.1. Liegt es vielleicht daran?
    Kann auch sein.
    Um Windows 8 mache ich in den Fällen, wo ich's vermeiden kann, momentan noch einen großen Bogen.

    frankieman schrieb:

    Mein Notebook hat eine neue Netzwerkkarte erhalten, das die Verbindung zum Router nicht immer herstellen kann, obwohl die Netzwerkkarte aktiviert ist
    Das wäre für mich eher ein pausibler Grund, dass mit dem Treiber irgendwas nicht stimmt und der Aktiviervorgang zu lange benötigt.
    Ein Grund mehr, den Sleep-Timeout zu erhöhen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das Sleep ist auskommentiert, weil ich den Code in VBA im Einzelschritt getestet habe, steht auch im Post 10. Die Erhöhung des Sleeps hilft leider nicht.

    Wenn auf deinem Rechner der Code die NIC deaktiviert und wieder aktiviert, bzw. nur aktiviert und bei mir nicht, kann es nur an Hardware, Treiber oder BS liegen. Ein Gerücht besagt, dass gerade Windows-Versionen schlecht sind. Vielleicht wird es wieder was mit Windows 9.

    Danke und Gruß
    frankieman

    frankieman schrieb:

    Und das läuft mit dem Script bei mir einfach nicht
    Wenn der Toggle geht, muss mit langem Timeout auch DisableEnable funktionieren.

    Ich würde mir mal den neuesten Treiber für die Karte besorgen.
    Zum einen vom Hersteller, zum anderen von Microsoft.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --