2013-04-01 9 views
6

Mam problem, w którym muszę włączyć kartę, która została już wyłączona, a osoba wyszukująca w usłudze WMI NetworkAdapter nie zwraca obiektu.Jak używać języka C# do włączania wyłączonej karty sieci bezprzewodowej

Potrafię wymyślić możliwy sposób, aby to zrobić, ale nie byłem w stanie go uruchomić, to jest stworzyć obiekt zarządzania, używając tego jako nazwy konstruktora. ale to tylko generuje wyjątki

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

Innym sposobem było płaszcza netsh i włączyć urządzenie, które jest rodzaj brzydki, albo użyć shell32/dll „Enable”, aby zrobić to samo, znowu, zarówno przekazując tylko imię. Otrzymałem nazwę ze skanowania rejestru pod numerem HKLM\SYSTEM\CurrentControlSet\Network i szukałem MediaType = 2, aby uzyskać listę ciągów urządzeń bezprzewodowych. Wszystko działa dobrze, jeśli uruchomię aplikację, gdy adapter jest włączony, ponieważ mogę uzyskać obiekt networkObject dla urządzenia bezprzewodowego, ale wszystko przewraca się, jeśli aplikacja zostanie uruchomiona, gdy urządzenie bezprzewodowe zostanie wyłączone.

Dzięki

Edit. Jest to kod, który chciałbym, aby pracować, ale nie idą :(

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; 
    } 
} 

Odpowiedz

1

Metoda ta w istocie jest przy użyciu C#, aby wykorzystać WMI i Win32_NetworkAdapter Class Należy mieć sposoby na wbudowane w:

  • Włącz
  • Wyłącz

Możesz więc wykonać polecenie w Wybranym interfejsie.

Można to osiągnąć w ten sposób:

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(); 
    } 
} 

Jest blog that actually outlines such a task; określa sposób tworzenia Wrappera wokół klasy WMI.

Kolejny solution may be to also use z 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); 

Mam nadzieję, że jeden z tych sposobów pomóc ..

+1

Dzięki za odpowiedź! To, co wydaje mi się nie mieć, to Włącz adapter, który jest wyłączony, ponieważ wyszukiwanie nie zwraca niczego dla wyłączonego urządzenia. Wyłączenie urządzenia jest naprawdę łatwe, ale włączenie urządzenia, na które nie można uzyskać obiektu, jest tym, z czym mam problem. Idealnie, to jest to, co próbuję dostać do pracy – pedigree

+0

Cóż, jeśli zapytasz o ten dokładny interfejs, to powinno ci umożliwić implementację w metodzie 'enable'. Czy nie, kiedy próbuję - działa. – Greg

+0

@Grey - Czy masz połączenie bezprzewodowe (w menedżerze urządzeń) przed wywołaniem? Jeśli tak, to jaki OS/.NET celujesz? – pedigree

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(); 
        } 
       } 
      } 
+1

Wierzę, że niektóre wyjaśnienia kodu byłyby bardzo pomocne – olyv

Powiązane problemy