728x90
반응형
728x170
■ 현재 네트워크 인터페이스의 MAC 주소를 변경하는 방법을 보여준다. 현재 네트워크 인터페이스를 구하고 해당 인터페이스에 대한 레지스트리를 변경한 다음 WMI를 이용해 네트워크 장치를 재활성화함으로써 변경한 MAC 주소가 적용되도록 한다.
▶ 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
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] IEditableObject 인터페이스 사용하기 (0) | 2023.03.07 |
---|---|
[C#/COMMON] NetworkInterface 클래스 : GetAllNetworkInterfaces 정적 메소드를 사용해 현재 네트워크 인터페이스 구하기 (0) | 2023.02.21 |
[C#/COMMON/.NET6] Random 클래스 : NextBytes 메소드를 사용해 임의 MAC 주소 구하기 (0) | 2023.02.21 |
[C#/COMMON] AesCryptoServiceProvider 클래스 : 암호화/복호화 사용하기 (0) | 2022.11.06 |
[C#/COMMON] RTF 파서 사용하기 (0) | 2022.11.03 |
[C#/COMMON/.NET6] Stream 클래스 : CopyTo 메소드를 사용해 스트림에서 바이트 배열 구하기 (0) | 2022.10.24 |
[C#/COMMON/.NET6] MemoryStream 클래스 : Write 메소드를 사용해 스트림에서 바이트 배열 구하기 (0) | 2022.10.24 |
[C#/COMMON/.NET6] DateTime 구조체 : ParseExact 정적 메소드를 사용해 ISO 8601 날짜 포맷 문자열에서 DateTime 객체 구하기 (0) | 2022.10.24 |
[C#/COMMON/.NET6] DateTime 구조체 : Parse 정적 메소드를 사용해 ISO 8601 날짜 포맷 문자열에서 DateTime 객체 구하기 (0) | 2022.10.24 |
[C#/COMMON/.NET6] Process 클래스 : 부모 프로세스 종료시 자식 프로세스 종료시키기 (0) | 2022.10.24 |
댓글을 달아 주세요