如何使用C#在Windows 8中禁用/启用网络

4

这份代码在Windows 7上运行良好,但在Windows 8上无法正常工作。有人知道原因吗?我不知道该怎么解决。

重新启动网络的功能

    private static void RestartNetWork()
    {
        string manage = "SELECT * FROM Win32_NetworkAdapter";
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(manage);
        ManagementObjectCollection collection = searcher.Get();
        List<string> netWorkList = new List<string>();
        foreach (ManagementObject obj in collection)
        {
            if (obj["Name"].ToString() == "Qualcomm Atheros AR5B97 Wireless Network Adapter")
            {                
                DisableNetWork(obj);//disable network
                Thread.Sleep(3000);
                EnableNetWork(obj);//enable network
                return;
            }
        }
    }

禁用网络的功能

/// <summary>
        /// 禁用网卡
        /// </summary>5
        /// <param name="netWorkName">网卡名</param>
        /// <returns></returns>
        private static bool DisableNetWork(ManagementObject network)
        {
            try
            {
                network.InvokeMethod("Disable", null);
                return true;
            }
            catch
            {
                return false;
            }
        }

启用网络的功能

/// <summary>
        /// 启用网卡
        /// </summary>
        /// <param name="netWorkName">网卡名</param>
        /// <returns></returns>
        private static bool EnableNetWork(ManagementObject network)
        {
            try
            {
                network.InvokeMethod("Enable", null);
                return true;
            }
            catch
            {
                return false;
            }
        }

InvokeMethod("Enable", null); 对我来说不起作用,我收到一个错误,说没有这样的方法...我做错了什么吗?但是 InvokeMethod("StartService", null, null); 对我来说很好用。 - mgrenier
只是补充一下我的评论,我正在运行Windows 2003 Server SP2。 - mgrenier
对我来说,无论是 InvokeMethod("Enable", null); 还是 InvokeMethod("StartService", null, null); 在 Windows 10 上都不起作用 :-( - Jeff
找到了解决方案。当我禁用适配器时,它从查询结果中消失了...需要进行新的SelectQuery来查找已禁用的适配器!即:Dim query As New SelectQuery("Win32_NetworkAdapter", "NetConnectionStatus=0")之后启用方法就可以工作了。 - Jeff
5个回答

2

我的代码在Windows 10中运行良好,因此我认为Win8也可以使用。但请记住,它需要管理员权限,请右键单击并选择以管理员身份运行。

以下是我的代码:

             if (manage["Name"].ToString() == "Realtek RTL8192DE Wireless LAN 802.11N PCI-E NIC MAC1")
             {
                 Console.WriteLine(manage["Name"].ToString() + "\n");

                     try
                     {  
                         //先enable再disable且要管理员权限执行
                         manage.InvokeMethod("Enable", null);
                         manage.InvokeMethod("Disable", null);
                         Console.WriteLine("设置成功");                         
                     }
                     catch
                     {
                         Console.WriteLine("设置失败");
                     }                 
             }
        }

2
假设您正在使用 Win32_NetworkAdapter WMI 类,请确保当前进程在 提升模式 下运行。此外,您可能希望避免像您现在所做的那样捕获每个异常,并分析可能抛出的最终异常,以获取其他详细信息。

1
我找到了我的评论的答案,并想分享给遇到类似问题的人... 而不是“启用”服务,我将启动模式更改为手动(如果您喜欢,也可以使用自动模式),这解决了我的问题。
ManagementBaseObject startMode = service.GetMethodParameters("ChangeStartMode");
startMode["startmode"] = "Manual";
service.InvokeMethod("ChangeStartMode", startMode, null);

这对我很有帮助!

0

0

我刚遇到了同样的问题。结果发现,当我在Windows 8中以管理员身份运行相同的应用程序时,一切都开始正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接