1

Тема: VBS: Win32_NetworkAdapterConfiguration

Помогите разобратся с проблемкой:

Необходимо определить IP адрес(а) сетевого адаптора(ров) установленных в системе.
Пробую использовать Win32_NetworkAdapterConfiguration, но возникает проблема, пр установленных нескольких сетевых адапторах(даже если их уже давно нет в системе - физически "вынут" сетевой адаптор) - выводятся несколько одинаковых IP-адресов.

Пример один: в компьютере "сгорела сетевая плата" её адрес 192.168.0.1, её заменили другой(адрес установили, тотже). в результате код ниже выдаст, уже два раза по 192.168.0.1.

Пример два: в компьютере установлена 1 сетевая плата, и виртуальный "адаптор замыкания на себя" с разными IP = адресами, в результате код ниже выдаст, что у физического и виртуального адаптора, по два IP - адреса, причем у виртуального первый IP - адрес выданный кодом будет оличатся от того, что настроен в гараф. ин. системы.

Function getip ( )
'-----------------------------------------------------------------------
'    Определяю IP-адрес
'    Доработать  - выкидывает несколько ip-адресов, если физ. адаптор уже отключен
Dim strComputer, objWMIService, IPConfigSet, IPConfig, i, ip_comp 
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set IPConfigSet = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
'     
For Each IPConfig in IPConfigSet
    If Not IsNull(IPConfig.IPAddress) Then 
        For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
            ip_comp=ip_comp & IPConfig.IPAddress(i)
        Next
    End If
Next    
getip= ip_comp
End Function

в Win32_NetworkAdapterConfiguration имеется интересный параметр index, который указывает № набора конфигурации. Остается вопрос каким образом узнать какую конфигурацию использует windows?

strComputer = "."
Set WshShell = WScript.CreateObject("WScript.Shell")
'
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colIPc=  objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapter")
Set IPConfigSet = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")


dim ip_comp, b


For each IPc in colIPc
    '    Проверка на "Null" - если "NetConnectionStatus" = это "Null", то
    '        считаем, что сетевой адаптер, не физический 
    If IsNull (IPc.NetConnectionStatus) = True Then    
        WshShell.Popup "NetConnectionStatus=Null. Считаем, что СЕТЕВОЙ адаптор:" _
         & Chr(13) & Chr(10) & IPc.Caption & IPc.MACAddress & IPc.SystemName & _
         Chr(13) & Chr(10) & "не является физическим устройством", 3, "Infa", _
         vbExclamation
    Else
        '    Необходимо проверить включен ли сетевой адаптор, нас интесуют
        '    только включенные сетевые адапторы
        If IPc.NetConnectionStatus = 2 Then    '    Адаптор подключен 
            WshShell.Popup "NetConnectionStatus<>Null. Считаем, что СЕТЕВОЙ адаптор:" _ 
            & Chr(13) & Chr(10) & IPc.Caption & IPc.MACAddress & IPc.SystemName _
            & Chr(13) & Chr(10) & "является физическим устройством", 3, "Infa", _
            vbInformation 
            '
            MsgBox "попытка определить ip-адреса сетевого адаптора"
            MsgBox "MAC adress_Win32_NetworkAdapter"& Chr(13) & Chr(10) & IPc.MACAddress
            '    Получаю mac- адрес нужного мне сетевого адаптора и 
            '    пробую задействовать Win32_NetworkAdapterConfiguration
            '    только для адаптора с указанным MAC-адресом
            For Each IPConfig in IPConfigSet
                If Not IsNull(IPConfig.IPAddress) Then 
                    For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
                        kol_ip= kol_ip+1 
                        ip_comp=ip_comp & IPConfig.IPAddress(i)
                        MsgBox "Номер конфигурации адаптора: " & IPConfig.Index & Chr(13) & Chr(10) & _
                        "ip-адрес для этой конфигурации: " & IPConfig.IPAddress(i)  
                    Next
                End If
            Next
            '    Проверка
            MsgBox "Сетевой адаптор с описанием:" _ 
            & Chr(13) & Chr(10) & IPc.Caption & Chr(13) & Chr(10) & _
             "имеет" & kol_ip & "сетевых адреса:" &  ip_comp
            ip_comp=""
            kol_ip=0
        'Else
            'MsgBox "Сетевой адаптор не подключен"
        End If
    End If
Next

2

Re: VBS: Win32_NetworkAdapterConfiguration

Пробую использовать Win32_NetworkAdapterConfiguration, но возникает проблема, пр установленных нескольких сетевых адапторах(даже если их уже давно нет в системе - физически "вынут" сетевой адаптор) - выводятся несколько одинаковых IP-адресов.

Bsplesk, проблема в том, что Вы не удаляете фантомные устройства. Выполните следующий код:

Option Explicit

Const SW_HIDE = 0


Dim elem
Dim strNewEnvironment

Dim objSWbemObjectEx
Dim lngProcessID

Dim objMenuItem

Dim strTempFileName


If Not WScript.Arguments.Named.Exists("ShowDevMgmt") Then
  With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    strNewEnvironment = _
      "DEVMGR_SHOW_NONPRESENT_DEVICES=1" & vbCrLf & _
      "DEVMGR_SHOW_DETAILS=1"
    
    For Each elem In WScript.CreateObject("WScript.Shell").Environment("Process")
      If Left(elem, 1) <> "=" Then
        strNewEnvironment = strNewEnvironment & vbCrLf & elem
      End If
    Next
    
    
    Set objSWbemObjectEx = .Get("Win32_ProcessStartup").SpawnInstance_
    
    objSWbemObjectEx.ShowWindow           = SW_HIDE
    objSWbemObjectEx.EnvironmentVariables = Split(strNewEnvironment, vbCrLf)
    
    If .Get("Win32_Process").Create( _
      "wscript.exe """ & WScript.ScriptFullName & """ /ShowDevMgmt", Null, objSWbemObjectEx, lngProcessID _
      ) <> 0 Then
      
      WScript.Echo "Process [wscript.exe """ & WScript.ScriptFullName & """] could not be created."
    End If
    
    Set objSWbemObjectEx = Nothing
  End With
Else
  With WScript.CreateObject("MMC20.Application")
    .Load "devmgmt.msc"
    
    With .Document
      With .ActiveView
        .Frame.Maximize
        
        For Each objMenuItem In .ScopeNodeContextMenu
          If objMenuItem.Path = "Вид->Показать скрытые устройства" Then
            If objMenuItem.Enabled = 1 Then
              objMenuItem.Execute
              
              Exit For
            End If
          End If
        Next
      End With
      
      If .IsSaved = 0 Then
        strTempFileName = GetTemporaryFileName()
        .SaveAs strTempFileName
        
        WScript.CreateObject("Scripting.FileSystemObject").DeleteFile strTempFileName, True
      End If
    End With
    
    .UserControl = 1
  End With
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Function GetTemporaryFileName()
  Const TEMP_FOLDER = 2
  
  Dim strTempFile
  
  
  With WScript.CreateObject("Scripting.FileSystemObject")
    Do
      strTempFile = .BuildPath(.GetSpecialFolder(TEMP_FOLDER), .GetTempName)
    Loop While .FileExists(strTempFile)
  End With
  
  GetTemporaryFileName = strTempFile
End Function
'=============================================================================

и в появившемся окне Диспетчера Устройств удалите фантомные сетевые устройства.

Перевод на русский «будет оличатся от того, что настроен в гараф. ин. системы.» мне выполнить не удалось.

«если "NetConnectionStatus" = это "Null", то считаем, что сетевой адаптер, не физический» — неверное предположение.