Что нового

[Сеть, интернет] Определение автоматически просвоенного IP адреса

ynbIpb

Скриптер
Сообщения
399
Репутация
109
В системе есть несколько подключений: обычные (lan) и через USB модем (ppp).
Как можно определить текущий IP адрес у активных соединений, который виден в пункте контекстного меню "Состояние" ?

На данный момент определяю через CMD ipconfig, но это мне кажется топорно.
А также как определить активно ли на данный момент соединение?
И ещё как определить подключен ли к компьютеру модем из списка:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96D-E325-11CE-BFC1-08002BE10318}

Заранее благодарен за ответ.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
ynbIpb
По поводу IP-адреса пример из русской справки
Код:
#include <inet.au3>
MsgBox(0, "", _GetIP())
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
ynbIpb
Функция, которую предложил madmasles у меня выводит тот же IP-адрес, что и в каждом моем сообщении на форуме...
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
Код:
@IPAddress1
@IPAddress2
@IPAddress3
@IPAddress4

Не выдает нужного?
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
r35p3ct
У меня @IPAddress1 выдает IP-адрес, который DUTRAFFIC называет "Локальный IP-адрес" и он отличается от адреса, выдаваемого функцией _GetIP()...
Других подключений у меня нет, поэтому остальные макросы выдают 0.0.0.0...
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
Код:
#include <array.au3> ; only needed for _Arraydisplay
Global $arnwadap [1] [2] ; Global array for network adapter and ip
_getnetworkadapter ()
_ArrayDisplay ($arnwadap)

; WMI get only Adapter with ip settings
; If WMI fail or no adapter with ip settings Return 0
Func _getnetworkadapter ()
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $found = False
    $strComputer = "localhost"
    $count = 0
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration", "WQL", _
                                              $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    If IsObj($colItems) then
        For $objItem In $colItems
            If StringInStr ($objItem.IPAddress(0), ".") <> 0 Then
                ReDim $arnwadap [$count + 1] [2]
                $arnwadap [$count] [0] = $objItem.Caption ;corrected to $count
                $arnwadap [$count] [1] = $objItem.IPAddress(0) ;corrected to $count
                $count += 1
                $found = True
            EndIf
        Next
    Else
        Return 0
    EndIf
    If Not $found Then Return 0
EndFunc

Для XP вроде должен выдать IP, самому нет возможности проверить работоспособность.
Вобщем через WMI это делается...
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
r35p3ct
Проверил вариант для WMI...
IP-адрес, который получается на выходе, совпадает с адресом макроса @IPAddress1...
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
OffTopic:
madmasles сказал(а):
ynbIpb
По поводу IP-адреса пример из русской справки
Код:
#include <inet.au3>
MsgBox(0, "", _GetIP())
Хорошая функция выдаёт наружный IP!
Мне как-то нужно было получить внешний IP, так я код писал :smile:
А потом наткнулся на неё... "Говорила мама, читай мануалы до конца" ;D
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
109
r35p3ct [?]
Не выдает нужного?
да оно!, но как их сопоставить где чей?
Щас поиграюсь со вторым примером ещё. Спасибо за помощь.

------
Второй примерчик тоже отлично показывает все адреса. Интересно можно ли его переделать, чтоб в массиве возвращалось не имя адаптера, а имя соединения? Типа: beeline, подключение по локальной сети и т.д.
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
109
да что-то не то...
Вот наткнулся на похожую функцию, которую привёл r35p3ct.
Код:
Global $ipaddress
_GetNetworkadapterIP ("Wan")
MsgBox (0,"", $ipaddress)

Func _GetNetworkadapterIP ($sDesc)
    $strComputer = "Localhost"
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")
    For $objItem In $colItems
        If StringInStr ($objitem.Description, $sDesc) Then; this is my physical Adapter change it to yours
            $ipaddress = $objitem.IPAddress(0)              ; e.g. RealTek RTL8139, you don't need the whole descrition
        EndIf
    Next
EndFunc

По идее вот почти то что надо, но передавать бы в функцию не имя адаптера, а имя соединения.
 

opencard

Новичок
Сообщения
1
Репутация
0
[Элементы GUI] Re: [Сеть, интернет] Определение автоматически просвоенного IP адреса

А вот так чего не нравится?
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#NoTrayIcon
Opt('MustDeclareVars', 1)
_Main()
Func _Main()
	Local $Input_1, $Input_2
	Local $msg
	GUICreate("", 120, 70, (@DesktopWidth - 469) / 2, (@DesktopHeight - 639) / 2, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS)
	$Input_1 = GUICtrlCreateInput("" & @IPAddress1, 10, 10, 100, 20)
	$Input_2 = GUICtrlCreateInput("" & @IPAddress2, 10, 40, 100, 20)
	GUISetState()
	While 1
		$msg = GUIGetMsg()
		Select
			Case $msg = $GUI_EVENT_CLOSE
				ExitLoop
			Case Else
		EndSelect
	WEnd
	Exit
EndFunc

внешний и внутренний ip адрес
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
ynbIpb
Аналогичный же вариант по ссылке. Но _GetIP выдаёт тот же IP что и к примеру ресурс 2ip.ru, а _getnetworkadapter() выдал один внутрисетевой и два других не соответствующих внешнему.
 
Верх