среда, 23 июня 2010 г.

Определение порта Cisco к которому подключен компьютер

Некоторое время назад возникла задача определять порт роутера Cisco к которому подключен компьютер.
В качестве вводных данных были сведения что на роутерах включен CDP.
CDP - это Cisco Discovery Protocol, некий протокол, по которому с некоторой периодичностью ведется broadcast с идентификационными данными порта роутера Cisco.
Довольно длительный поиск программ которые могли бы работать с этим протоколом и при этом работали бы в консольном режиме привел к программе Cisco Discovery Protocol Reporter Version 1.0.7, сокращенно CDPR.exe.
Эта программа обладает почти всеми требуемыми характеристиками, за исключением нескольких ньюансов.
Ньюанс 1 - при запуске программа требует указать ей сетевой адаптер через который она будет слушать. Выглядит это как:
cdpr - Cisco Discovery Protocol Reporter Version 1.0.7
Copyright (c) 2002 - MonkeyMental.com
1. \Device\NPF_GenericDialupAdapter (Adapter for generic dialup and VPN capture)
2. \Device\NPF_{CA318676-6027-4305-8A6F-4633BC2412EB} (Marvell Yukon Ethernet Controller.)
Enter the interface number (1-2):

Поскольку у нас задача автоматизировать этот процесс возник вопрос как это обойти.
Ньюанс 2 - при запуске она требует наличия ряда библиотек. Если она их видит в конечном итоге ругается на не установленный WinPCAP. Поскольку он не имеет silent-режима установки пришлось придумать способ обойти и это.

Для начала разберемся с пунктом 1.
Программа изначально была написана для Linux, что позволило предположить наличие ключа -h со справкой. Выяснилось что существует ключ -d для указания сетевого адаптера. К сожалению он принимает в качестве параметра исключительно ID сетевого устройства. Узнать его можно из ветки реестра SYSTEM\CurrentControlSet\Control\Network . Нам требуется раздел с параметром Class = Net. Подраздел и будет содержает требуемый для нас DeviceID. В нашем случае это получается

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{CA318676-6027-4305-8A6F-4633BC2412EB}
Остается только добавить NPF_  и можно отправлять полученное значение программе CDPR.exe с ключем -d.

По ссылке находится скрипт написанный на Powershell для автоматизации процедуры получения DeviceID и запуска CDPR.exe .
Полученные от программы данные в виде


Device ID
  value:  
Addresses
  value:  
Port ID
  value:  


Записываются в реестр в ветку hklm\SOFTWARE\Company\Network\ и могут быть оттуда проинвентаризированы. Также можно сразу формировать файлы .mof или .xml для SCCM и Altiris соответственно, доделав соответствующим образом скрипт.

По поводу пункта 2.
Выяснилось что для полноценного запуска программы требуется три библиотеки - Packet.dll, WanPacket.dll и wpcap.dll. Эти файлы можно просто положить рядом с программой. Также для запуска требуется наличие файла npf.sys. К сожалению этот файл требуется скопировать в папку Drivers, иначе не срабатывает.

Скрипт проверяет наличие npf.sys в папке System32/Drivers и, если не находит его, копирует из папки где располагается сам.

В теории это выглядит так - пакет содержит все указанные файлы. У пакета программа имеет строку запуска powershell -executionpolicy unrestricted .\get_adapter.ps1
-executionpolicy требуется на всякий случай, если не отработала ранее команда powershell -command set-executionpolicy unrestricted или скрипт не подписан.

Весь комплект файлов расположен по ссылке. Скрипт расположен отдельно по ссылке выше.

Комментариев нет:

Отправить комментарий