■ 현재 네트워크 인터페이스의 MAC 주소를 변경하는 방법을 보여준다. 현재 네트워크 인터페이스를 구하고 해당 인터페이스에 대한 레지스트리를 변경한 다음 WMI를 이용해 네트워크 장치를 재활성화함으로써 변경한 MAC 주소가 적용되도록 한다.
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
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 } } |