1

Тема: JS: Определение ip-адреса адаптера.

На ПК несколько виртуальных адаптеров (VMware, VirtualBox  и т.п.) и один физический, который проводом подключён к коммутатору. Необходимо получить только адрес IPv4 этого реального, физического адаптера.
Пробовал такой код, но он выдаёт все адаптеры и все протоколы (IPv6). Подскажите, как избавиться от лишнего.

var wbemFlagReturnImmediately = 0x10; 
var wbemFlagForwardOnly = 0x20;         
var SWbemService = GetObject("winmgmts:\\\\.\\root\\cimv2"); 
                        
var SWbemObjectSet = SWbemService.ExecQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled = true", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly);

var coll = new Enumerator(SWbemObjectSet), ret = "";
for(; !coll.atEnd(); coll.moveNext())
    {
    var objItem = coll.item();        
    try                            {
        ret += "IP-адрес:\n" + objItem.IPAddress.toArray().join("\n") + "\n";
        } 
         catch(e) 
        {
        ret += "IP-адрес на интерфейсе не определён " + e.message + "\n";
        } 
    }
WScript.Echo(ret);

2

Re: JS: Определение ip-адреса адаптера.

Чем отличается реальный, физический адаптер от виртуальных?

3

Re: JS: Определение ip-адреса адаптера.

с точки зрения ОС ничем

4 (изменено: im2002, 2014-06-27 09:18:05)

Re: JS: Определение ip-адреса адаптера.

можно  в фильтр отбора прописать нужный MAC, тогда ненужные адаптеры сами собой отпадут, как IPv6 исключить, не "снимая галочку" в настройках? это хоть можно?

5

Re: JS: Определение ip-адреса адаптера.

как IPv6 исключить, не "снимая галочку" в настройках? это хоть можно?

Что значит «исключить»?

6

Re: JS: Определение ip-адреса адаптера.

чтобы в результатах скрипта не отображался, скрипт в первом топике который

7

Re: JS: Определение ip-адреса адаптера.

Фильтровать внутри цикла перебора, проверяя очередной элемент массива на вхождение подстроки «:».

8

Re: JS: Определение ip-адреса адаптера.

Спасибо, слишком громоздко всё как-то выходит, тем более, что это часть общей задачи... так что иду другим путём

9

Re: JS: Определение ip-адреса адаптера.

так что иду другим путём

Например?

10

Re: JS: Определение ip-адреса адаптера.

Фильтровать выходную строку...

11

Re: JS: Определение ip-адреса адаптера.

Нет, там ситуация такая: маленькая фирма - 7 компов в рабочей группе + 1 роутер + 1 сетевой принтер - это всё то, что имеет ip-адреса. Поскольку сама сетевая структура (провода, патч-корды) валяется буквально под ногами, то они (сотрудники) естественно всё это так или иначе "дёргают" и контакты отваливаются... Потом, собаки, звонят ко мне приезжай мол у нас принтер не работает... а дело в том, что сетевой кабель от компа отвалился. Приводить в порядок СКС они не хотят, денег за это не платят, а это монтаж надо новый делать. Я у них 1 день работаю в неделю, так вот хотел написать такой скрипт, который можно было бы запустить с любой рабочей станции, и  по его отработке видеть какие узлы она (станция) видит, а какие нет и потом уж соответствующие провода дёргать... Вот как-то так... Тему начал эту потому что сразу хотел отсечь проверку того Ip, с которого запускается скрипт, но понял, что анализ по IP, это геморрой! Поэтому написал по другому, отталкиваясь не от IP адресов а от NetBIOS имён ПК. Думаю всё будет работать.
Вот такой код:

var fso = new ActiveXObject("Scripting.FileSystemObject");    
var wshshell = WScript.CreateObject("WScript.Shell");    
var netObj = new ActiveXObject("WScript.Network");    
var rezult = "C:\\live_IP.txt";                                       // путь к файлу результата

var ipArray = ["192.168.1.205", "192.168.1.200", "89.106.192.3", "192.168.1.248", "192.168.1.10", "172.18.0.4"];        
                                                                  // массив ip-адресов
var ipHosts = ["Inet", "Main", "Internet-HOST", "NhmS241", "Printer-Buh", "NAUGAD"];
                                                                  // массив имён

var compName = netObj.ComputerName;

for(i=0; i<ipHosts.length; i++)
    {
    if(compName.toLowerCase() == ipHosts[i].toLowerCase())
        {
        ipHosts.splice(i, 1), ipArray.splice(i, 1);    
        }
    }

if(fso.FileExists(rezult) == true)                
    {
    fso.DeleteFile(rezult, true);
    }

for(f=0; f<ipArray.length; f++)                
    {
    var name = ipArray[f];
    Aviable(name);
    }

wshshell.run('notepad.exe ' + rezult, 1, true);

function Aviable(name)
    {
    var objClass = GetObject("winmgmts://.\\Root\\CIMV2:Win32_PingStatus.address=\"" + name + "\""); 
                            
    if(objClass.StatusCode == 0)                
        {
        var txtfl = fso.OpenTextFile(rezult, 8, true);        
        txtfl.WriteLine("Сетевой хост с IP =  " + name + "  и именем " + ipHosts[f] + "  ДОСТУПЕН");
        txtfl.WriteLine("----------------------------------------------------");
        txtfl.WriteBlankLines(1);                
        txtfl.close();                        
        }
    else
        {
        var txtfl = fso.OpenTextFile(rezult, 8, true);        
        txtfl.WriteLine("Сетевой хост с IP =  " + name + "  и именем " + ipHosts[f] + "  НЕ ДОСТУПЕН");
        txtfl.WriteLine("----------------------------------------------------");
        txtfl.WriteBlankLines(1);                
        txtfl.close();                    
        }
    }

Ip - адреса - статика, имена так же никто не меняет, немного доработаю, чтобы 1-м пинговал роутер и в случае неудачи, сообщал, что надо проверить подключение своего ПК, хотя можно и так, ка щас...
Ну вот пожалуй и всё, растолкую как и что, думаю меня это от лишних поездок избавит.

12 (изменено: Rom5, 2014-06-27 23:00:07)

Re: JS: Определение ip-адреса адаптера.

Оффтоп:
Если, на машинах конторы есть внешний инет, то как вариант - поставить на всех них бесплатный клиент "Team Viewer"
и будете своим клиентом TM снаружи видеть наличие их компов в сети.


И ещё вариант: повесить всем в автозагрузку скрипт, проверящий перидически наличие пинга с их роутером, и выводящий при отсутствии связи некое окно - и они без Вас поймут, что креслом очередной раз патчкорд перееден.
Кстати, программка "BackGround Info" красиво выводит прямо на рабочий стол некую инфу и в т.ч. результат работы пользовательского скрипта.

WBR. Roman

13

Re: JS: Определение ip-адреса адаптера.

это уже сделал давно, не помогает + инет плохой 1 мбит

14

Re: JS: Определение ip-адреса адаптера.

А можно просто зайти из "внешнего инета" на роутер и посмотреть, какие MAC-адреса видны?

15

Re: JS: Определение ip-адреса адаптера.

Заинтересовался скриптом, правда для другой цели, но возник один вопрос. Вот сокращённый (для удобства экспериментов) вариант оригинального скрипта im2002:

var
 a=[
  {ip:'192.168.1.1',name:'Zyxel'},
  {ip:'192.168.1.34',name:'Note'},
  {ip:'192.168.1.220',name:'Asus'}
 ],
 n=new ActiveXObject('WScript.Network').ComputerName,
 t='';

//var w=GetObject('winmgmts://.\\Root\\CIMV2');

for(i=0;i<a.length;i++)if(n.toLowerCase()!=a[i].name.toLowerCase())
 t+='хост: '+a[i].ip+'   \t('+a[i].name+')          \t'+

 (GetObject('winmgmts://.\\Root\\CIMV2:Win32_PingStatus.address="'+a[i].ip+'"').statusCode?
// (w.ExecQuery('Select * From Win32_PingStatus Where address = "'+a[i].ip+'"').statusCode?

 'НЕ':'')+'доступен\n';

WScript.echo(t);

Можно ли создать объект WMI один раз, а в цикле вызывать его для разных айпишников? Закомментированные строки - это мои попытки (неудачные) реализовать задуманное.

16

Re: JS: Определение ip-адреса адаптера.

Можно ли создать объект WMI один раз, а в цикле вызывать его для разных айпишников?

Разумеется. Если речь про свойство «.address».

Закомментированные строки - это мои попытки (неудачные) реализовать задуманное.

Первая строка должна возвращать именно объект. Если указаны все ключи:

+ открыть спойлер

http://i.imgur.com/ba3MBNN.png

Посему — отметаем.

Метод же «.ExecQuery()» всегда возвращает коллекцию (а не единственный объект), которую нужно нумеровать (в JScript) и перебирать. Пользуйте его указанным образом.

17 (изменено: Serge Yolkin, 2014-06-29 03:21:08)

Re: JS: Определение ip-адреса адаптера.

alexii, спасибо, получилось. Грабли под названием typeof() Microsoft заложила очень грамотно: который раз наступаю.

+ открыть спойлер

На ярлычке вкладки название темы у меня выглядит так: JS: Определение ip-адреса ада

18

Re: JS: Определение ip-адреса адаптера.

+ открыть спойлер

Пользуйтесь тэгом и кнопкой «Spoiler»:

+ открыть спойлер

http://i.imgur.com/xNmXINh.png

У меня так: «JS: Опр…».

19

Re: JS: Определение ip-адреса адаптера.

Еще есть тонкие клиенты, на них надо добавить проверку на режим запуска, они вроде как в консоле чтоль выполняются

20

Re: JS: Определение ip-адреса адаптера.

im2002 пишет:

Необходимо получить только адрес IPv4 этого реального, физического адаптера.

А что показывают

arp -a

и

route print

?
Также лично я бы не стал особо полагаться на WMI, а обратился бы напрямую к реестру:

reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces /s

Там можно много чего интересного найти.

21

Re: JS: Определение ip-адреса адаптера.

Похоже, что никому более сказать нечего, так что позволю со своей стороны себе такую вольность в данной теме, как пример поиска IP для wlan на примерекомандного языка.

@echo off
  setlocal
    set "top=HKLM\SYSTEM\CurrentControlSet"
    set "net=%top%\Control\Network"
    set "mid=%net%\%%i"
    set "sub=%mid%\%%j\Connection"
    for /f "tokens=6 delims=\" %%i in (
      'reg query %net% ^| 2^>nul findstr /c:"{"'
    ) do (
      for /f "tokens=7 delims=\" %%j in (
        'reg query %mid% ^| findstr /ec:"}"'
      ) do (
        for /f "tokens=3" %%k in (
          '2^>nul reg query %sub% /v MediaSubType'
        ) do (
          if "%%k" equ "0x2" set "itm=%%j"
        )
      )
    )
    set "itm=%top%\Services\Tcpip\Parameters\Interfaces\%itm%"
    for /f "skip=3 tokens=3" %%i in (
      'reg query %itm% /v DhcpIPAddress'
    ) do echo.%%i
  endlocal
exit /b

Суть. wlan определяется по MediaSubType, который равен 2.

22

Re: JS: Определение ip-адреса адаптера.

проверил от vgreg zakharo, не вдаваясь в подробности, на Win7x64. Выдаёт ошибку: Не удаётся найти раздел или указанный параметр в реестре.

23

Re: JS: Определение ip-адреса адаптера.

im2002, давайте немного уточним: на каком именно разделе реестра спотыкается сценарий? Не уверен, что в плане хранения даных о сетевых интерфейсах 32-х и 64-х битные системы записи в реестре шибко разнятся, но на всякий случай проверьте предварительно вручную такие разделы реестра, как:

HKLM\SYSTEM\CurrentControlSet\Control\Network

в поддириктории которых (Connection) содержится значение MediaSubType. В сценарии выше он указан равным двум, так как это - идентификатор wlan. Далее, загляните в раздел:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{...}

где {...} - id карты (полученного из Network).

24

Re: JS: Определение ip-адреса адаптера.

Кстати!

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentControl\NetworkCards

также может сослужить добром в поисках адаптеров и IP. Например:

@echo off
  setlocal
    set "top=HKLM"
    set "sub=%top%\SYSTEM\CurrentControlSet"
    set net="%top%\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards"
    set "itm=%sub%\Services\Tcpip\Parameters\Interfaces\%%i"
    for /f "tokens=3" %%i in (
      'reg query %net% /s ^| findstr /ic:"ServiceName"'
    ) do (
      for /f "skip=3 tokens=3" %%j in (
        '2^>nul reg query %itm% /v DhcpIPAddress'
      ) do (
        if "%%j" neq "0.0.0.0" (
          set "ip=%%j"
          set "id=%%i"
        )
      )
    )
    set "net=%sub%\Control\Network"
    set "mid=%net%\%%i\%id%\Connection"
    for /f "tokens=6 delims=\" %%i in (
      'reg query %net% /s ^| 2^>nul findstr /ec:"%id%"'
    ) do (
      for /f "skip=3 tokens=3" %%j in (
        'reg query %mid% /v PnpInstanceID'
      ) do (
        for /f "skip=3 tokens=2,*" %%k in (
          'reg query "%sub%\Enum\%%j" /v DeviceDesc'
        ) do echo %%l - %ip%
      )
    )
  endlocal
exit /b

Словом, насколько фантазия позволяет, настолько глубоко можно расковырять реестр.

25 (изменено: greg zakharov, 2014-09-22 22:13:14)

Re: JS: Определение ip-адреса адаптера.

im2002, в виду того, что PowerShell уже предустановлен в Win7, в нем Ваша задача решается еще проще:

gp 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\*' | % {
  $ht = @{}
}{
  $ht[$_.Description] = $_.ServiceName
}{
  $ht.GetEnumerator() | % {
    "{0} - {1}" -f $_.Name, (
      gp "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\$(
        $_.Value
      )"
    ).DhcpIPAddress
  }
}

Опять-таки решение завязано на парсинге данных реестра при этом скорость выборки данных в разы выше, чем если бы то же писалось на командном языке или WSH.