Надежный метод для получения MAC-адреса машины в C#

Похоже, просто добавьте #links:

lead_link = item.find_element_by_css_selector("#links a.result__a").get_attribute("href")

Реклама внутри #ads div

120
задан 12 May 2009 в 00:29
поделиться

5 ответов

Вы можете указать идентификатор NIC:

 foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) {
     if (nic.OperationalStatus == OperationalStatus.Up){
         if (nic.Id == "yay!")
     }
 }

Это не MAC-адрес, но это уникальный идентификатор, если это то, что вы ищете.

4
ответ дан 24 November 2019 в 01:37
поделиться

ipconfig.exe реализован с использованием различных библиотек DLL, включая iphlpapi.dll ... Поиск в Google для iphlpapi показывает соответствующий Win32 API, задокументированный в MSDN.

0
ответ дан 24 November 2019 в 01:37
поделиться

Свойство MACAddress класса WMI Win32_NetworkAdapterConfiguration может предоставить вам MAC-адрес адаптера. (Пространство имен System.Management)

MACAddress

    Data type: string
    Access type: Read-only

    Media Access Control (MAC) address of the network adapter. A MAC address is assigned by the manufacturer to uniquely identify the network adapter.

    Example: "00:80:C7:8F:6C:96"

Если вы не знакомы с WMI API (инструментарием управления Windows), вы можете найти хороший обзор здесь для приложений .NET.

WMI доступен во всех версиях окон со средой выполнения .Net.

Вот пример кода:

System.Management.ManagementClass mc = default(System.Management.ManagementClass);
ManagementObject mo = default(ManagementObject);
mc = new ManagementClass("Win32_NetworkAdapterConfiguration");

ManagementObjectCollection moc = mc.GetInstances();
    foreach (var mo in moc) {
        if (mo.Item("IPEnabled") == true) {
              Adapter.Items.Add("MAC " + mo.Item("MacAddress").ToString());
         }
     }
10
ответ дан 24 November 2019 в 01:37
поделиться

WMI - лучшее решение, если машина, к которой вы подключаетесь, является машиной Windows, но если вы смотрите на сетевой адаптер linux, mac или другой тип сетевого адаптера, тогда вы нужно будет использовать что-то еще. Вот несколько вариантов:

  1. Используйте команду DOS nbtstat -a. Создайте процесс, вызовите эту команду, проанализируйте вывод.
  2. Сначала проверьте IP-адрес, чтобы убедиться, что ваш сетевой адаптер кэширует команду в своей таблице ARP, затем используйте команду DOS arp -a. Проанализируйте вывод процесса, как в варианте 1.
  3. Используйте ужасный неуправляемый вызов sendarp в iphlpapi.dll

Вот пример пункта №3. Это кажется лучшим вариантом, если WMI не является жизнеспособным решением:

using System.Runtime.InteropServices;
...
[DllImport("iphlpapi.dll", ExactSpelling = true)]
        public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
...
private string GetMacUsingARP(string IPAddr)
{
    IPAddress IP = IPAddress.Parse(IPAddr);
    byte[] macAddr = new byte[6];
    uint macAddrLen = (uint)macAddr.Length;

    if (SendARP((int)IP.Address, 0, macAddr, ref macAddrLen) != 0)
        throw new Exception("ARP command failed");

    string[] str = new string[(int)macAddrLen];
    for (int i = 0; i < macAddrLen; i++)
        str[i] = macAddr[i].ToString("x2");

    return string.Join(":", str);
}

Чтобы отдать должное, где это необходимо, это основа для этого кода: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#

9
ответ дан 24 November 2019 в 01:37
поделиться

Вот код C #, который возвращает MAC-адрес первого рабочего сетевого интерфейса. Если предположить, что сборка NetworkInterface реализована в среде выполнения (например, Mono), используемой в других операционных системах, тогда это будет работать и в других операционных системах.

Новая версия: возвращает сетевой адаптер с максимальной скоростью, который также имеет действительный MAC-адрес.

/// <summary>
/// Finds the MAC address of the NIC with maximum speed.
/// </summary>
/// <returns>The MAC address.</returns>
private string GetMacAddress()
{
    const int MIN_MAC_ADDR_LENGTH = 12;
    string macAddress = string.Empty;
    long maxSpeed = -1;

    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        log.Debug(
            "Found MAC Address: " + nic.GetPhysicalAddress() +
            " Type: " + nic.NetworkInterfaceType);

        string tempMac = nic.GetPhysicalAddress().ToString();
        if (nic.Speed > maxSpeed &&
            !string.IsNullOrEmpty(tempMac) &&
            tempMac.Length >= MIN_MAC_ADDR_LENGTH)
        {
            log.Debug("New Max Speed = " + nic.Speed + ", MAC: " + tempMac);
            maxSpeed = nic.Speed;
            macAddress = tempMac;
        }
    }

    return macAddress;
}

Исходная версия: возвращает только первый.

/// <summary>
/// Finds the MAC address of the first operation NIC found.
/// </summary>
/// <returns>The MAC address.</returns>
private string GetMacAddress()
{
    string macAddresses = string.Empty;

    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
        {
            macAddresses += nic.GetPhysicalAddress().ToString();
            break;
        }
    }

    return macAddresses;
}

Единственное, что мне не нравится в этом подходе, это то, что у вас есть вроде Nortel Packet Miniport или какой-либо тип VPN-соединения, у которого есть потенциал быть выбранным. Насколько я могу судить, нет способа отличить MAC реального физического устройства от виртуального сетевого интерфейса какого-либо типа.

78
ответ дан 24 November 2019 в 01:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: