2009-03-27 12 views
18

Tengo una aplicación escrita en C# que necesita poder configurar los adaptadores de red en Windows. Esto básicamente funciona a través de WMI, pero hay un par de cosas que no me gustan de esa solución: a veces las configuraciones no parecen pegarse, y cuando el cable de red no está enchufado, se devuelven los errores del WMI métodos, por lo que no puedo decir si realmente tuvieron éxito o no.La mejor manera de configurar programáticamente adaptadores de red en .NET

Necesito poder configurar todos los ajustes disponibles a través de las conexiones de red - Propiedades - Pantallas TCP/IP.

¿Cuál es la mejor manera de hacerlo?

Respuesta

21

Puede usar Process para desactivar comandos netsh para establecer todas las propiedades en los cuadros de diálogo de la red.

por ejemplo: Para establecer una dirección ip estática en un adaptador

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

para configurarlo a DHCP que tendría que utilizar

netsh interface ip set address "Local Area Connection" dhcp 

Para hacerlo desde C# sería

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 configuración estática puede tardar unos segundos en completarse, por lo que si es necesario, asegúrese de esperar para que el proceso salga

+0

¿Alguna idea de cómo elevar este comando para ejecutarlo con permisos de administrador? – Fuser97381

+0

Eche un vistazo a http://stackoverflow.com/questions/133379/elevating-process-privilege-programatically – PaulB

+0

Gracias, eres el mejor. – Fuser97381

2

Puedo decirle que la forma en que los troyanos lo hacen, después de tener que limpiar después de algunos de ellos, es establecer claves de registro en HKEY_LOCAL_MACHINE. Los principales que establecen son los de DNS y ese enfoque definitivamente se adhiere a cualquiera que haya sido infectado y ya no puede acceder a windowsupdate.com, mcafee.com etc.

+0

"HKEY_LOCAL_MACHINE" no limitar exactamente por dónde encontrar las llaves que importan . Un poco más de detalle haría esta respuesta realmente útil. – mickeyf

0

con la ayuda de las respuestas de @ paulb ayudar

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

Con mi SetIpAddress código y 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; 
    } 
Cuestiones relacionadas