2009-03-27 14 views
18

Mam wniosek napisany w języku C#, który musi być w stanie skonfigurować karty sieciowe w systemie Windows. Mam to zasadniczo w WMI, ale jest kilka rzeczy, których nie lubię w tym rozwiązaniu: czasami ustawienia nie wydają się trzymać, a gdy kabel sieciowy nie jest podłączony, błędy są zwracane z WMI metody, więc nie mogę stwierdzić, czy naprawdę im się to udało, czy nie.Najlepszy sposób programowo skonfigurować karty sieciowe w .NET

Potrzebuję być w stanie skonfigurować wszystkie ustawienia dostępne przez połączenia sieciowe - Właściwości - Ekrany TCP/IP.

Jaki jest najlepszy sposób na zrobienie tego?

Odpowiedz

21

Możesz użyć Process do odpalić polecenia netsh, aby ustawić wszystkie właściwości w oknach dialogowych sieci.

np Aby ustawić statyczny ipaddress na adapterze

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

aby ustawić go na DHCP byłoby użyć

netsh interface ip set address "Local Area Connection" dhcp 

Aby zrobić to z C# byłoby

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

Ustawienie na statyczne może zająć kilka dobrych sekund, więc jeśli musisz, upewnij się, że czekasz aby proces się zakończył.

+0

Dowolny pomysł, jak podnieść to polecenie, aby działał z uprawnieniami administratora? – Fuser97381

+0

Spójrz na http://stackoverflow.com/questions/133379/elevating-process-privilege-programatically – PaulB

+0

Dzięki, jesteś najlepszy. – Fuser97381

2

Mogę ci powiedzieć, w jaki sposób trojany to robią, po oczyszczeniu po kilku z nich, to ustawienie kluczy rejestru w HKEY_LOCAL_MACHINE. Najważniejsze z nich, które ustawiają, to DNS i to podejście zdecydowanie się trzyma, na które może się natknąć każdy, kto kiedykolwiek został zainfekowany i nie może już dostać się do windowsupdate.com, mcafee.com itp.

+0

"HKEY_LOCAL_MACHINE" nie dokładnie zawężenia gdzie znaleźć klucze, które mają znaczenie . Nieco więcej szczegółów sprawiłoby, że ta odpowiedź byłaby rzeczywiście przydatna. – mickeyf

0

za pomocą odpowiedzi @ paulb pomagają

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

z mojego kodu SetIpAddress i 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; 
    } 
Powiązane problemy