如何用.NET Core程序化禁用WiFi网络中的陌生接入设备?
基于.NET Core的同WiFi陌生设备拦截方案
核心思路说明
普通客户端设备无法直接管控WiFi路由器的接入权限,必须依托路由器的管理接口实现设备拉黑。整体流程为:
- 验证当前设备是否连接目标WiFi网络
- 扫描局域网内所有活跃设备,获取IP/MAC/主机名信息
- 对比预设的信任设备列表,识别陌生设备
- 通过路由器管理接口将陌生设备MAC地址加入黑名单
一、.NET Core原生实现方案
1. 扫描局域网活跃设备
通过ARP命令解析缓存,结合ICMP Ping发现在线设备(需管理员权限):
using System; using System.Collections.Generic; using System.Diagnostics; using System.Net; using System.Net.NetworkInformation; public class NetworkScanner { public static List<DeviceInfo> ScanLocalNetwork(string subnetPrefix) { var devices = new List<DeviceInfo>(); // 遍历子网内IP段(如192.168.1.1~254) for (int i = 1; i <= 254; i++) { string ip = $"{subnetPrefix}.{i}"; try { // Ping检测设备是否在线 var pingReply = new Ping().Send(ip, 100); if (pingReply.Status != IPStatus.Success) continue; // 获取MAC地址 string mac = GetMacAddress(ip); // 获取主机名 string hostname = GetHostname(ip); devices.Add(new DeviceInfo { IpAddress = ip, MacAddress = mac ?? "Unknown", Hostname = hostname ?? "Unknown" }); } catch { } } return devices; } private static string GetMacAddress(string ip) { // 调用系统arp命令解析缓存 var process = new Process { StartInfo = new ProcessStartInfo("arp", "-a") { RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true } }; process.Start(); string output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); foreach (var line in output.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries)) { if (line.Contains(ip)) { var parts = line.Split(' ', StringSplitOptions.RemoveEmptyEntries); return parts.Length >= 2 ? parts[1] : null; } } return null; } private static string GetHostname(string ip) { try { return Dns.GetHostEntry(ip).HostName; } catch { return null; } } } public class DeviceInfo { public string IpAddress { get; set; } public string MacAddress { get; set; } public string Hostname { get; set; } }
2. 验证当前WiFi连接状态
确认设备已连接目标WiFi网络:
using System.Diagnostics; using System.Net.NetworkInformation; public static bool IsConnectedToTargetWifi(string targetSsid) { foreach (var networkInterface in NetworkInterface.GetAllNetworkInterfaces()) { if (networkInterface.NetworkInterfaceType != NetworkInterfaceType.Wireless80211 || networkInterface.OperationalStatus != OperationalStatus.Up) continue; // 调用netsh命令获取当前连接的SSID var process = new Process { StartInfo = new ProcessStartInfo("netsh", "wlan show interfaces") { RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true } }; process.Start(); string output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); if (output.Contains($"SSID : {targetSsid}")) return true; } return false; }
3. 通过路由器接口拉黑设备
以常见TP-Link路由器为例(需提前获取路由器IP、管理员账号密码):
using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; public class RouterDeviceManager { private readonly string _routerIp; private readonly string _adminUser; private readonly string _adminPwd; private string _authToken; public RouterDeviceManager(string routerIp, string adminUser, string adminPwd) { _routerIp = routerIp; _adminUser = adminUser; _adminPwd = adminPwd; } // 登录路由器获取授权Token public async Task LoginAsync() { var loginPayload = new { username = _adminUser, password = _adminPwd }; var jsonContent = new StringContent( JsonSerializer.Serialize(loginPayload), System.Text.Encoding.UTF8, "application/json"); using var client = new HttpClient(); var response = await client.PostAsync($"http://{_routerIp}/api/login", jsonContent); var responseData = JsonSerializer.Deserialize<LoginResponse>(await response.Content.ReadAsStringAsync()); _authToken = responseData?.Token; } // 将指定MAC地址设备加入黑名单 public async Task BlockDeviceAsync(string macAddress) { if (string.IsNullOrEmpty(_authToken)) await LoginAsync(); var blockPayload = new { mac = macAddress, enabled = true }; var jsonContent = new StringContent( JsonSerializer.Serialize(blockPayload), System.Text.Encoding.UTF8, "application/json"); using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {_authToken}"); await client.PostAsync($"http://{_routerIp}/api/access-control/block", jsonContent); } } public class LoginResponse { public string Token { get; set; } }
二、.NET Core调用PowerShell替代方案
1. PowerShell扫描设备脚本(scan-devices.ps1)
param($subnetPrefix) $devices = @() for ($i=1; $i -le 254; $i++) { $ip = "$subnetPrefix.$i" if (Test-Connection -ComputerName $ip -Count 1 -Quiet -ErrorAction SilentlyContinue) { $mac = (Get-NetNeighbor -IPAddress $ip -ErrorAction SilentlyContinue).LinkLayerAddress $hostname = try { [System.Net.Dns]::GetHostEntry($ip).HostName } catch { "Unknown" } $devices += [PSCustomObject]@{ IpAddress = $ip MacAddress = $mac ?? "Unknown" Hostname = $hostname } } } $devices | ConvertTo-Json
2. .NET Core调用PowerShell执行扫描
using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Text.Json; public static List<DeviceInfo> ScanWithPowerShell(string subnetPrefix) { var script = File.ReadAllText("scan-devices.ps1"); using var runspace = RunspaceFactory.CreateRunspace(); runspace.Open(); using var pipeline = runspace.CreatePipeline(); pipeline.Commands.AddScript(script); pipeline.Commands.AddArgument(subnetPrefix); var results = pipeline.Invoke(); runspace.Close(); var jsonResult = results[0].ToString(); return JsonSerializer.Deserialize<List<DeviceInfo>>(jsonResult); }
关键注意事项
- 权限要求:局域网扫描需管理员权限,路由器管理需知晓管理员账号密码
- 路由器兼容性:不同品牌/型号的路由器管理接口差异极大,需针对性适配
- 信任列表维护:需预先录入合法设备的MAC地址,避免误拦截
- WiFi密码作用:仅用于验证当前设备是否在目标网络,与路由器管理权限无关
内容的提问来源于stack exchange,提问作者Selaka Nanayakkara
相关产品推荐
相关产品推荐

