2013-04-01 16 views
6

Ich habe ein Problem, bei dem ich eine Karte aktivieren muss, die bereits deaktiviert wurde, und ein Sucher auf WMI NetworkAdapter gibt das Objekt nicht zurück.Verwendung von C# zum Aktivieren einer deaktivierten drahtlosen Netzwerkkarte

Ich kann mir eine Möglichkeit vorstellen, dies zu tun, aber ich konnte es nicht zum Laufen bringen, das heißt, ein ManagementObject zu erstellen, das dies als Konstruktornamen verwendet. aber dies führt nur Ausnahmen

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

Der andere Weg, um eine netsh und ermöglicht es das Gerät, zu Shell war, die Art von hässlich ist, oder shell32/dll „Enable“ verwenden, um das gleiche, wieder zu tun, die beide nur den Namen übergeben. Ich habe den Namen von einem Registry-Scan auf HKLM\SYSTEM\CurrentControlSet\Network erhalten und nach MediaType = 2 gesucht, um eine String-Liste von Wireless-Geräten zu erhalten. Alles ist gut, wenn ich die Anwendung ausführen, während der Adapter aktiviert ist, wie ich das NetworkObject für das drahtlose Gerät abrufen kann, aber es fällt alles um, wenn die Anwendung gestartet wird, während das drahtlose Gerät deaktiviert ist.

Dank

Edit:. Dies ist der Code, den ich lieben würde, aber nicht gehen :(im Wesentlichen #, um die WMI und Win32_NetworkAdapter Klasse zu nutzen, wird unter Verwendung von C

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

Antwort

1

Diese Methode zu arbeiten sollte es gebaut Methoden in:

  • aktivieren
  • Disable

So können Sie Ihren Befehl auf einer ausgewählten Schnittstelle ausführen.

Sie, dass auf diese Weise erreichen können:

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

Es gibt eine blog that actually outlines such a task; Es definiert, wie ein Wrapper um die WMI-Klasse erstellt wird.

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

Hoffentlich, dass eine dieser Möglichkeiten helfen ..

+1

Danke für die Antwort! Was ich nicht tun kann, ist, einen Adapter zu aktivieren, der deaktiviert ist, da eine Suche für ein deaktiviertes Gerät nichts zurückgibt. Das Gerät zu deaktivieren ist wirklich einfach, aber ein Gerät zu aktivieren, für das man das Objekt nicht bekommen kann, ist das, mit dem ich Probleme habe. Idealerweise ist dies, was ich versuche zu arbeiten – pedigree

+0

Nun, wenn Sie diese genaue Schnittstelle abfragen, sollte es Ihnen ermöglichen, in der 'enable' Methode zu implementieren. Tut es nicht, wenn ich es versuche - es funktioniert. – Greg

+0

@Grey - Haben Sie Ihre drahtlose Verbindung (im Gerätemanager) vor dem Anruf deaktiviert? Wenn ja, auf welches OS/.NET zielen Sie? – 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

Ich glaube, einige Erklärung des Codes wäre sehr hilfreich – olyv

Verwandte Themen