সি # তে মেশিনের ম্যাক ঠিকানা পাওয়ার নির্ভরযোগ্য পদ্ধতি


131

ওএস সি # ব্যবহার করে চলমান নির্বিশেষে একটি মেশিনের ম্যাক ঠিকানা পাওয়ার জন্য আমার একটি উপায় প্রয়োজন। অ্যাপ্লিকেশনটির XP / Vista / Win7 32 এবং 64 বিটের পাশাপাশি সেই OSগুলিতে কিন্তু বিদেশী ভাষার ডিফল্ট সহ কাজ করা দরকার। অনেক সি কমান্ড এবং ওএস ক্যোয়ারী ওএস জুড়ে কাজ করে না। কোন ধারনা? আমি "ipconfig / all" এর আউটপুট স্ক্র্যাপ করে চলেছি তবে প্রতিটি মেশিনে আউটপুট ফর্ম্যাট আলাদা হওয়ার কারণে এটি মারাত্মকভাবে বিশ্বাসযোগ্য নয়।

ধন্যবাদ


7
আপনি যখন ওএস জুড়ে বলছেন, আপনি বিভিন্ন মাইক্রোসফ্ট ওএস এর জুড়ে বোঝাচ্ছেন?
জন ওয়েলডন

উত্তর:


136

ক্লিনার সমাধান

var macAddr = 
    (
        from nic in NetworkInterface.GetAllNetworkInterfaces()
        where nic.OperationalStatus == OperationalStatus.Up
        select nic.GetPhysicalAddress().ToString()
    ).FirstOrDefault();

বা:

String firstMacAddress = NetworkInterface
    .GetAllNetworkInterfaces()
    .Where( nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback )
    .Select( nic => nic.GetPhysicalAddress().ToString() )
    .FirstOrDefault();

44
বা লাম্বদা, যদি এটি আপনার জিনিস! return NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();(যদি এটি আপনার জিনিস না হয় তবে এটি আপনার জিনিস হওয়া উচিত))
গনিয়েলে

7
দ্রুততম হওয়ার var networks = NetworkInterface.GetAllNetworkInterfaces(); var activeNetworks = networks.Where(ni => ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback); var sortedNetworks = activeNetworks.OrderByDescending(ni => ni.Speed); return sortedNetworks.First().GetPhysicalAddress().ToString();
সান্নিধ্য

1
প্রথমে নির্বাচন করা সর্বদা সেরা বিকল্প নয়। সর্বাধিক ব্যবহৃত সংযোগটি নির্বাচন করা হচ্ছে: stackoverflow.com/a/51821927/3667
রামুনাস

অপ্টিমাইজেশন নোট: আপনি FirstOrDefaultফাইনালের আগে কল করতে পারেন Select। এইভাবে, এটি কেবল শারীরিক ঠিকানা পাবে এবং এটি NetworkInterfaceযে আসল তা আপনি এটির জন্য সিরিয়ালাইজ করবেন । এর পরে নাল চেক (?) যুক্ত করতে ভুলবেন না FirstOrDefault
গ্রেগাহোমোরকো

এটি পাওয়ার একটি গণনামূলক দ্রুততর উপায়, আপনার প্রদত্ত শর্তের সাথে মিলে এমন সমস্ত নেটওয়ার্কের মূল্যায়ন করার দরকার নেই, আপনার কেবলমাত্র প্রথমটি দরকার: NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)? .GetPhysicalAddress().ToString();
আলেসান্দ্রো মুজ্জি

80

এখানে কিছু সি # কোড যা প্রথম অপারেশনাল নেটওয়ার্ক ইন্টারফেসের ম্যাক ঠিকানা প্রদান করে। ধরে নিই যে NetworkInterfaceঅ্যাসেম্বলিটি অন্যান্য অপারেটিং সিস্টেমে ব্যবহৃত রানটাইম (অর্থাৎ মনো) এ প্রয়োগ করা হয় তবে এটি অন্যান্য অপারেটিং সিস্টেমে কাজ করবে।

নতুন সংস্করণ: দ্রুত গতিতে NIC ফেরত দেয় যার বৈধ ম্যাক ঠিকানাও রয়েছে।

/// <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;
}

এই পদ্ধতির বিষয়ে আমি কেবল পছন্দ করতে পারি না যদি আপনি কোনও নরটেল প্যাকেট মিনিপোর্ট বা কোনও ধরণের ভিপিএন সংযোগ পছন্দ করেন তবে এটির নির্বাচনের সম্ভাবনা রয়েছে। আমি যতদূর বলতে পারি, প্রকৃত শারীরিক ডিভাইসের ম্যাককে কোনও ধরণের ভার্চুয়াল নেটওয়ার্ক ইন্টারফেস থেকে আলাদা করার কোনও উপায় নেই।


6
শুধু প্রথম অপারেশনাল ইন্টারফেস বাছাই করবেন না। এটি লুপব্যাক ইন্টারফেসগুলি, মাঝে মাঝে সংযুক্ত 3 জি কার্ড এবং এমন কিছু ফিরিয়ে দিতে পারে যা সম্ভবত আপনি চান না। নেটওয়ার্কআইন্টারফেস টাইপ ( এমএসডিএন.মাইক্রোসফটকম / en- us/ library/… ) আপনাকে নেটওয়ার্ক ইন্টার্নফেস সংযোগ সম্পর্কে আরও তথ্য দেবে যাতে আপনি আরও তথ্যের জন্য পছন্দ করতে পারেন। এও মনে রাখবেন যে কোনও মেশিনে অনেকগুলি সক্রিয় সংযোগ থাকতে পারে এবং তাদের ক্রমটি অনুমানযোগ্য নাও হতে পারে।
ডেভ আর।

@DaveR। আমি নেটওয়ার্কআইন্টারফেসটাইপটির দিকে চেয়েছিলাম, এটি প্রায়শই ইথারনেটকে ফিরিয়ে দেয় এমনকি এটি আমার অভিজ্ঞতার ভার্চুয়াল অ্যাডাপ্টার ছিল তাই আমি এটি দেখতে পেলাম খুব অকেজো।
blak3r

1
সর্বনিম্ন গেটওয়েট্রিকের সাথে আপনার ইন্টারফেসটি বেছে নেওয়া উচিত। এটি এমন সংযোগ হওয়া উচিত যা "দ্রুততম, সবচেয়ে নির্ভরযোগ্য, বা সর্বনিম্ন সংস্থান-নিবিড়তম রুট" রয়েছে। মূলত এটি আপনাকে ইন্টারফেসটি উইন্ডোজ ব্যবহার করতে পছন্দ করে। তবে আমি মনে করি আসলে এটি পেতে আপনার ডাব্লুএমআই দরকার। আমি এটি কাজ করতে পারি কিনা তা আমি দেখব ...
এভিআই

6
সম্পূর্ণতার জন্য, নেটওয়ার্ক using System.Net.NetworkInformation;
ইন্টারফেস

1
এফডব্লিউআইডাব্লু, আপনার যদি গিগাবিট এনআইসি এবং হাইপার-ভি ইনস্টল থাকে তবে আপনার কাছে একটি 10 ​​গিগাবিট ভার্চুয়াল এনআইসিও থাকবে। :) সমস্যা সমাধানের জন্য কঠিন ...
ক্রিস্টোফার পেইন্টার

10

MACAddress সম্পত্তির Win32_NetworkAdapterConfiguration WMI বর্গ একটা এডাপটার MAC ঠিকানা সঙ্গে আপনি প্রদান করতে পারেন। (সিস্টেম.ম্যানেজমেন্ট নেমস্পেস)

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"

আপনি যদি ডাব্লুএমআই এপিআই (উইন্ডোজ ম্যানেজমেন্ট ইনস্ট্রুমেন্টেশন) এর সাথে পরিচিত না হন তবে । নেট অ্যাপ্লিকেশনগুলির জন্য এখানে একটি ভাল ওভারভিউ রয়েছে

ডাব্লুএমআই। নেট রানটাইম সহ উইন্ডোজের সমস্ত সংস্করণ জুড়ে উপলব্ধ।

এখানে একটি কোড উদাহরণ:

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());
         }
     }

9

ডাব্লুএমআই হ'ল সবচেয়ে ভাল সমাধান যদি আপনি যে মেশিনে সংযুক্ত করছেন সেটি উইন্ডোজ মেশিন তবে আপনি যদি কোনও লিনাক্স, ম্যাক বা অন্য ধরণের নেটওয়ার্ক অ্যাডাপ্টারের দিকে তাকিয়ে থাকেন তবে আপনাকে অন্য কিছু ব্যবহার করতে হবে। এখানে কিছু বিকল্প রয়েছে:

  1. ডস কমান্ডটি nbtstat -a ব্যবহার করুন। একটি প্রক্রিয়া তৈরি করুন, এই আদেশটি কল করুন, আউটপুট পার্স করুন।
  2. আপনার এনআইসি এটিআরপি সারণীতে কমান্ডটি ক্যাশে করেছে তা নিশ্চিত করার জন্য প্রথমে আইপিকে পিং করুন, তারপরে ডস কমান্ড আরপ -a ব্যবহার করুন। বিকল্প 1 এর মতো প্রক্রিয়াটির আউটপুট পার্স করুন।
  3. Iphlpapi.dll এ সেন্ডারপ করতে ভয়ঙ্কর নিয়ন্ত্রণহীন কল ব্যবহার করুন

আইটেমের নমুনা # 3 He ডাব্লুএমআই যদি ব্যবহারযোগ্য সমাধান না হয় তবে এটি সর্বোত্তম বিকল্প বলে মনে হচ্ছে:

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);
}

যেখানে dueণ আছে তা দেওয়ার জন্য, এই কোডটির ভিত্তি এটি: http://www.pinvoke.net/default.aspx/iphlpapi.sendarp#


আমি ওপি হিসাবে একই জিনিসটি সন্ধান করছিলাম এবং এটি আমার প্রয়োজন ঠিক জিনিস!
কুইউহ্যামার

বিকল্প 1 এবং 2 এর মধ্যে, আপনি উইন্ডোজ মেশিনে থাকলে লিনাক্স বা ম্যাকের সমতুল্য কমান্ডটি ডস কমান্ড বলতে চাইছেন, তাই না?
রাইকোল আমারো

8

আমরা সর্বনিম্ন মেট্রিকের সাথে ইন্টারফেসের ম্যাক ঠিকানা পেতে ডাব্লুএমআই ব্যবহার করি, উদাহরণস্বরূপ ইন্টারফেস উইন্ডোজগুলি এটি পছন্দ করতে পছন্দ করবে:

public static string GetMACAddress()
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
    IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
    string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
    return mac;
}

বা সিলভারলাইটে (উন্নত বিশ্বাসের প্রয়োজন):

public static string GetMACAddress()
{
    string mac = null;
    if ((Application.Current.IsRunningOutOfBrowser) && (Application.Current.HasElevatedPermissions) && (AutomationFactory.IsAvailable))
    {
        dynamic sWbemLocator = AutomationFactory.CreateObject("WbemScripting.SWBemLocator");
        dynamic sWbemServices = sWbemLocator.ConnectServer(".");
        sWbemServices.Security_.ImpersonationLevel = 3; //impersonate

        string query = "SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true";
        dynamic results = sWbemServices.ExecQuery(query);

        int mtu = int.MaxValue;
        foreach (dynamic result in results)
        {
            if (result.IPConnectionMetric < mtu)
            {
                mtu = result.IPConnectionMetric;
                mac = result.MACAddress;
            }
        }
    }
    return mac;
}

7
public static PhysicalAddress GetMacAddress()
{
    var myInterfaceAddress = NetworkInterface.GetAllNetworkInterfaces()
        .Where(n => n.OperationalStatus == OperationalStatus.Up && n.NetworkInterfaceType != NetworkInterfaceType.Loopback)
        .OrderByDescending(n => n.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
        .Select(n => n.GetPhysicalAddress())
        .FirstOrDefault();

    return myInterfaceAddress;
}

আমি যদি এই কোডটি চালিত করি তবে এটি কি অ্যাপ্লিকেশনটি চালাচ্ছে তার ঠিকানা পাবে? মানে এটি সার্ভারের আইপি ঠিকানাটি পাবেন না যেখানে এটি হোস্ট করা আছে, সঠিক?
নেট পোষা

এটি হোস্ট মেশিন, সার্ভারের ম্যাক ঠিকানা পায়।
টনি

6

আইএমএইচও প্রথম ম্যাক ঠিকানা ফিরে আসা ভাল ধারণা নয়, বিশেষত যখন ভার্চুয়াল মেশিনগুলি হোস্ট করা হয়। সুতরাং আমি প্রেরণ / প্রাপ্ত বাইট যোগফল যাচাই করি এবং সর্বাধিক ব্যবহৃত সংযোগটি নির্বাচন করি, এটি নিখুঁত নয়, তবে সঠিক 9-10 বার হওয়া উচিত।

public string GetDefaultMacAddress()
{
    Dictionary<string, long> macAddresses = new Dictionary<string, long>();
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
            macAddresses[nic.GetPhysicalAddress().ToString()] = nic.GetIPStatistics().BytesSent + nic.GetIPStatistics().BytesReceived;
    }
    long maxValue = 0;
    string mac = "";
    foreach(KeyValuePair<string, long> pair in macAddresses)
    {
        if (pair.Value > maxValue)
        {
            mac = pair.Key;
            maxValue = pair.Value;
        }
    }
    return mac;
}

6

এই পদ্ধতিটি নির্দিষ্ট ইউআরএল এবং পোর্টের সাথে সংযোগ করতে ব্যবহৃত নেটওয়ার্ক ইন্টারফেসের ম্যাক ঠিকানা নির্ধারণ করবে।

এখানে সমস্ত উত্তর এই লক্ষ্য অর্জনে সক্ষম নয়।

আমি এই উত্তরটি কয়েক বছর আগে (২০১৪ সালে) লিখেছি। তাই আমি এটিকে কিছুটা "ফেস লিফট" দেওয়ার সিদ্ধান্ত নিয়েছি। আপডেট বিভাগ দেখুন

    /// <summary>
    /// Get the MAC of the Netowrk Interface used to connect to the specified url.
    /// </summary>
    /// <param name="allowedURL">URL to connect to.</param>
    /// <param name="port">The port to use. Default is 80.</param>
    /// <returns></returns>
    private static PhysicalAddress GetCurrentMAC(string allowedURL, int port = 80)
    {
        //create tcp client
        var client = new TcpClient();

        //start connection
        client.Client.Connect(new IPEndPoint(Dns.GetHostAddresses(allowedURL)[0], port));

        //wai while connection is established
        while(!client.Connected)
        {
            Thread.Sleep(500);
        }

        //get the ip address from the connected endpoint
        var ipAddress = ((IPEndPoint)client.Client.LocalEndPoint).Address;

        //if the ip is ipv4 mapped to ipv6 then convert to ipv4
        if(ipAddress.IsIPv4MappedToIPv6)
            ipAddress = ipAddress.MapToIPv4();        

        Debug.WriteLine(ipAddress);

        //disconnect the client and free the socket
        client.Client.Disconnect(false);
        
        //this will dispose the client and close the connection if needed
        client.Close();

        var allNetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

        //return early if no network interfaces found
        if(!(allNetworkInterfaces?.Length > 0))
            return null;

        foreach(var networkInterface in allNetworkInterfaces)
        {
            //get the unicast address of the network interface
            var unicastAddresses = networkInterface.GetIPProperties().UnicastAddresses;
           
            //skip if no unicast address found
            if(!(unicastAddresses?.Count > 0))
                continue;

            //compare the unicast addresses to see 
            //if any match the ip address used to connect over the network
            for(var i = 0; i < unicastAddresses.Count; i++)
            {
                var unicastAddress = unicastAddresses[i];

                //this is unlikely but if it is null just skip
                if(unicastAddress.Address == null)
                    continue;
                
                var ipAddressToCompare = unicastAddress.Address;

                Debug.WriteLine(ipAddressToCompare);

                //if the ip is ipv4 mapped to ipv6 then convert to ipv4
                if(ipAddressToCompare.IsIPv4MappedToIPv6)
                    ipAddressToCompare = ipAddressToCompare.MapToIPv4();

                Debug.WriteLine(ipAddressToCompare);

                //skip if the ip does not match
                if(!ipAddressToCompare.Equals(ipAddress))
                    continue;

                //return the mac address if the ip matches
                return networkInterface.GetPhysicalAddress();
            }
              
        }

        //not found so return null
        return null;
    }

এটিকে কল করতে আপনাকে এই জাতীয় সংযোগের জন্য একটি URL পাস করতে হবে:

var mac = GetCurrentMAC("www.google.com");

আপনি একটি পোর্ট নম্বর নির্দিষ্ট করতে পারেন। নির্দিষ্ট না হলে ডিফল্ট 80 হয়।

আপডেট:

2020

  • কোড ব্যাখ্যা করার জন্য মন্তব্য যুক্ত করা হয়েছে।
  • নতুন অপারেটিং সিস্টেমগুলির সাথে ব্যবহারের জন্য সংশোধন করা হয়েছে যা আইপিভি 4 ম্যাপযুক্ত আইপিভি 4 ব্যবহার করে (উইন্ডোজ 10 এর মতো)।
  • কমেছে বাসা বাঁধে।
  • কোডটি "var" ব্যবহার করে আপগ্রেড করা হয়েছে।

1
এটি অত্যন্ত আকর্ষণীয়, আমি এটি চেষ্টা করব, যেমনটি আমার ক্ষেত্রে আমি ক্লায়েন্টকে আবিষ্কার করতে চাই) আমার সার্ভারের সাথে যোগাযোগ করার জন্য উত্স ঠিকানাটি (এটি অগত্যা ইন্টারনেটে হবে না) এবং খ) ম্যাকের ঠিকানাটি এনআইসির যা এই আইপি ঠিকানাটি সরবরাহ করছে ...
ব্রায়ান বি

5

আপনি এনআইসি আইডির জন্য যেতে পারেন:

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

এটি ম্যাক ঠিকানা নয়, এটি যদি আপনি খুঁজছেন তবে এটি একটি অনন্য সনাক্তকারী।


2

আমি সর্বনিম্ন আইপি সংযোগ মেট্রিকের সাথে অ্যাভির সমাধানটি পছন্দ করি! তবে যদি একই মেট্রিকের সাথে একটি দ্বিতীয় এনইস ইনস্টল করা হয় তবে ম্যাকের তুলনাটি ব্যর্থ হতে পারে ...

ম্যাকের সাথে ইন্টারফেসের বিবরণ সংরক্ষণ করা ভাল। পরের তুলনায় আপনি এই স্ট্রিং দ্বারা সঠিক নিক সনাক্ত করতে পারেন। এখানে একটি নমুনা কোড রয়েছে:

   public static string GetMacAndDescription()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
        IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
        string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
        string description = (from o in objects orderby o["IPConnectionMetric"] select o["Description"].ToString()).FirstOrDefault();
        return mac + ";" + description;
    }

    public static string GetMacByDescription( string description)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
        IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
        string mac = (from o in objects where o["Description"].ToString() == description select o["MACAddress"].ToString()).FirstOrDefault();
        return mac;
    }

2

ধরা যাক আমার 192c68.0.182 এর স্থানীয় আইপি ব্যবহার করে আমার একটি টিসিপি সংযোগ রয়েছে। তারপরে যদি আমি সেই এনআইসির ম্যাক ঠিকানা জানতে চাই তবে আমি মেথোডকে এইভাবে ডাকব:GetMacAddressUsedByIp("192.168.0.182")

public static string GetMacAddressUsedByIp(string ipAddress)
    {
        var ips = new List<string>();
        string output;

        try
        {
            // Start the child process.
            Process p = new Process();
            // Redirect the output stream of the child process.
            p.StartInfo.UseShellExecute = false;

            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.FileName = "ipconfig";
            p.StartInfo.Arguments = "/all";
            p.Start();
            // Do not wait for the child process to exit before
            // reading to the end of its redirected stream.
            // p.WaitForExit();
            // Read the output stream first and then wait.
            output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

        }
        catch
        {
            return null;
        }

        // pattern to get all connections
        var pattern = @"(?xis) 
(?<Header>
     (\r|\n) [^\r]+ :  \r\n\r\n
)
(?<content>
    .+? (?= ( (\r\n\r\n)|($)) )
)";

        List<Match> matches = new List<Match>();

        foreach (Match m in Regex.Matches(output, pattern))
            matches.Add(m);

        var connection = matches.Select(m => new
        {
            containsIp = m.Value.Contains(ipAddress),
            containsPhysicalAddress = Regex.Match(m.Value, @"(?ix)Physical \s Address").Success,
            content = m.Value
        }).Where(x => x.containsIp && x.containsPhysicalAddress)
        .Select(m => Regex.Match(m.content, @"(?ix)  Physical \s address [^:]+ : \s* (?<Mac>[^\s]+)").Groups["Mac"].Value).FirstOrDefault();

        return connection;
    }

এটি দক্ষ নয় ... আমি এটি করার পরামর্শ দেব না।
ইভান্দ্রো আইজি জাও

2

এই পুরাতন পোস্টটি খনন করতে সত্যিই ঘৃণা হচ্ছে তবে আমি মনে করি যে প্রশ্নটি উইন্ডোজ 8-10-তে নির্দিষ্ট অন্য একটি উত্তরের দাবিদার।

উইন্ডোজ. নেটওয়ার্কিং থেকে নেটওয়ার্কআইফর্মেশন.কনেক্টিভিটি নেমস্পেস ব্যবহার করে আপনি যে নেটওয়ার্ক অ্যাডাপ্টার উইন্ডো ব্যবহার করছেন তার আইডি পাবেন। তারপরে আপনি পূর্বে উল্লিখিত গেটএলনেটওয়ার্কইন্টারফেসগুলি () থেকে ইন্টারফেস MAC ঠিকানা পেতে পারেন।

এটি উইন্ডোজ স্টোর অ্যাপ্লিকেশনগুলিতে সিস্টেমে নেটওয়ার্ক ইন্টারফেস হিসাবে কাজ করবে না.নেটওয়ার্ক নেটফরমেশনটি গেটএলনেটওয়ার্কইন্টারফেসগুলি প্রকাশ করে না।

string GetMacAddress()
{
    var connectionProfile = NetworkInformation.GetInternetConnectionProfile();
    if (connectionProfile == null) return "";

    var inUseId = connectionProfile.NetworkAdapter.NetworkAdapterId.ToString("B").ToUpperInvariant();
    if(string.IsNullOrWhiteSpace(inUseId)) return "";

    var mac = NetworkInterface.GetAllNetworkInterfaces()
        .Where(n => inUseId == n.Id)
        .Select(n => n.GetPhysicalAddress().GetAddressBytes().Select(b=>b.ToString("X2")))
        .Select(macBytes => string.Join(" ", macBytes))
        .FirstOrDefault();

    return mac;
}

2
string mac = "";
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {

                if (nic.OperationalStatus == OperationalStatus.Up && (!nic.Description.Contains("Virtual") && !nic.Description.Contains("Pseudo")))
                {
                    if (nic.GetPhysicalAddress().ToString() != "")
                    {
                        mac = nic.GetPhysicalAddress().ToString();
                    }
                }
            }
MessageBox.Show(mac);

2
কোডটি কী করে এবং কীভাবে এটি সমস্যার সমাধান করে তার সংক্ষিপ্ত বিবরণ দিয়ে এই উত্তরটির উন্নতি করা যেতে পারে।
গ্রেগ দ্য অবিশ্বাস্য

1

তার কোডটি কিছুটা ব্ল্যাক 3 আর পরিবর্তন করা হয়েছে। একই গতির সাথে আপনার দুটি অ্যাডাপ্টার রয়েছে। ম্যাক অনুসারে বাছাই করুন, যাতে আপনি সর্বদা একই মান পান।

public string GetMacAddress()
{
    const int MIN_MAC_ADDR_LENGTH = 12;
    string macAddress = string.Empty;
    Dictionary<string, long> macPlusSpeed = new Dictionary<string, long>();
    try
    {
        foreach(NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            System.Diagnostics.Debug.WriteLine("Found MAC Address: " + nic.GetPhysicalAddress() + " Type: " + nic.NetworkInterfaceType);

            string tempMac = nic.GetPhysicalAddress().ToString();

            if(!string.IsNullOrEmpty(tempMac) && tempMac.Length >= MIN_MAC_ADDR_LENGTH)
                macPlusSpeed.Add(tempMac, nic.Speed);
        }

        macAddress = macPlusSpeed.OrderByDescending(row => row.Value).ThenBy(row => row.Key).FirstOrDefault().Key;
    }
    catch{}

    System.Diagnostics.Debug.WriteLine("Fastest MAC address: " + macAddress);

    return macAddress;
}


0

ipconfig.exeসহ বিভিন্ন ডিএলএল ব্যবহার বাস্তবায়িত হয় iphlpapi.dll... এর জন্য Googling iphlpapiদুটিই MSDN মধ্যে নথিভুক্ত একটি সংশ্লিষ্ট Win32 এপিআই প্রকাশ করে।


0

এটা চেষ্টা কর:

    /// <summary>
    /// returns the first MAC address from where is executed 
    /// </summary>
    /// <param name="flagUpOnly">if sets returns only the nic on Up status</param>
    /// <returns></returns>
    public static string[] getOperationalMacAddresses(Boolean flagUpOnly)
    {
        string[] macAddresses = new string[NetworkInterface.GetAllNetworkInterfaces().Count()];

        int i = 0;
        foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            if (nic.OperationalStatus == OperationalStatus.Up || !flagUpOnly)
            {
                macAddresses[i] += ByteToHex(nic.GetPhysicalAddress().GetAddressBytes());
                //break;
                i++;
            }
        }
        return macAddresses;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.