Войти

Показать полную графическую версию : [решено] Определение типа адаптера и MAC-адреса


m0nkrus
05-04-2022, 19:21
Есть рабочая конструкция под CMD:
for /f "tokens=3 skip=1" %%a in ('wmic path Win32_NetworkAdapter where "PNPDeviceID like '%%%%USB%%%%' AND AdapterTypeID='0'" get MacAddress^,AdapterType') do set "MacAddress=%%a"
for /f "tokens=3 skip=1" %%a in ('wmic path Win32_NetworkAdapter where "PNPDeviceID like '%%%%PCI%%%%' AND AdapterTypeID='0'" get MacAddress^,AdapterType') do set "MacAddress=%%a"
echo MAC %MacAddress::=%>"%Temp%\MacAddress.txt"
Скрипт ищет реальный (не виртуальный) сетевой адаптер и в случае его нахождения выдает в файл его MAC-адрес без разделителей. Причем, если на компьютере одновременно есть как встроенная сетевуха, так и воткнутый в него "свисток", то предпочтение отдается первой. Наличие или отсутствие интернета на выбранном адаптере не важно.

Учитывая, что от WMIC Майкрософт собирается полностью отказываться, мне бы хотелось заранее подстелить соломку и получить аналог этого кода на Powershell.

[hr]
Вот, что лично я насоображал:
$NetAdapter = Get-PnpDevice | where {$_.Class -like "Net" -and $_.InstanceId -like "*USB*"} | select FriendlyName
$NetAdapter = Get-PnpDevice | where {$_.Class -like "Net" -and $_.InstanceId -like "*PCI*"} | select FriendlyName
Этот код передает в переменную инфу о нужном адаптере. Но там три строки, тогда как нужна только последняя.

А вот этот код должен отлавливать MAC для выявленного адаптера и убирать разделители в строке:
$MacAddress = Get-WmiObject win32_networkadapterconfiguration | where {$_.descraption -like $NetAdapter} | select macaddress
$MacAddress = $MacAddress -replace ':'

Не хватает двух кусков - преобразования трехстрочной переменной в однострочную и передачи содержимого переменной в файл.

DJ Mogarych
05-04-2022, 22:09
(Get-NetAdapter -Physical |? PnPDeviceID -match '^PCI').macaddress -replace '-' > "$env:TEMP\MacAddress.txt"


Но откуда уверенность, что всегда будет выдаваться один MAC? У меня выдаётся два, например, т. к. в неттопе есть и Ethernet, и Wi-fi.

Насчёт WMIC можно не париться, т. к. в Powershell можно также задействовать старые методы:

gwmi Win32_NetworkAdapter # В Powershell 7 уже не работает
gcim Win32_NetworkAdapter # работает везде

m0nkrus
05-04-2022, 22:29
Но откуда уверенность, что всегда будет выдаваться один MAC? У меня выдаётся два, например, т. к. в неттопе есть и Ethernet, и Wi-fi. »
Ну, по CMD-скрипту два MAC никак не попадут в переменную. Он просматривает все адаптеры и тупо записывает в переменную MAC последнего в списке. А вот с Powershell, да, такое может быть. Ну так для этого я и ищу вариант, когда можно сграбить только последнюю строку в списке.

Если ваш скрипт собирает оба ваши MAC в кучу, то мне ваш вариант не подходит! Да и сразу вывод в файл не вариант. Мне нужно, чтобы сначала все шло в переменную. И лишь из нее в файл.
Кстати, если в переменной на момент отправки в нее записи что-то было, а новый командлет отработав не нашел соответствий, он оставит переменную без изменений или обнулит?

Sham
05-04-2022, 22:31
насколько понял $pci = Get-CimInstance win32_networkadapter -Property AdapterTypeID, PNPDeviceID, MACAddress |
Where-Object { $_.PNPDeviceID -match 'PCI|USB' -and $_.AdapterTypeID -eq 0 -and $_.MACAddress } |
Select-Object MACAddress, @{ Name = 'M'; Expression = { $matches[0] } } |
Sort-Object M | Select-Object -First 1

$pci.MACAddress -replace ':' > "$env:TEMP\MacAddress.txt"

DJ Mogarych
05-04-2022, 22:38
Ну, последний взять-то не проблема:

(Get-NetAdapter -Physical |? PnPDeviceID -match '^PCI|^USB' |sort PnPDeviceID -Descending).macaddress[-1] -replace '-' > "$env:TEMP\MacAddress.txt"


Можете в переменную, только потом в файл, хотя смысл этого непонятен.

$peremennaya = (Get-NetAdapter -Physical |? PnPDeviceID -match '^PCI|^USB' |sort PnPDeviceID -Descending).macaddress[-1] -replace '-'
$peremennaya > "$env:TEMP\MacAddress.txt"


если в переменной на момент отправки в нее записи что-то было, а новый командлет отработав не нашел соответствий, он оставит переменную без изменений или обнулит? »
Вопрос не совсем понятен. Новый командлет где - в том же скрипте ниже? Или при новом запуске скрипта? Переменная существует, пока выполняется скрипт. Если скрипт выполнился и завершился, никакие переменные, которые были в нём, после этого не существуют.

Sham
05-04-2022, 22:43
там же ещё USB надо отловить, если PCI не найдётся

m0nkrus
05-04-2022, 22:49
Sham, конструкция -match 'PCI|USB', наверное , не подходит. Не понятно, который из адаптеров окажется в итоговой переменной, при наличии в системе обоих, USB или PCI. Если есть оба, то в результате должен быть именно PCI.

DJ Mogarych, смысл простой: вы забыли про отработку USB-свистков. Есть компы, где кроме "свистка" ничего нет. В этом случае мне нужен MAC свистка. Но если есть PCI, то "свисток" оставляем за бортом. Поэтому сначала отрабатываем USB с результатом в переменную. Потом PCI с результатом в ту же переменную с замещением результата от USB (если есть). И вот уже после этого отправка итога в файл!

DJ Mogarych
05-04-2022, 22:51
Поправил выше. Берём все подходящие адаптеры, сортируем в обратном порядке (сначала USB, потом PCI), берём последний. Если он один - то он один и будет. Выкидываем разделители, пишем в файл.
Потом PCI с результатом в ту же переменную с замещением результата от USB (если есть) »
Так не выйдет, вы переменную пустотой перезапишете. Либо надо громоздить условие, что в данном случае лишнее усложнение.

m0nkrus
05-04-2022, 23:00
DJ Mogarych, как-то криво поправил... На выходе одна цифра - последний символ MAC-адреса.

Sham
05-04-2022, 23:04
конструкция -match 'PCI|USB', наверное , не подходит »
так смотрите дальше - сортируется по совпадению. При наличии pci и usb по алфавиту первым будет pci.
like '%%%%PCI%%%%' вроде бы ищет по всей строке, не заякорено на начало, как '^PCI'

DJ Mogarych
05-04-2022, 23:06
А, понял, у вас один адаптер. Вот так попробуйте:

((Get-NetAdapter -Physical |? PnPDeviceID -match '^PCI|^USB' |sort PnPDeviceID -Descending).macaddress |select -Last 1) -replace '-' > "$env:TEMP\MacAddress.txt"

m0nkrus
05-04-2022, 23:13
Sham, прошу прощения, сортировку сразу как-то не заметил. Для меня Powershell вообще незнакомый язык.
Так-то, вроде работает. Нужно только испытать на живой машине, где есть две PCI-карты, не будет ли задвоения. У меня под рукой такого компа нет.

DJ Mogarych, это уже универсальный вариант и с одним PCI и с двумя работает?

Еще один момент: мне нужно, чтобы перед маком был записан текст. К примеру "MAC: 12345564564". Это возможно реализовать?

Sham
06-04-2022, 01:17
"MAC: " + (выражение перед ">") > файл

m0nkrus
06-04-2022, 05:53
DJ Mogarych, Sham, благодарю!
Помечаю вопрос как решенный.




© OSzone.net 2001-2012