File: Telemetry\MacAddressGetter.cs
Web Access
Project: src\sdk\src\Cli\dotnet\dotnet.csproj (dotnet)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Net.NetworkInformation;

namespace Microsoft.DotNet.Cli.Telemetry;

internal static class MacAddressGetter
{
    private static readonly byte[] AllZeroBytes = new byte[] { 0, 0, 0, 0, 0, 0 };

    public static string? GetMacAddress()
    {
        try
        {
            return GetMacAddressByNetworkInterface();
        }
        catch
        {
            return null;
        }
    }

    private static string? GetMacAddressByNetworkInterface()
    {
        return GetMacAddressesByNetworkInterface().FirstOrDefault();
    }

    private static List<string> GetMacAddressesByNetworkInterface()
    {
        NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

        if (nics == null || nics.Length < 1)
        {
            return new List<string>();
        }

        return nics
            .Where(nic => nic.NetworkInterfaceType != NetworkInterfaceType.Loopback &&
                          nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel)
            .Select(nic => nic.GetPhysicalAddress().GetAddressBytes())
            .Where(bytes => bytes.Length == 6 && !bytes.SequenceEqual(AllZeroBytes))
            .Select(bytes => string.Join("-", bytes.Select(b => b.ToString("X2"))))
            .ToList();
    }
}