Что нового

Как получить сетевые параметры?

ZaEzzz

Новичок
Сообщения
28
Репутация
2
Всем добрый день!
Случилось так, что появилась необходимость получить параметры сетевых адаптеров. А именно:
1 - Список имен сетевых подключений в системе (к примеру "подключение по локальной сети")
2 - Сетевые реквизиты (IP, Mask, Gate, DNS1, DNS2)
Пока смог узнать только как получить IP :(

Может подскажет кто-нить в какую сторону смотреть? Или еще лучше расскажете как :smile:
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот, я написал функцию:
Код:
#include <Array.au3>

$NetInfo = _GetNetworkInfo()
_ArrayDisplay($NetInfo)

;===========================================================
; [0] - IP-адрес
; [1] - Маска подсети
; [2] - Основной шлюз
; [3] - Предпочитаемый DNS-сервис
; [4] - Альтернативный DNS-сервис
; [5] - Имя сетевого подключения
;===========================================================
Func _GetNetworkInfo()
	Local $iTempFile = @TempDir & '\NetInfo.txt'
    RunWait(@ComSpec & ' /C netsh interface ip show config >> ' & $iTempFile, '', @SW_HIDE)
    Local $iReg = StringRegExp(FileRead($iTempFile), '\d{2,3}\.\d{2,3}\.\d{1,3}\.\d{1,3}', 3)

    $objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
    $objClass = $objWMIService.ExecQuery("Select * from Win32_NetworkAdapter")

    For $obj in $objClass
        $iVar = UBound($iReg)
        ReDim $iReg[$iVar + 1]
        $iReg[$iVar] = $obj.NetConnectionID
        ExitLoop
    Next

    Return $iReg
	FileDelete($iTempFile)
EndFunc
 
Автор
Z

ZaEzzz

Новичок
Сообщения
28
Репутация
2
Zaramot, большое спасибо :smile: Часть решена :smile:
Только есть некоторые замечания по результату.
В комментах правильно расписано, но есть один нюанс.
У меня немного иначе всё выведено:
[0]|10.94.254.4 - IP адрес
[1]|10.94.254.0 - сеть
[2]|255.255.255.0 - маска сети
[3]|10.94.254.1 - шлюз
[4]|10.94.254.1 - ДНС
[5]| - тут должен быть альтернативный, которого у меня нет.
При двух подключениях и более вывод осуществляется дальше в массиве, но всё же указания имени подключения.
Система Win7 x64
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот скрипт, он указывает устройства и названия подключения:
Код:
$objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
$objClass = $objWMIService.ExecQuery("Select * from Win32_NetworkAdapter")

For $obj in $objClass
	MsgBox(0, '', 'Device: ' & $obj.Name & @CRLF & 'Name: ' & $obj.NetConnectionID)
Next
 
Автор
Z

ZaEzzz

Новичок
Сообщения
28
Репутация
2
Спасибо :smile:
Есть пища для раздумья :smile:
Вопрос решен :smile:
 

DMFox

Новичок
Сообщения
8
Репутация
0
Вот мой пример получения параметров текущего сетевого подключения ПК используя реестр.

Код:
#include <Constants.au3>
#include <Encoding.au3>
#include <Array.au3>

Global $aTXT,$prim_dns,$sec_dns,$sWmicComand = "WMIC PATH Win32_NetworkAdapter WHERE ""PNPDeviceID LIKE 'PCI\\VEN%'"""

$iPID = Run(@ComSpec &' /C ' & $sWmicComand, @SystemDir, @SW_HIDE, $STDOUT_CHILD)

While 1
    $aTXT &= StdoutRead($iPID)
    If @error Then ExitLoop
	Wend

$connectionid = StringRegExp($aTXT, '{(.*?)}', 3)
$lanid = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\'&'{'& $ConnectionID[0] &'}'
$ip = RegRead ($LANID,'IPAddress')
$mask = RegRead ($LANID,'SubnetMask')
$gateway = RegRead ($LANID,'DefaultGateway')
$dns=RegRead ($LANID,'NameServer')

$res = StringInStr($dns, ",")
If $res <> 0 then
$prim_dns = StringLeft($dns, StringInStr($dns, ",")-1)
$sec_dns = StringRight($dns, StringInStr($dns, ",")-1)
else
$prim_dns = $dns
EndIf   

MsgBox(0, "Информация","IP-Адрес: "& $ip &@CR& "Маска подсети: "& $mask &@CR& "Основной шлюз: "&$gateway &@CR& "Предпочитаемый DNS: "& $prim_dns &@CR& "Альтернативный DNS: "&$sec_dns)
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
DMFox,
Выдает ошибку
546.jpg
 

DMFox

Новичок
Сообщения
8
Репутация
0
Немного подправил скрипт, ранее неправильно мог определятся "Альтернативный DNS сервер" + добавил получение имя самого подключения из которого беруться параметры.

По поводу ошибки: скорее всего не получается ID подключения которое реализуется DOS командой в $sWmicComand, следовательно не присваивается значение $connectionid которое используется в $lanid.
Для того что бы это узнать добавил 2 закомментированные строчки. Раскоментируйте их и посмотрите что они выводят, если пусто (скорее всего так и есть) то это проблема с выполнением команды $sWmicComand. Хотя у меня на компе и на нескольких других работает все хорошо.

Код:
#include <Constants.au3>
#include <Encoding.au3>
#include <Array.au3>

Global $Text,$prim_dns,$sec_dns,$sWmicComand = "WMIC PATH Win32_NetworkAdapter WHERE ""PNPDeviceID LIKE 'PCI\\VEN%'"""

$iPID = Run(@ComSpec &' /C ' & $sWmicComand, @SystemDir, @SW_HIDE, $STDOUT_CHILD)

While 1
    $Text &= StdoutRead($iPID)
    If @error Then ExitLoop
	Wend

$connectionid = StringRegExp($Text, '{(.*?)}', 1)
;_ArrayDisplay($connectionid, "ID Подключений:")
;MsgBox(4096, "ID Подключений", "ID подключения которое используется по умолчанию: " &@CR& $connectionid[0], 0)
$lanid = 'HKLM\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\'&'{'& $connectionid[0] &'}'
$lanname = 'HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\'&'{'& $connectionid[0] &'}\Connection'
$connectionname = RegRead ($lanname,'Name')
$ip = RegRead ($LANID,'IPAddress')
$mask = RegRead ($LANID,'SubnetMask')
$gateway = RegRead ($LANID,'DefaultGateway')
$dns=RegRead ($LANID,'NameServer')

$res = StringInStr($dns, ",") 
If $res <> 0 then
$prim_dns = StringLeft($dns, StringInStr($dns, ",")-1)
$sec_dns = StringRight($dns, StringLen($dns)-StringInStr($dns, ","))
else
$prim_dns = $dns
EndIf   

MsgBox(0, "TCP/IPv4: "& $connectionname,"IP-Адрес: "& $ip &@CR& "Маска подсети: "& $mask &@CR& "Основной шлюз: "&$gateway &@CR& "Предпочитаемый DNS: "& $prim_dns &@CR& "Альтернативный DNS: "&$sec_dns)
 

DMFox

Новичок
Сообщения
8
Репутация
0
Ясно. Ну как я и думал, кстати сегодня пробовал запускать у друга тоже такая же проблема. Ну будем думать как исправить или сделаю альтернативный вариант.
 
Верх