1 (изменено: ypppu, 2017-12-21 18:58:29)

Тема: AHK: получение MAC-адреса не используя командной строки

В общем задался не так давно вопросом как заполучить MAC-адрес компьютера?
Сначала использовал командую строку, но оказалось не эффективным, т.к. командная строка "гребет" физический адрес не того адаптера.
Потом на англоязычном форуме нашел такую функцию:

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

IPAddress()
{
	for objItem in ComObjGet("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
	{
		if (objItem.IPAddress[0] = A_IPAddress1)
		{
			return, % objItem.MACAddress
		}
	}
}

Тоже немного проработала. Пишет что отказано в доступе (AVAST стоит на компьютере).
Кто-то знает ещё способы как достать MAC-адрес?
http://i.imgur.com/Oj7oHzh.jpg

2

Re: AHK: получение MAC-адреса не используя командной строки

ipconfig /all

3

Re: AHK: получение MAC-адреса не используя командной строки

Через winapi так:

adapters := GetMacAddresses()
for k, v in adapters
   MsgBox, % v.description . "`n" . v.macAddress

GetMacAddresses()  {
   static ERROR_BUFFER_OVERFLOW := 111, ERROR_SUCCESS := 0
        , MAX_ADAPTER_NAME_LENGTH := 256, MAX_ADAPTER_DESCRIPTION_LENGTH := 128
        , errors := { 13: "ERROR_INVALID_DATA", 50: "ERROR_NOT_SUPPORTED"
                    , 87: "ERROR_INVALID_PARAMETER", 232: "ERROR_NO_DATA" }
   size := 2
   Loop
      VarSetCapacity(PIP_ADAPTER_INFO, size, 0)
   until ( res := DllCall("Iphlpapi\GetAdaptersInfo", Ptr, &PIP_ADAPTER_INFO, UIntP, size) ) != ERROR_BUFFER_OVERFLOW
   if (res != ERROR_SUCCESS)  {
      MsgBox, % "Ошибка " . errors[res]
      Return
   }
   adapters := []
   pNext := &PIP_ADAPTER_INFO
   Loop  {
      description := StrGet(offset := pNext + A_PtrSize + 4 + MAX_ADAPTER_NAME_LENGTH + 4, "CP0")
   
      Loop % AddressLength := NumGet( (offset += MAX_ADAPTER_DESCRIPTION_LENGTH + 4) + 0, "UInt")
         macAddress .= (A_Index = 1 ? "" : ":") . Format( "{:02X}", *(offset + 4 + A_Index - 1) )
      
      adapters.Push({ description: description, macAddress: macAddress })
   } until !pNext := NumGet(pNext + 0)
   Return adapters
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: получение MAC-адреса не используя командной строки

Malcev, в шапочке написал без командной строки. Спасибо за ответ, но это не то.

5 (изменено: ypppu, 2017-12-21 18:57:59)

Re: AHK: получение MAC-адреса не используя командной строки

teadrinker, спасибо, работает. А как получить MAC текущего адаптера? Например у меня ноутбук и есть Ethernet и Wi-Fi. Используется сейчас Wi-Fi(текущий адаптер).

6

Re: AHK: получение MAC-адреса не используя командной строки

Точно не знаю, у меня везде по одному. Если никто не подскажет, пришлите скриншот, что выдаёт команда ipconfig /all по этим адаптерам, и какой из них в данный момент используется. Предполагаю, что у неиспользуемого нет ip-адреса.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: получение MAC-адреса не используя командной строки

teadrinker, по такому же принципу ищу зацепку.

У меня вот такая ерунда:

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

Везде настоящий MAC заменил на нули) не ругайтесь


Настройка протокола IP для Windows

   Имя компьютера  . . . . . . . . . : MandarinKa
   Основной DNS-суффикс  . . . . . . : 
   Тип узла. . . . . . . . . . . . . : Гибридный
   IP-маршрутизация включена . . . . : Нет
   WINS-прокси включен . . . . . . . : Нет

Ethernet adapter Tunngle:

   Состояние среды. . . . . . . . : Среда передачи недоступна.
   DNS-суффикс подключения . . . . . : 
   Описание. . . . . . . . . . . . . : TAP-Win32 Adapter V9 (Tunngle)
   Физический адрес. . . . . . . . . : 00-00-00-00-00-00
   DHCP включен. . . . . . . . . . . : Да
   Автонастройка включена. . . . . . : Да

Ethernet adapter Подключение по локальной сети:

   Состояние среды. . . . . . . . : Среда передачи недоступна.
   DNS-суффикс подключения . . . . . : 
   Описание. . . . . . . . . . . . . : Broadcom NetLink (TM) Gigabit Ethernet
   Физический адрес. . . . . . . . . : 00-00-00-00-00-00
   DHCP включен. . . . . . . . . . . : Да
   Автонастройка включена. . . . . . : Да

Адаптер беспроводной локальной сети Беспроводное сетевое соединение 2:

   Состояние среды. . . . . . . . : Среда передачи недоступна.
   DNS-суффикс подключения . . . . . : 
   Описание. . . . . . . . . . . . . : Microsoft Virtual WiFi Miniport Adapter
   Физический адрес. . . . . . . . . : 00-00-00-00-00-00
   DHCP включен. . . . . . . . . . . : Да
   Автонастройка включена. . . . . . : Да

Адаптер беспроводной локальной сети Беспроводное сетевое соединение:

   DNS-суффикс подключения . . . . . : 
   Описание. . . . . . . . . . . . . : Atheros AR5B97 Wireless Network Adapter
   Физический адрес. . . . . . . . . : 00-00-00-00-00-00
   DHCP включен. . . . . . . . . . . : Да
   Автонастройка включена. . . . . . : Да
   Локальный IPv6-адрес канала . . . : fe80::6001:bdee:223c:fb48%11(Основной) 
   IPv4-адрес. . . . . . . . . . . . : 192.168.0.100(Основной) 
   Маска подсети . . . . . . . . . . : 255.255.255.0
   Аренда получена. . . . . . . . . . : 28 августа 2017 г. 6:33:52
   Срок аренды истекает. . . . . . . . . . : 5 октября 2153 г. 0:54:35
   Основной шлюз. . . . . . . . . : 192.168.0.1
   DHCP-сервер. . . . . . . . . . . : 192.168.0.1
   IAID DHCPv6 . . . . . . . . . . . : 242540075
   DUID клиента DHCPv6 . . . . . . . : 00-00-00-00-00-00-00-00-00-00-00-00-11
   DNS-серверы. . . . . . . . . . . : 192.168.0.1
   NetBios через TCP/IP. . . . . . . . : Включен

Ethernet adapter VirtualBox Host-Only Network:

   DNS-суффикс подключения . . . . . : 
   Описание. . . . . . . . . . . . . : VirtualBox Host-Only Ethernet Adapter
   Физический адрес. . . . . . . . . : 0A-00-27-00-00-00
   DHCP включен. . . . . . . . . . . : Нет
   Автонастройка включена. . . . . . : Да
   Локальный IPv6-адрес канала . . . : fe80::57c:f8fd:d4dd:e6c2%15(Основной) 
   IPv4-адрес. . . . . . . . . . . . : 192.168.56.1(Основной) 
   Маска подсети . . . . . . . . . . : 255.255.255.0
   Основной шлюз. . . . . . . . . : 
   IAID DHCPv6 . . . . . . . . . . . : 503971879
   DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-21-03-D3-EC-74-DE-2B-CC-F3-DE
   DNS-серверы. . . . . . . . . . . : fec0:0:0:ffff::1%1
                                       fec0:0:0:ffff::2%1
                                       fec0:0:0:ffff::3%1
   NetBios через TCP/IP. . . . . . . . : Включен

8

Re: AHK: получение MAC-адреса не используя командной строки

teadrinker, т.к. у вас один адаптер, то вы ничего не заметите. Но у меня происходит вот такая штука:
http://i.imgur.com/LxHX1si.jpg
Адреса склеиваются.
Замените в коде последние строчки:


Loop  {
		description := StrGet(offset := pNext + A_PtrSize + 4 + MAX_ADAPTER_NAME_LENGTH + 4, "CP0")
		Loop % AddressLength := NumGet( (offset += MAX_ADAPTER_DESCRIPTION_LENGTH + 4) + 0, "UInt")
			macAddress .= (A_Index = 1 ? "" : ":") . Format( "{:02X}", *(offset + 4 + A_Index - 1) )
		
		adapters.Push({ description: description, macAddress: macAddress })
	} until !pNext := NumGet(pNext + 0)
	Return adapters

На:


Loop  {
		macAddress := ""
		description := StrGet(offset := pNext + A_PtrSize + 4 + MAX_ADAPTER_NAME_LENGTH + 4, "CP0")
		Loop % AddressLength := NumGet( (offset += MAX_ADAPTER_DESCRIPTION_LENGTH + 4) + 0, "UInt")
			macAddress .= (A_Index = 1 ? "" : ":") . Format( "{:02X}", *(offset + 4 + A_Index - 1) )
		
		adapters.Push({ description: description, macAddress: macAddress })
	} until !pNext := NumGet(pNext + 0)
	Return adapters

9

Re: AHK: получение MAC-адреса не используя командной строки

А, верно, надо очищать переменную.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: получение MAC-адреса не используя командной строки

Попробуйте так:

for adapter in ComObjGet("winmgmts:").InstancesOf("Win32_NetworkAdapter")  {
   if adapter.MACAddress
      MsgBox, % adapter.Description  . "`n"
              . adapter.AdapterType  . "`n"
              . !!adapter.NetEnabled . "`n"
              . adapter.MACAddress
}

Обращайте внимание на третье значение (adapter.NetEnabled).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: ypppu, 2017-12-21 18:57:34)

Re: AHK: получение MAC-адреса не используя командной строки

teadrinker, спасибо большое. То что нужно).
Подправил для себя:


GetMac()
{
	for adapter in ComObjGet("winmgmts:").InstancesOf("Win32_NetworkAdapter")  {
		if(adapter.MACAddress && !!adapter.NetEnabled = 1 && adapter.Manufacturer != "Oracle Corporation")
			return adapter.MACAddress
	}
	return -1
}

И всё равно есть небольшая зацепочка:
http://i.imgur.com/sdbOejL.jpg

12

Re: AHK: получение MAC-адреса не используя командной строки

Тогда не знаю, вот здесь список свойств, проверяйте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: получение MAC-адреса не используя командной строки

teadrinker, уже покликал там всё) До вашего поста. Вот решение:

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

if(adapter.MACAddress && !!adapter.NetEnabled = 1 && adapter.Manufacturer != "Oracle Corporation")