Netzwerkverbindungen in einem englischsprachigen XP

16/04/2010 - 20:54 von Rüdiger Rösler | Report spam
Hallo!

Im Internet gibt es viele Skripte, mit denen angeblich eine
Netzwerkverbindung unter Windows deaktiviert oder aktiviert werden kann.
Alle diese Skripte arbeiten jedoch nicht zuverlàssig. Warum ist das so?

Um Zugriff auf eine Netzwerkverbindung zu erhalten, erstellen diese
Skripte im Arbeitsspeicher eine Instanz des Explorers, danach wird über
das Kontextmenü einer solchen Verbindung diese umgeschaltet. Unmittelbar
darauf wird die Explorer-Instanz im Arbeitsspeicher wieder zerstört, und
zwar bevor die Konfiguration des Netzwerkadapters dieser Verbindung
abgeschlossen ist. Dies hat zur Folge, dass der Treiber des Geràts nicht
mehr zuverlàssig funktioniert, unter Umstànden muss sogar der Rechner
heruntergefahren werden und vom Stromnetz getrennt werden, damit das
Geràt wieder rückgesetzt wird.

Ein solches Skript muss also warten, bis die Instanz des Explorers die
Konfiguration des Netzwerks abgeschlossen hat. Dies ist dann der Fall,
wenn die IP-Adresse des Gateways in die Systemtabellen eingetragen
worden ist. Das folgende Skripte demonstriert dies, mit diesem Skript
ist eine zuverlàssige Umschaltung einer Netzwerkverbindung möglich. Ich
habe dieses Skript für eine englischsprachige Newsgruppe erstellt,
deshalb erfolgt ein Teil der Ausgabe in Englisch. Die Ausgabe in der
Eingabeaufforderung von Windows XP bei der Aktivierung einer
Netzwerkverbindung sieht dann ungefàhr so aus:

C:\Skript>CScript.exe SwitchNetConn.vbs "Drahtlose Netzwerkverbindung"

SwitchNetConn.vbs von h.r.roesler

Status von 'Drahtlose Netzwerkverbindung' am Freitag, 16. April 2010:
19:41:13 Deaktiviert, mit Firewall
19:41:14 Nicht verbunden, mit Firewall
19:41:17 Netzwerkadresse beziehen, mit Firewall
19:41:22 Verbindung hergestellt, mit Firewall

LAN oder Hochgeschwindigkeitsinternet auf
Cisco Aironet 802.11a/b/g Wireless PCI Adapter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

IP-Adresse: 192.168.120.30
Subnetzmaske: 255.255.255.0
Von DHCP zugewiesen

Zugriffspunkt
Netzwerk: WLAN AP Roesler
Verschlüsselung: Aktiviert
Signalstàrke: Hervorragend

Drahtlose Netzwerkverbindung: Connected

Bitte warten, prüfe Verbindung...

19:41:24 Checking Gateway 192.168.120.1: Request Timed Out
19:41:27 Checking Gateway 192.168.120.1: Request Timed Out
19:41:29 Checking Gateway 192.168.120.1: Success

Dieses Skript eignet sich auch, um Probleme bei einer Netzwerkverbindung
festzustellen. Wird es ohne den Namen einer Netzwerkverbindung
aufgerufen, so zeigt es die Konfiguration des ersten aktiven Adapters
und den Status aller anderen Verbindungen an.

'######################### SwitchNetConn.vbs ##########################
Option Explicit
Const AUTOR = " von h.r.roesler"
' Schaltet den Status einer lokalen Netzwerkverbindung um.
' Anwendungsbeispiel:
' SwitchNetConn LAN-Verbindung
' Enthàlt der Name Leerzeichen, müssen Anführungszeichen
' verwendet werden:
' SwitchNetConn "Local Area Connection"
' Wird kein Argument angegeben, werden die Daten der ersten gefundenen
' aktiven Verbindung angezeigt.
' Dieses Skript kann nur mit CScript ausgeführt werden:
' CScript.exe [Path]SwitchNetConn.vbs LAN-Verbindung
' Empfohlene Betriebssysteme sind Windows XP oder Windows 7
' Sollten die Benutzerrechte nicht ausreichen, werden sie erhöht.

Const TYP = 1, STATUS = 2, ADAPTER = 3, CONFIG = 6, AP = 9
Const WQL = "select * from ", WIN6 = "6.0.6000", XP = "5.1.2600"
Const WINMGT = "winmgmts:{impersonationLevel=impersonate}!root/cimv2"
Const ASSOC = "Associators of {", ASSCLASS = "'} where AssocClass = "
Const ENABLE = "&Aktivieren", DISABLE = "&Deaktivieren"
Const ESTA = "Verbindung hergestellt", DISA = "Deaktiviert"
'Const ENABLE = "En&able", DISABLE = "Disa&ble"
'Const ESTA = "Connected", DISA = "Disabled"
Dim wmi, xpShell, blnRetried, strConnection, IsElevated, wshShell

Set wmi = GetObject(WINMGT)
Set xpShell = CreateObject("Shell.Application")
Set wshShell = CreateObject("WScript.Shell")
' Drahtlosnetzwerkverbindung
If WScript.Arguments.Count > 0 Then strConnection = WScript.Arguments(0)
' "Local Area Connection"
IsElevated = Elevate(strConnection) ' "Drahtlose Netzwerkverbindung"
WScript.StdOut.WriteLine vbCRLF & WScript.ScriptName & AUTOR & vbCRLF
If OSVersion(WIN6) Then
Call CheckNIC(strConnection)
ElseIf OSVersion(XP) Then
Switch GetControlFolder("Netzwerkverbindungen"), strConnection
'Switch GetControlFolder("Network Connections"), strConnection
End If
If WScript.Arguments.Count > 1 Then MsgBox "Ready!", , "Elevator"

Function GetControlFolder(strFolder)
Const ssfCONTROLS = 3
Dim xpCtrl

For Each xpCtrl In xpShell.NameSpace(ssfCONTROLS).Items
If xpCtrl.IsFolder Then
If StrComp(xpCtrl.Name, strFolder, vbTextCompare) = 0 Then
Set GetControlFolder = xpCtrl.GetFolder
Exit Function
End If
End If
Next

Err.Number = 53
Err.Description = "Virtueller Ordner '" & strFolder & _
"' wurde nicht gefunden!"
Err.Raise Err.Number
End Function

Function SelConnect(ByRef xpFolder, ByRef strConn)
Dim xpItem, str, xpConn

For Each xpItem In xpFolder.Items
If IsEmpty(strConn) Then
str = xpFolder.GetDetailsOf(xpItem, STATUS) & vbCRLF
If InStr(str, ESTA) > 0 And IsEmpty(xpConn) Then
Set xpConn = xpItem
Else
WScript.Echo "Verbindung: " & xpItem.Name & vbCRLF & str
End If
ElseIf StrComp(xpItem.Name, strConn, vbTextCompare) = 0 Then
Set SelConnect = xpItem
Exit Function
End If
Next

If IsEmpty(xpConn) Then WScript.Quit: Else strConn = xpConn.Name

Set SelConnect = xpConn
End Function

Sub Switch(ByRef xpFolder, strConnName)
Dim xpConnect, xpVerb, str, i

Set xpConnect = SelConnect(xpFolder, strConnName)
WScript.Echo "Status von '" & strConnName & "' am " & _
FormatDateTime(Date, vbLongDate) & ":"
For Each xpVerb In xpConnect.Verbs
If xpVerb.Name = ENABLE Xor xpVerb.Name = DISABLE Then
str = xpFolder.GetDetailsOf(xpConnect, STATUS)
WScript.Echo Time & " " & str
If IsElevated Then xpVerb.DoIt
Call GetDetailsOf(xpConnect, xpFolder, xpVerb.Name, str)
If xpVerb.Name = ENABLE Xor CheckNIC(xpConnect.Name) Then
If Not(IsElevated) Xor blnRetried Then Exit Sub
blnRetried = True
For i = 1 To 2
WScript.Echo "Bitte warten..." & vbCRLF
WScript.Sleep 5000 * i
Switch xpFolder, xpConnect.Name
Next
End If
Exit For
End If
Next
End Sub

Sub GetDetailsOf(ByRef xpItem, ByRef xpFolder, strVerbName, str)
Dim i

Do While i <= 300 And IsElevated ' 1 min
WScript.Sleep 200: i = i + 1
Set xpItem = SelConnect(xpFolder, xpItem.Name)
If str <> xpFolder.GetDetailsOf(xpItem, STATUS) Then
str = xpFolder.GetDetailsOf(xpItem, STATUS)
WScript.Echo Time & " " & str
End If
If strVerbName = ENABLE Then
If InStr(1, str, ESTA, vbTextcompare) > 0 Then Exit Do
ElseIf InStr(1, str, DISA, vbTextcompare) > 0 Then: Exit Do
End If
Loop
WScript.Echo vbCRLF & xpFolder.GetDetailsOf(xpItem, TYP) & " auf "
WScript.Echo xpFolder.GetDetailsOf(xpItem, ADAPTER)
WScript.Echo String(Len(xpFolder.GetDetailsOf(xpItem, ADAPTER)),"~")
For i = CONFIG To AP
If Len(xpFolder.GetDetailsOf(xpItem, i)) > 0 Then
WScript.Echo vbCRLF & xpFolder.GetDetailsOf(xpItem, i)
End If
Next
End Sub

Function Elevate(strConn)
Const ADMIN = "S-1-5-32-544", NETOP = "S-1-5-32-556"
Const ELEVT = "S-1-16-12288", WHOAMI = "WhoAmI.exe", NL = "//NoLogo"
Dim net, wmiAcnt, wmiUser, str, blnElevated

If OSVersion(WIN6) Xor IsEmpty(strConn) Then
With wshShell.Exec(WHOAMI & " /groups")
str = .StdOut.ReadAll
End With
blnElevated = InStr(str, ELEVT) > 0
ElseIf OSVersion(XP) Xor IsEmpty(strConn) Then
Set net = CreateObject("WScript.Network")
str = WQL & "Win32_Group where LocalAccount=true and (SID='" & _
ADMIN & "' or SID='" & NETOP & "')"
For Each wmiAcnt In wmi.ExecQuery(str)
str = ASSOC & "Win32_Group.Domain='" & wmiAcnt.Domain & _
"',Name='" & wmiAcnt.Name & ASSCLASS & "Win32_GroupUser"
For Each wmiUser In wmi.ExecQuery(str)
If wmiUser.Name = net.UserName Then blnElevated = True
Next
Next
End If

If Not(blnElevated) Xor IsEmpty(strConn) Then
str = " """ & WScript.ScriptFullName & """ """ & strConn & """"
xpShell.ShellExecute "CScript.exe", NL & str, "", "runas"
WScript.Sleep 20000
End If

Elevate = blnElevated
End Function

Function OSVersion(strVersion)
Dim wmiItem, str

For Each wmiItem In wmi.InstancesOf("Win32_OperatingSystem")
If wmiItem.Version < XP Then
str = Left(wmiItem.Name, Instr(wmiItem.Name, "|") - 1)
Err.Raise vbObjectError + 2, , str & " is not supported."
Else
If wmiItem.Version >= strVersion Then OSVersion = True
End If
Next
End Function

Function CheckNIC(strConnection)
Const NIC = "Win32_NetworkAdapter", SETT = "Setting", CONNECTED = 2
Dim wmiNIC, str, arr, blnSwitched, blnNetOn, blnFinished, i

arr = Array("Disconnected", "Connecting", "Connected", "Discon" & _
"necting", "Hardware not present", "Hardware disab" & _
"led", "Hardware malfunction", "Media disconnected", _
"Authenticating", "Authentication succeeded", _
"Authentication failed", "Invalid address", _
"Credentials required")
str = WQL & NIC & " where NetConnectionID = '" & strConnection & "'"
Do
For Each wmiNIC In wmi.ExecQuery(str)
i = i + 1
If OSVersion(WIN6) Xor blnSwitched Then
Wscript.Echo "Name: " & wmiNIC.Name
If IsElevated Then
blnNetOn = wmiNIC.NetEnabled
If blnNetOn Then wmiNIC.Disable: Else wmiNIC.Enable
blnSwitched = True: Exit For
End If
ElseIf blnNetOn Then
blnFinished = CBool(wmiNIC.NetConnectionStatus = 0)
ElseIf Not(IsEmpty(blnNetOn)) Then
blnFinished = CBool(wmiNIC.NetConnectionStatus = 2)
End If
WScript.Echo vbCRLF & vbTAB & wmiNIC.NetConnectionID & _
": " & arr(wmiNIC.NetConnectionStatus) & vbCRLF
If wmiNIC.NetConnectionStatus = CONNECTED Then
str = ASSOC & NIC & ".DeviceID='" & wmiNIC.DeviceID & _
ASSCLASS & NIC & SETT
CheckNIC = CheckGateway(str)
End If
Next
If OSVersion(WIN6) Then WScript.Sleep i * 1000
Loop While (OSVersion(WIN6) Xor blnFinished) And i < 10 And
IsElevated
End Function

Function CheckGateway(strNIConfig)
Dim blnSuccess, wmiNIC, i, x, y, Out

Set out = WScript.StdErr: blnSuccess = True
out.WriteLine "Bitte warten, prüfe Verbindung..."& vbCRLF
Do
For Each wmiNIC In wmi.ExecQuery(strNIConfig)
If IsNull(wmiNIC.DefaultIPGateway) Then Exit For
y = x + 10: If x > 1 Then out.WriteLine
For i = 0 To UBound(wmiNIC.DefaultIPGateway)
Do
WScript.StdOut.Write Time & " Checking Gateway "
blnSuccess = Ping(wmiNIC.DefaultIPGateway(i))
If Not(blnSuccess) Then WScript.Sleep 1000: x = x+1
Loop Until blnSuccess Or x >= y
If blnSuccess Then Exit Do
Next
Next
WScript.Sleep 1000: x = x + 1
If x Mod 2 = 0 Then out.Write Chr(176): Else out.Write " "
Loop While x < 60
If IsEmpty(y) And x >= 60 Then WScript.Echo vbCRLF & "No Gateway."

CheckGateway = blnSuccess
End Function

Function Ping(strIPNum)
Dim wmiPing, blnPong

For Each wmiPing In wmi.ExecQuery(WQL & "Win32_PingStatus where" & _
" Address='" & strIPNum & "'")
If IsNull(wmiPing.StatusCode) Then Exit For
blnPong = CBool(wmiPing.StatusCode = 0)
WScript.Echo strIPNum & ": " & EvalResult(wmiPing.StatusCode)
Next

Ping = blnPong
End Function

Function EvalResult(intNumber)
Dim arr

arr = Array("Success", "Buffer Too Small", "Destination Net " & _
"Unreachable", "Destination Host Unreachable", _
"Destination Protocol Unreachable", "Destination Port " & _
"Unreachable", "No Resources", "Bad Option", "Hardware " & _
"Error", "Packet Too Big", "Request Timed Out", _
"Bad Request", "Bad Route", "TimeToLive Expired Transit", _
"TimeToLive Expired Reassembly", "Parameter Problem", _
"Source Quench", "Option Too Big", "Bad Destination")
ReDim Preserve arr(50)
arr(32) = "Negotiating IPSEC": arr(50) = "General Failure"
If intNumber > 11000 Then intNumber = intNumber - 11000

EvalResult = arr(intNumber)
End Function
'######################### SwitchNetConn.vbs ##########################


ЯR
 

Lesen sie die antworten

#1 Rüdiger Rösler
17/04/2010 - 11:18 | Warnen spam
Mich tippte:
[Repost eines von mir gecancelten Beitrags]

Leider hatte ich gestern die falsche Version des Skriptes gesendet.
Deshalb nun hier die fehlerfreie Version am Ende des Zitats.

Hallo!

Im Internet gibt es viele Skripte, mit denen angeblich eine
Netzwerkverbindung unter Windows deaktiviert oder aktiviert werden
kann. Alle diese Skripte arbeiten jedoch nicht zuverlàssig. Warum ist
das so?

Um Zugriff auf eine Netzwerkverbindung zu erhalten, erstellen diese
Skripte im Arbeitsspeicher eine Instanz des Explorers, danach wird
über das Kontextmenü einer solchen Verbindung diese umgeschaltet.
Unmittelbar darauf wird die Explorer-Instanz im Arbeitsspeicher
wieder zerstört, und zwar bevor die Konfiguration des
Netzwerkadapters dieser Verbindung abgeschlossen ist. Dies hat zur
Folge, dass der Treiber des Geràts nicht mehr zuverlàssig
funktioniert, unter Umstànden muss sogar der Rechner heruntergefahren
werden und vom Stromnetz getrennt werden, damit das Geràt wieder
rückgesetzt wird.

Ein solches Skript muss also warten, bis die Instanz des Explorers die
Konfiguration des Netzwerks abgeschlossen hat. Dies ist dann der Fall,
wenn die IP-Adresse des Gateways in die Systemtabellen eingetragen
worden ist. Das folgende Skripte demonstriert dies, mit diesem Skript
ist eine zuverlàssige Umschaltung einer Netzwerkverbindung möglich.
Ich habe dieses Skript für eine englischsprachige Newsgruppe erstellt,
deshalb erfolgt ein Teil der Ausgabe in Englisch. Die Ausgabe in der
Eingabeaufforderung von Windows XP bei der Aktivierung einer
Netzwerkverbindung sieht dann ungefàhr so aus:

C:\Skript>CScript.exe SwitchNetConn.vbs "Drahtlose Netzwerkverbindung"

SwitchNetConn.vbs von h.r.roesler

Status von 'Drahtlose Netzwerkverbindung' am Freitag, 16. April 2010:
19:41:13 Deaktiviert, mit Firewall
19:41:14 Nicht verbunden, mit Firewall
19:41:17 Netzwerkadresse beziehen, mit Firewall
19:41:22 Verbindung hergestellt, mit Firewall

LAN oder Hochgeschwindigkeitsinternet auf
Cisco Aironet 802.11a/b/g Wireless PCI Adapter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

IP-Adresse: 192.168.120.30
Subnetzmaske: 255.255.255.0
Von DHCP zugewiesen

Zugriffspunkt
Netzwerk: WLAN AP Roesler
Verschlüsselung: Aktiviert
Signalstàrke: Hervorragend

Drahtlose Netzwerkverbindung: Connected

Bitte warten, prüfe Verbindung...

19:41:24 Checking Gateway 192.168.120.1: Request Timed Out
19:41:27 Checking Gateway 192.168.120.1: Request Timed Out
19:41:29 Checking Gateway 192.168.120.1: Success

Dieses Skript eignet sich auch, um Probleme bei einer
Netzwerkverbindung festzustellen. Wird es ohne den Namen einer
Netzwerkverbindung aufgerufen, so zeigt es die Konfiguration des
ersten aktiven Adapters und den Status aller anderen Verbindungen an.



'######################### SwitchNetConn.vbs ##########################
Option Explicit
Const AUTOR = " von h.r.roesler"
' Schaltet den Status einer lokalen Netzwerkverbindung um.
' Anwendungsbeispiel:
' SwitchNetConn LAN-Verbindung
' Enthàlt der Name Leerzeichen, müssen Anführungszeichen
' verwendet werden:
' SwitchNetConn "Local Area Connection"
' Wird kein Argument angegeben, werden die Daten der ersten gefundenen
' aktiven Verbindung angezeigt.
' Dieses Skript kann nur mit CScript ausgeführt werden:
' CScript.exe [Path]SwitchNetConn.vbs LAN-Verbindung
' Empfohlene Betriebssysteme sind Windows XP bis Windows 7
' Sollten die Benutzerrechte nicht ausreichen, werden sie erhöht.

Const TYP = 1, STATUS = 2, ADAPTER = 3, CONFIG = 6, AP = 9
Const WQL = "select * from ", WIN6 = "6.0.6000", XP = "5.1.2600"
Const WINMGT = "winmgmts:{impersonationLevel=impersonate}!root/cimv2"
Const ASSOC = "Associators of {", ASSCLASS = "'} where AssocClass = "
Const ENABLE = "&Aktivieren", DISABLE = "&Deaktivieren"
Const ESTA = "Verbindung hergestellt", DISA = "Deaktiviert"
'Const ENABLE = "En&able", DISABLE = "Disa&ble"
'Const ESTA = "Connected", DISA = "Disabled"
Dim wmi, xpShell, blnRetried, strConnection, IsElevated, wshShell

Set wmi = GetObject(WINMGT)
Set xpShell = CreateObject("Shell.Application")
Set wshShell = CreateObject("WScript.Shell")
' Drahtlosnetzwerkverbindung
If WScript.Arguments.Count > 0 Then strConnection = WScript.Arguments(0)
' "Local Area Connection"
IsElevated = Elevate(strConnection) ' "Drahtlose Netzwerkverbindung"
WScript.StdOut.WriteLine vbCRLF & WScript.ScriptName & AUTOR & vbCRLF
If OSVersion(WIN6) Then
Call CheckNIC(strConnection)
ElseIf OSVersion(XP) Then
Switch GetControlFolder("Netzwerkverbindungen"), strConnection
'Switch GetControlFolder("Network Connections"), strConnection
End If
If WScript.Arguments.Count > 1 Then MsgBox "Ready!", , "Elevator"

Function GetControlFolder(strFolder)
Const ssfCONTROLS = 3
Dim xpCtrl

For Each xpCtrl In xpShell.NameSpace(ssfCONTROLS).Items
If xpCtrl.IsFolder Then
If StrComp(xpCtrl.Name, strFolder, vbTextCompare) = 0 Then
Set GetControlFolder = xpCtrl.GetFolder
Exit Function
End If
End If
Next

Err.Number = 53
Err.Description = "Virtueller Ordner '" & strFolder & _
"' wurde nicht gefunden!"
Err.Raise Err.Number
End Function

Function SelConnect(ByRef xpFolder, ByRef strConn)
Dim xpItem, str, xpConn

For Each xpItem In xpFolder.Items
If IsEmpty(strConn) Then
str = xpFolder.GetDetailsOf(xpItem, STATUS) & vbCRLF
If InStr(str, ESTA) > 0 And IsEmpty(xpConn) Then
Set xpConn = xpItem
Else
WScript.Echo "Verbindung: " & xpItem.Name & vbCRLF & str
End If
ElseIf StrComp(xpItem.Name, strConn, vbTextCompare) = 0 Then
Set xpConn = xpItem
Exit For
End If
Next

If IsObject(xpConn) And IsEmpty(strConn) Then
strConn = xpConn.Name
ElseIf IsEmpty(xpConn) And IsEmpty(strConn) Then
WScript.Quit
ElseIf IsEmpty(xpConn) Xor Len(strConn) = 0 Then
Err.Raise vbObjectError + 1, , "Verbindung '" & strConn & _
"' wurde nicht gefunden."
End If

Set SelConnect = xpConn
End Function

Sub Switch(ByRef xpFolder, strConnName)
Dim xpConnect, xpVerb, str, i

Set xpConnect = SelConnect(xpFolder, strConnName)
WScript.Echo "Status von '" & strConnName & "' am " & _
FormatDateTime(Date, vbLongDate) & ":"
For Each xpVerb In xpConnect.Verbs
If xpVerb.Name = ENABLE Xor xpVerb.Name = DISABLE Then
str = xpFolder.GetDetailsOf(xpConnect, STATUS)
WScript.Echo Time & " " & str
If IsElevated Then xpVerb.DoIt
Call GetDetailsOf(xpConnect, xpFolder, xpVerb.Name, str)
If xpVerb.Name = ENABLE Xor CheckNIC(xpConnect.Name) Then
If Not(IsElevated) Xor blnRetried Then Exit Sub
blnRetried = True
For i = 1 To 2
WScript.Echo "Bitte warten..." & vbCRLF
WScript.Sleep 5000 * i
Switch xpFolder, xpConnect.Name
Next
End If
Exit For
End If
Next
End Sub

Sub GetDetailsOf(ByRef xpItem, ByRef xpFolder, strVerbName, str)
Dim i

Do While i <= 300 And IsElevated ' 1 min
WScript.Sleep 200: i = i + 1
Set xpItem = SelConnect(xpFolder, xpItem.Name)
If str <> xpFolder.GetDetailsOf(xpItem, STATUS) Then
str = xpFolder.GetDetailsOf(xpItem, STATUS)
WScript.Echo Time & " " & str
End If
If strVerbName = ENABLE Then
If InStr(1, str, ESTA, vbTextcompare) > 0 Then Exit Do
ElseIf InStr(1, str, DISA, vbTextcompare) > 0 Then: Exit Do
End If
Loop
WScript.Echo vbCRLF & xpFolder.GetDetailsOf(xpItem, TYP) & " auf "
WScript.Echo xpFolder.GetDetailsOf(xpItem, ADAPTER)
WScript.Echo String(Len(xpFolder.GetDetailsOf(xpItem, ADAPTER)),"~")
For i = CONFIG To AP
If Len(xpFolder.GetDetailsOf(xpItem, i)) > 0 Then
WScript.Echo vbCRLF & xpFolder.GetDetailsOf(xpItem, i)
End If
Next
End Sub

Function Elevate(strConn)
Const ADMIN = "S-1-5-32-544", NETOP = "S-1-5-32-556"
Const ELEVT = "S-1-16-12288", WHOAMI = "WhoAmI.exe", NL = "//NoLogo"
Dim net, wmiAcnt, wmiUser, str, blnElevated

If OSVersion(WIN6) Xor IsEmpty(strConn) Then
With wshShell.Exec(WHOAMI & " /groups")
str = .StdOut.ReadAll
End With
blnElevated = InStr(str, ELEVT) > 0
ElseIf OSVersion(XP) Xor IsEmpty(strConn) Then
Set net = CreateObject("WScript.Network")
str = WQL & "Win32_Group where LocalAccount=true and (SID='" & _
ADMIN & "' or SID='" & NETOP & "')"
For Each wmiAcnt In wmi.ExecQuery(str)
str = ASSOC & "Win32_Group.Domain='" & wmiAcnt.Domain & _
"',Name='" & wmiAcnt.Name & ASSCLASS & "Win32_GroupUser"
For Each wmiUser In wmi.ExecQuery(str)
If wmiUser.Name = net.UserName Then blnElevated = True
Next
Next
End If

If Not(blnElevated) Xor IsEmpty(strConn) Then
str = " """ & WScript.ScriptFullName & """ """ & strConn & """"
xpShell.ShellExecute "CScript.exe", NL & str, "", "runas"
WScript.Sleep 20000
End If

Elevate = blnElevated
End Function

Function OSVersion(strVersion)
Dim wmiItem, str

For Each wmiItem In wmi.InstancesOf("Win32_OperatingSystem")
If wmiItem.Version < XP Then
str = Left(wmiItem.Name, Instr(wmiItem.Name, "|") - 1)
Err.Raise vbObjectError + 2, , "Nicht möglich mit: " & str
ElseIf wmiItem.Version >= strVersion Then
OSVersion = True
End If
Next
End Function

Function CheckNIC(strConnection)
Const NIC = "Win32_NetworkAdapter", SETT = "Setting", CONNECTED = 2
Dim wmiNIC, str, arr, blnSwitched, blnNetOn, blnFinished, i

arr = Array("Disconnected", "Connecting", "Connected", "Discon" & _
"necting", "Hardware not present", "Hardware disab" & _
"led", "Hardware malfunction", "Media disconnected", _
"Authenticating", "Authentication succeeded", _
"Authentication failed", "Invalid address", _
"Credentials required")
str = WQL & NIC & " where NetConnectionID = '" & strConnection & "'"
Do
For Each wmiNIC In wmi.ExecQuery(str)
i = i + 1
If OSVersion(WIN6) Xor blnSwitched Then
Wscript.Echo "Name: " & wmiNIC.Name
If IsElevated Then
blnNetOn = wmiNIC.NetEnabled
If blnNetOn Then wmiNIC.Disable: Else wmiNIC.Enable
blnSwitched = True: Exit For
End If
ElseIf blnNetOn Then
blnFinished = CBool(wmiNIC.NetConnectionStatus = 0)
ElseIf Not(IsEmpty(blnNetOn)) Then
blnFinished = CBool(wmiNIC.NetConnectionStatus = 2)
End If
WScript.Echo vbCRLF & vbTAB & wmiNIC.NetConnectionID & _
": " & arr(wmiNIC.NetConnectionStatus) & vbCRLF
If wmiNIC.NetConnectionStatus = CONNECTED Then
str = ASSOC & NIC & ".DeviceID='" & wmiNIC.DeviceID & _
ASSCLASS & NIC & SETT
CheckNIC = CheckGateway(str)
End If
Next
If OSVersion(WIN6) Then WScript.Sleep i * 1000
Loop While (OSVersion(WIN6) Xor blnFinished) And i<10 And IsElevated
End Function

Function CheckGateway(strNIConfig)
Dim blnSuccess, wmiNIC, i, x, y, Out

Set out = WScript.StdErr: blnSuccess = True
out.WriteLine "Bitte warten, prüfe Verbindung..."& vbCRLF
Do
For Each wmiNIC In wmi.ExecQuery(strNIConfig)
If IsNull(wmiNIC.DefaultIPGateway) Then Exit For
y = x + 10: If x > 1 Then out.WriteLine
For i = 0 To UBound(wmiNIC.DefaultIPGateway)
Do
WScript.StdOut.Write Time & " Checking Gateway "
blnSuccess = Ping(wmiNIC.DefaultIPGateway(i))
If Not(blnSuccess) Then WScript.Sleep 1000: x = x+1
Loop Until blnSuccess Or x >= y
If blnSuccess Then Exit Do
Next
Next
WScript.Sleep 1000: x = x + 1
If x Mod 2 = 0 Then out.Write Chr(176): Else out.Write " "
Loop While x < 60
If IsEmpty(y) And x >= 60 Then WScript.Echo vbCRLF & "No Gateway."

CheckGateway = blnSuccess
End Function

Function Ping(strIPNum)
Dim wmiPing, blnPong

For Each wmiPing In wmi.ExecQuery(WQL & "Win32_PingStatus where" & _
" Address='" & strIPNum & "'")
If IsNull(wmiPing.StatusCode) Then Exit For
blnPong = CBool(wmiPing.StatusCode = 0)
WScript.Echo strIPNum & ": " & EvalResult(wmiPing.StatusCode)
Next

Ping = blnPong
End Function

Function EvalResult(intNumber)
Dim arr

arr = Array("Success", "Buffer Too Small", "Destination Net " & _
"Unreachable", "Destination Host Unreachable", _
"Destination Protocol Unreachable", "Destination Port " & _
"Unreachable", "No Resources", "Bad Option", "Hardware " & _
"Error", "Packet Too Big", "Request Timed Out", _
"Bad Request", "Bad Route", "TimeToLive Expired Transit", _
"TimeToLive Expired Reassembly", "Parameter Problem", _
"Source Quench", "Option Too Big", "Bad Destination")
ReDim Preserve arr(50)
arr(32) = "Negotiating IPSEC": arr(50) = "General Failure"
If intNumber > 11000 Then intNumber = intNumber - 11000

EvalResult = arr(intNumber)
End Function
'######################### SwitchNetConn.vbs ##########################

ЯR

Ähnliche fragen