You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用.NET Core程序化禁用WiFi网络中的陌生接入设备?

基于.NET Core的同WiFi陌生设备拦截方案

核心思路说明

普通客户端设备无法直接管控WiFi路由器的接入权限,必须依托路由器的管理接口实现设备拉黑。整体流程为:

  1. 验证当前设备是否连接目标WiFi网络
  2. 扫描局域网内所有活跃设备,获取IP/MAC/主机名信息
  3. 对比预设的信任设备列表,识别陌生设备
  4. 通过路由器管理接口将陌生设备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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:09:58