첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ 현재 네트워크 인터페이스의 MAC 주소를 변경하는 방법을 보여준다. 현재 네트워크 인터페이스를 구하고 해당 인터페이스에 대한 레지스트리를 변경한 다음 WMI를 이용해 네트워크 장치를 재활성화함으로써 변경한 MAC 주소가 적용되도록 한다.

TestProject.zip
0.00MB

▶ Program.cs

using System;
using System.Management;
using System.Net.NetworkInformation;
using System.Text.RegularExpressions;
using System.Threading;

using Microsoft.Win32;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 현재 네트워크 인터페이스 구하기 - GetCurrentNetworkInterface()

        /// <summary>
        /// 현재 네트워크 인터페이스 구하기
        /// </summary>
        /// <returns>현재 네트워크 인터페이스</returns>
        private static NetworkInterface GetCurrentNetworkInterface()
        {
            NetworkInterface[] networkInterfaceArray = NetworkInterface.GetAllNetworkInterfaces();

            int networkInterfaceArrayLength = networkInterfaceArray.Length;

            for(int i = 0; i < networkInterfaceArrayLength; i++)
            {
                NetworkInterface networkInterface = networkInterfaceArray[i];

                if
                (
                    networkInterface.OperationalStatus    == OperationalStatus.Up               &&
                    networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback      &&
                    networkInterface.NetworkInterfaceType != NetworkInterfaceType.Tunnel        &&
                    networkInterface.NetworkInterfaceType != NetworkInterfaceType.Wireless80211 &&
                    !networkInterface.Name.ToLower().Contains("loopback")                       &&
                    !networkInterface.Name.Contains("SAMSUNG")
                )
                {
                    return networkInterface;
                }
            }

            return null;
        }

        #endregion
        #region MAC 주소 설정하기 - SetMACAddress(networkInterface, macAddress)

        /// <summary>
        /// MAC 주소 설정하기
        /// </summary>
        /// <param name="networkInterface">네트워크 인터페이스</param>
        /// <param name="macAddress">MAC 주소 (예 : "FCAA1472FBD2")</param>
        private static void SetMACAddress(NetworkInterface networkInterface, string macAddress)
        {
            string networkInterfaceID = networkInterface.Id;

            using
            (
                RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SYSTEM")
                                                               .OpenSubKey("CurrentControlSet")
                                                               .OpenSubKey("Control")
                                                               .OpenSubKey("Class")
                                                               .OpenSubKey("{4d36e972-e325-11ce-bfc1-08002be10318}")
            )
            {
                string[] subsidaryKeyNameArray = registryKey.GetSubKeyNames();

                foreach(string subsidaryKeyName in subsidaryKeyNameArray)
                {
                    if(!Regex.IsMatch(subsidaryKeyName, @"\d{4}"))
                    {
                        continue;
                    }

                    using(RegistryKey subsidaryRegistryKey = registryKey.OpenSubKey(subsidaryKeyName, true))
                    {
                        object instanceID = subsidaryRegistryKey.GetValue("NetCfgInstanceId");

                        if(instanceID?.Equals(networkInterfaceID) == true)
                        {
                            subsidaryRegistryKey.SetValue("NetworkAddress", macAddress);

                            using
                            (
                                RegistryKey networkAddressRegistryKey = subsidaryRegistryKey.OpenSubKey("Ndi", true)
                                                                                            .OpenSubKey("Params", true)
                                                                                            .OpenSubKey("NetworkAddress", true)
                            )
                            {
                                networkAddressRegistryKey.SetValue(string.Empty, macAddress);

                                networkAddressRegistryKey.SetValue("Param Desc", "Network Address");
                            }
                        }
                    }
                }
            }
        }

        #endregion
        #region 네트워크 인터페이스 리로드하기 - ReloadNetworkInterfaec(networkInterface)

        /// <summary>
        /// 네트워크 인터페이스 리로드하기
        /// </summary>
        /// <param name="networkInterface">네트워크 인터페이스</param>
        private static void ReloadNetworkInterfaec(NetworkInterface networkInterface)
        {
            SelectQuery selectQuery = new SelectQuery($"SELECT * FROM Win32_NetworkAdapter WHERE GUID='{networkInterface.Id}'");

            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(selectQuery);

            foreach(ManagementBaseObject managementBaseObject in managementObjectSearcher.Get())
            {
                ManagementObject managementObject = managementBaseObject as ManagementObject;

                managementObject.InvokeMethod("Disable", null);

                while(GetCurrentNetworkInterface() != null)
                {
                    Thread.Sleep(1000);
                }

                managementObject.InvokeMethod("Enable", null);

                while(GetCurrentNetworkInterface() == null)
                {
                    Thread.Sleep(1000);
                }
            }
        }

        #endregion
        #region 프로그램 시작하기 -  Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        private static void Main()
        {
            NetworkInterface networkInterface1 = GetCurrentNetworkInterface();

            Console.WriteLine($"이전 MAC 주소 : {networkInterface1.GetPhysicalAddress()}");

            SetMACAddress(networkInterface1, "FCAA1472FBD2"); // FC-AA-14-72-FB-D2

            ReloadNetworkInterfaec(networkInterface1);

            NetworkInterface networkInterface2 = GetCurrentNetworkInterface();

            Console.WriteLine($"현재 MAC 주소 : {networkInterface2.GetPhysicalAddress()}");

            Console.ReadKey(false);
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요