如何使用C#启用已禁用的无线网卡

时间:2013-04-01 20:39:44

标签: c# networking wmi adapter

我遇到了一个问题,我需要启用已经禁用的卡,而WMI NetworkAdapter上的搜索器不会返回该对象。

我可以想到一种可能的方法来做到这一点,但是我无法让它工作,那就是使用它作为构造函数名创建一个managementObject。但这只会抛出异常

{\\.\root\CIMV2:Win32_NetworkAdapter.NetConnectionID='Wireless Network Connection'}

另一种方法是封装netsh并启用设备,这有点难看,或者使用shell32 / dll“启用”来执行相同操作,再次,只传递名称。我一直从HKLM\SYSTEM\CurrentControlSet\Network上的注册表扫描中获取名称,并查找MediaType = 2以获取无线设备的字符串列表。如果我在启用适配器的情况下运行应用程序,那么一切都很好,因为我可以获得无线设备的networkObject,但如果应用程序在无线设备被禁用时启动,则一切都会失败。

谢谢

编辑:这是我喜欢的代码,但没有去:(

using System;
using System.Management;
class Sample
{
    public static int Main(string[] args)
    {
        ManagementObject mObj = new ManagementObject("\\\\.\\root\\CIMV2:Win32_NetworkAdapter.NetConnectionID=\"Wireless Network Connection\"");
        mObj.InvokeMethod("Enable", null);
        return 0;
    }
}

2 个答案:

答案 0 :(得分:1)

此方法主要使用C#来利用WMI和Win32_NetworkAdapter类。它应该有内置的方法:

  • 启用
  • 禁用

因此,您可以在Selected接口上执行命令。

你可以通过这种方式实现这一目标:

SelectQuery query = new SelectQuery("Win32_NetworkAdapter", "NetConnectionStatus=2");
ManagementObjectSearcher search = new ManagementObjectSearcher(query);
foreach(ManagementObject result in search.Get())
{
    NetworkAdapter adapter = new NetworkAdapter(result);

    // Identify the adapter you wish to disable here. 
    // In particular, check the AdapterType and 
    // Description properties.

    // Here, we're selecting the LAN adapters.
    if (adapter.AdapterType.Equals("Ethernet 802.3")) 
    {
        adapter.Disable();
    }
}

有一个blog that actually outlines such a task;它定义了如何围绕WMI类创建一个包装器。

另一个solution may be to also use ControlService(advapi32)。

[DllImport("advapi32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool    ControlService(IntPtr hService, SERVICE_CONTROL dwControl, ref SERVICE_STATUS lpServiceStatus);

希望其中一种方式可以帮助..

答案 1 :(得分:0)

            using System;
            using System.Collections.Generic;
            using System.ComponentModel;
            using System.Data;
            using System.Drawing;
            using System.Linq;
            using System.Text;
            using System.Windows.Forms;
            using System.Diagnostics;
            using System.Security.Principal;

            namespace WifiRouter
            {
                public partial class Form1 : Form
                {
                    bool connect = false;
                    public Form1()
                    {

                        InitializeComponent();
                    }

                    public static bool IsAdmin()
                    {
                        WindowsIdentity id = WindowsIdentity.GetCurrent();
                        WindowsPrincipal p = new WindowsPrincipal(id);
                        return p.IsInRole(WindowsBuiltInRole.Administrator);
                    }
                    public void RestartElevated()
                    {
                        ProcessStartInfo startInfo = new ProcessStartInfo();
                        startInfo.UseShellExecute = true;
                        startInfo.CreateNoWindow = true;
                        startInfo.WorkingDirectory = Environment.CurrentDirectory;
                        startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                        startInfo.Verb = "runas";
                        try
                        {
                            Process p = Process.Start(startInfo);
                        }
                        catch
                        {

                        }

                        System.Windows.Forms.Application.Exit();
                    }
                    private void button1_Click(object sender, EventArgs e)
                    {
                        string ssid = textBox1.Text, key = textBox2.Text;
                        if (!connect)
                        {
                            if (String.IsNullOrEmpty(textBox1.Text))
                            {
                                MessageBox.Show("SSID cannot be left blank !",
                                "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                            else
                            {

                                if (textBox2.Text == null || textBox2.Text == "")
                                {
                                    MessageBox.Show("Key value cannot be left blank !",
                                    "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                }
                                else
                                {
                                    if (key.Length >= 6)
                                    {
                                        Hotspot(ssid, key, true);
                                        textBox1.Enabled = false;
                                        textBox2.Enabled = false;
                                        button1.Text = "Stop";
                                        connect = true;
                                    }
                                    else
                                    {
                                        MessageBox.Show("Key should be more then or Equal to 6 Characters !",
                                        "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                    }
                                }
                            }
                        }
                        else
                        {
                            Hotspot(null, null, false);
                            textBox1.Enabled = true;
                            textBox2.Enabled = true;
                            button1.Text = "Start";
                            connect = false;
                        }
                    }
                    private void Hotspot(string ssid, string key,bool status)
                    {
                        ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe");
                        processStartInfo.RedirectStandardInput = true;
                        processStartInfo.RedirectStandardOutput = true;
                        processStartInfo.CreateNoWindow = true;
                        processStartInfo.UseShellExecute = false;
                        Process process = Process.Start(processStartInfo);

                        if (process != null)
                        {
                            if (status)
                            {
                                process.StandardInput.WriteLine("netsh wlan set hostednetwork mode=allow ssid=" + ssid + " key=" + key);
                                process.StandardInput.WriteLine("netsh wlan start hosted network");
                                process.StandardInput.Close();
                            }
                            else
                            {
                                process.StandardInput.WriteLine("netsh wlan stop hostednetwork");
                                process.StandardInput.Close();
                            }
                        }
                    }

                    private void Form1_Load(object sender, EventArgs e)
                    {
                        if (!IsAdmin())
                        {
                            RestartElevated();
                        }
                    }

                    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
                    {
                        Hotspot(null, null, false);
                        Application.Exit();
                    }
                }
            }