protected void btnGetServerIP_Click(object sender, EventArgs e)
{
IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName());
// 過濾 IPv4 位址
var ipv4List = addresses.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).ToList();
if (ipv4List.Count > 0)
txtPrimaryIP.Text = ipv4List[0].ToString();
if (ipv4List.Count > 1)
txtSecondaryIP.Text = ipv4List[1].ToString();
else
txtSecondaryIP.Text = "無第二張網卡 IPv4";
}
注意:Dns.GetHostByName 已過時,改用 Dns.GetHostAddresses。
using System.Management;
public void GetServerIPAndMAC()
{
string mac = "", ip = "";
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true) // 只取已啟用 IP 的網卡
{
mac = mo["MACAddress"].ToString(); // 格式: 00:1A:2B:3C:4D:5E
string[] ips = (string[])mo["IPAddress"];
if (ips.Length > 0) ip = ips[0]; // 取第一個 IP
break; // 通常只需第一張啟用網卡
}
}
txtMAC.Text = mac;
txtIP.Text = ip;
}
需參考 System.Management.dll,執行需管理員權限或 WMI 安全性設定。
string clientIP = Request.UserHostAddress; // 直接取得
// 或
string clientIP = Request.ServerVariables["REMOTE_ADDR"];
public string GetRealClientIP()
{
string ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ip))
{
// 可能多層 Proxy,取第一個 (原始客戶端)
return ip.Split(',')[0].Trim();
}
ip = Request.ServerVariables["HTTP_X_REAL_IP"]; // Nginx 常用
if (!string.IsNullOrEmpty(ip)) return ip;
return Request.UserHostAddress; // 回退
}
| 方案 | 可行性 | 限制 |
|---|---|---|
| ARP 協定 (SendARP API) | 同區域網路 | 跨路由器/閘道無效;需 P/Invoke iphlpapi.dll |
| WMI 查詢用戶端 | 極低 | 需用戶端開放 WMI、防火牆、權限,瀏覽器環境不可行 |
| ActiveX / Silverlight / Java Applet | 已淘汰 | 現代瀏覽器不支援,安全性極差 |
| DHCP 租約表 / 交換器 MAC 表 | 伺服器端基礎設施 | 需網管配合,非應用層可直接取得 |
public static class NetworkUtils
{
public static string GetServerPrimaryIPv4()
{
return Dns.GetHostAddresses(Dns.GetHostName())
.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork)?.ToString();
}
public static (string IP, string MAC) GetServerFirstEnabledNIC()
{
using (var mc = new ManagementClass("Win32_NetworkAdapterConfiguration"))
foreach (ManagementObject mo in mc.GetInstances())
{
if ((bool)mo["IPEnabled"])
{
var ips = (string[])mo["IPAddress"];
return (ips.Length > 0 ? ips[0] : "", mo["MACAddress"]?.ToString() ?? "");
}
}
return ("", "");
}
public static string GetClientRealIP(HttpRequest request)
{
var headers = new[] { "HTTP_X_FORWARDED_FOR", "HTTP_X_REAL_IP", "REMOTE_ADDR" };
foreach (var h in headers)
{
var val = request.ServerVariables[h];
if (!string.IsNullOrEmpty(val))
return h == "HTTP_X_FORWARDED_FOR" ? val.Split(',')[0].Trim() : val;
}
return request.UserHostAddress;
}
}
伺服器 IP/MAC 取得有標準 API (DNS/WMI) 可靠實現;用戶端 IP 需處理 Proxy 標頭;**用戶端 MAC 在瀏覽器 Web 應用中基本無法直接取得**,應改用裝置指紋、Cookie 或基礎設施層方案。切勿為了取得 MAC 引入 ActiveX 等高風險技術。