2009-03-27 6 views
18

J'ai une application écrite en C# qui doit pouvoir configurer les cartes réseau sous Windows. Je l'ai essentiellement à travers WMI, mais il y a quelques choses que je n'aime pas à propos de cette solution: parfois les paramètres ne semblent pas coller, et quand le câble réseau n'est pas branché, les erreurs sont renvoyées par le WMI méthodes, donc je ne peux pas dire si elles ont vraiment réussi ou non.Meilleure façon de configurer par programme les cartes réseau dans .NET

Je dois pouvoir configurer tous les paramètres disponibles via les connexions réseau - Propriétés - écrans TCP/IP.

Quelle est la meilleure façon de faire cela?

Répondre

21

Vous pouvez utiliser Process pour ignorer les commandes netsh pour définir toutes les propriétés dans les boîtes de dialogue réseau.

par exemple: Pour définir un ipaddress statique sur un adaptateur

netsh interface ip set address "Local Area Connection" static 192.168.0.10 255.255.255.0 192.168.0.1 1 

Pour définir à vous dhcp utiliseriez

netsh interface ip set address "Local Area Connection" dhcp 

Pour ce faire à partir de C# serait

Process p = new Process(); 
ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface ip set address \"Local Area Connection\" static 192.168.0.10 255.255.255.0 192.168.0.1 1"); 
p.StartInfo = psi; 
p.Start(); 

La mise en statique peut prendre plusieurs bonnes secondes, donc si vous en avez besoin, assurez-vous d'attendre pour le processus de sortie.

+0

Une idée de comment élever cette commande pour exécuter avec des autorisations d'administrateur? – Fuser97381

+0

Jetez un oeil à http://stackoverflow.com/questions/133379/elevating-process-privilege-programatically – PaulB

+0

Merci, vous êtes le meilleur. – Fuser97381

2

Je peux vous dire la façon dont les chevaux de Troie le font, après avoir à nettoyer après quelques-uns d'entre eux, est de définir les clés de registre sous HKEY_LOCAL_MACHINE. Les principaux sont ceux du DNS et cette approche est définitivement utilisée par quiconque a déjà été infecté et ne peut plus accéder à windowsupdate.com, mcafee.com, etc.

+0

"HKEY_LOCAL_MACHINE" ne restreint pas exactement vers le bas où trouver les clés qui comptent . Un peu plus de détails rendrait cette réponse utile. – mickeyf

0

avec l'aide des réponses @ paulb aider

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
Process p = new Process(); 
ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface ip set address " + nics[0].Name + " static 192.168." + provider_ip + "." + index + " 255.255.255.0 192.168." + provider_ip + ".1 1"); 
p.StartInfo = psi; 
p.StartInfo.Verb = "runas"; 
p.Start(); 
1

Avec mon code SetIpAddress et SetDHCP

/// <summary> 
    /// Sets the ip address. 
    /// </summary> 
    /// <param name="nicName">Name of the nic.</param> 
    /// <param name="ipAddress">The ip address.</param> 
    /// <param name="subnetMask">The subnet mask.</param> 
    /// <param name="gateway">The gateway.</param> 
    /// <param name="dns1">The DNS1.</param> 
    /// <param name="dns2">The DNS2.</param> 
    /// <returns></returns> 
    public static bool SetIpAddress(
     string nicName, 
     string ipAddress, 
     string subnetMask, 
     string gateway = null, 
     string dns1 = null, 
     string dns2 = null) 
    { 
     ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
     ManagementObjectCollection moc = mc.GetInstances(); 

     NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); 
     NetworkInterface networkInterface = interfaces.FirstOrDefault(x => x.Name == nicName); 
     string nicDesc = nicName; 

     if (networkInterface != null) 
     { 
      nicDesc = networkInterface.Description; 
     } 

     foreach (ManagementObject mo in moc) 
     { 
      if ((bool)mo["IPEnabled"] == true 
       && mo["Description"].Equals(nicDesc) == true) 
      { 
       try 
       { 
        ManagementBaseObject newIP = mo.GetMethodParameters("EnableStatic"); 

        newIP["IPAddress"] = new string[] { ipAddress }; 
        newIP["SubnetMask"] = new string[] { subnetMask }; 

        ManagementBaseObject setIP = mo.InvokeMethod("EnableStatic", newIP, null); 

        if (gateway != null) 
        { 
         ManagementBaseObject newGateway = mo.GetMethodParameters("SetGateways"); 

         newGateway["DefaultIPGateway"] = new string[] { gateway }; 
         newGateway["GatewayCostMetric"] = new int[] { 1 }; 

         ManagementBaseObject setGateway = mo.InvokeMethod("SetGateways", newGateway, null); 
        } 


        if (dns1 != null || dns2 != null) 
        { 
         ManagementBaseObject newDns = mo.GetMethodParameters("SetDNSServerSearchOrder"); 
         var dns = new List<string>(); 

         if (dns1 != null) 
         { 
          dns.Add(dns1); 
         } 

         if (dns2 != null) 
         { 
          dns.Add(dns2); 
         } 

         newDns["DNSServerSearchOrder"] = dns.ToArray(); 

         ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDns, null); 
        } 
       } 
       catch 
       { 
        return false; 
       } 
      } 
     } 

     return true; 
    } 

    /// <summary> 
    /// Sets the DHCP. 
    /// </summary> 
    /// <param name="nicName">Name of the nic.</param> 
    public static bool SetDHCP(string nicName) 
    { 
     ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
     ManagementObjectCollection moc = mc.GetInstances(); 

     NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); 
     NetworkInterface networkInterface = interfaces.FirstOrDefault(x => x.Name == nicName); 
     string nicDesc = nicName; 

     if (networkInterface != null) 
     { 
      nicDesc = networkInterface.Description; 
     } 

     foreach (ManagementObject mo in moc) 
     { 
      if ((bool)mo["IPEnabled"] == true 
       && mo["Description"].Equals(nicDesc) == true) 
      { 
       try 
       { 
        ManagementBaseObject newDNS = mo.GetMethodParameters("SetDNSServerSearchOrder"); 

        newDNS["DNSServerSearchOrder"] = null; 
        ManagementBaseObject enableDHCP = mo.InvokeMethod("EnableDHCP", null, null); 
        ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); 
       } 
       catch 
       { 
        return false; 
       } 
      } 
     } 

     return true; 
    } 
Questions connexes