/// <summary>
        ///     Simple check if the network interface contains any of resolver addresses.
        /// </summary>
        /// <param name="localNetworkInterface">The interface to check.</param>
        /// <param name="optionalAddress"></param>
        /// <returns><c>true</c> if a address was found, otherwise <c>false</c></returns>
        internal static bool IsUsingDnsCrypt(LocalNetworkInterface localNetworkInterface, string optionalAddress = "")
        {
            var dns = new List <string> {
                Global.PrimaryResolverAddress, Global.SecondaryResolverAddress
            };
            var dns6 = new List <string> {
                Global.PrimaryResolverAddress6, Global.SecondaryResolverAddress6
            };

            if (localNetworkInterface.Ipv4Dns.Contains(dns[0]) || localNetworkInterface.Ipv4Dns.Contains(dns[1]))
            {
                return(true);
            }
            if (!string.IsNullOrEmpty(optionalAddress))
            {
                if (localNetworkInterface.Ipv4Dns.Contains(optionalAddress))
                {
                    return(true);
                }
            }
            if (localNetworkInterface.Ipv6Dns.Contains(dns6[0]) || localNetworkInterface.Ipv6Dns.Contains(dns6[1]))
            {
                return(true);
            }
            return(false);
        }
 /// <summary>
 ///     Click event for the network cards.
 /// </summary>
 /// <param name="localNetworkInterface">The clicked network card.</param>
 public void NetworkCardClicked(LocalNetworkInterface localNetworkInterface)
 {
     if (localNetworkInterface == null)
     {
         return;
     }
     if (localNetworkInterface.UseDnsCrypt)
     {
         var status = LocalNetworkInterfaceManager.SetNameservers(localNetworkInterface, new List <string>(),
                                                                  NetworkInterfaceComponent.IPv4);
         LocalNetworkInterfaceManager.SetNameservers(localNetworkInterface, new List <string>(),
                                                     NetworkInterfaceComponent.IPv6);
         localNetworkInterface.UseDnsCrypt = !status;
     }
     else
     {
         var dns4 = new List <string>();
         var dns6 = new List <string>();
         if (PrimaryResolver != null)
         {
             if (!string.IsNullOrEmpty(PrimaryResolver.ProviderPublicKey))
             {
                 // only add the local address if the proxy is running
                 if (PrimaryDnsCryptProxyManager.DnsCryptProxy.IsReady && PrimaryDnsCryptProxyManager.IsDnsCryptProxyRunning())
                 {
                     dns4.Add(Global.PrimaryResolverAddress);
                     if (_userData.UseIpv6)
                     {
                         dns6.Add(Global.PrimaryResolverAddress6);
                     }
                 }
             }
         }
         if (SecondaryResolver != null)
         {
             if (!string.IsNullOrEmpty(SecondaryResolver.ProviderPublicKey))
             {
                 // only add the local address if the proxy is running
                 if (SecondaryDnsCryptProxyManager.DnsCryptProxy.IsReady && SecondaryDnsCryptProxyManager.IsDnsCryptProxyRunning())
                 {
                     dns4.Add(Global.SecondaryResolverAddress);
                     if (_userData.UseIpv6)
                     {
                         dns6.Add(Global.SecondaryResolverAddress6);
                     }
                 }
             }
         }
         var status = LocalNetworkInterfaceManager.SetNameservers(localNetworkInterface, dns4, NetworkInterfaceComponent.IPv4);
         if (_userData.UseIpv6)
         {
             LocalNetworkInterfaceManager.SetNameservers(localNetworkInterface, dns6, NetworkInterfaceComponent.IPv6);
         }
         localNetworkInterface.UseDnsCrypt = status;
     }
     LoadNetworkCards();
 }
        internal static bool IsUsingInsecureFallbackDns(LocalNetworkInterface localNetworkInterface, UserData userData)
        {
            if (!(userData?.InsecureResolverPair?.Addresses?.Count > 0))
            {
                return(false);
            }
            var fallbackAddresses = userData.InsecureResolverPair.Addresses;

            return(fallbackAddresses.Any(fallbackAddress => localNetworkInterface.Ipv4Dns.Contains(fallbackAddress)));
        }
Exemple #4
0
        /// <summary>
        ///     Simple check if the network interface contains any of resolver addresses.
        /// </summary>
        /// <param name="listenAddresses"></param>
        /// <param name="localNetworkInterface">The interface to check.</param>
        /// <returns><c>true</c> if a address was found, otherwise <c>false</c></returns>
        public static bool IsUsingDnsCrypt(List <string> listenAddresses, LocalNetworkInterface localNetworkInterface)
        {
            if (listenAddresses == null)
            {
                return(false);
            }
            var addressOnly = (from listenAddress in listenAddresses let lastIndex = listenAddress.LastIndexOf(":", StringComparison.Ordinal) select listenAddress.Substring(0, lastIndex).Replace("[", "").Replace("]", "")).ToList();

            return(localNetworkInterface.Dns.Any(d => addressOnly.Contains(d.Address)));
        }
Exemple #5
0
        /// <summary>
        ///     Get a list of the local network interfaces.
        /// </summary>
        /// <param name="listenAddresses"></param>
        /// <param name="showHiddenCards">Show hidden cards.</param>
        /// <param name="showOnlyOperationalUp">Include only connected network cards.</param>
        /// <returns>A (filtered) list of the local network interfaces.</returns>
        /// <exception cref="NetworkInformationException">A Windows system function call failed. </exception>
        /// <exception cref="ArgumentNullException"></exception>
        public static List <LocalNetworkInterface> GetLocalNetworkInterfaces(List <string> listenAddresses = null, bool showHiddenCards = false,
                                                                             bool showOnlyOperationalUp    = true)
        {
            var interfaces = new List <LocalNetworkInterface>();

            try
            {
                foreach (var nic in NetworkInterface.GetAllNetworkInterfaces())
                {
                    if (showOnlyOperationalUp)
                    {
                        if (nic.OperationalStatus != OperationalStatus.Up)
                        {
                            continue;
                        }
                    }

                    if (!showHiddenCards)
                    {
                        var add = true;
                        foreach (var blacklistEntry in Global.NetworkInterfaceBlacklist)
                        {
                            if (nic.Description.Contains(blacklistEntry) || nic.Name.Contains(blacklistEntry))
                            {
                                add = false;
                            }
                        }
                        if (!add)
                        {
                            continue;
                        }
                    }
                    var localNetworkInterface = new LocalNetworkInterface
                    {
                        Name              = nic.Name,
                        Description       = nic.Description,
                        Type              = nic.NetworkInterfaceType,
                        Dns               = GetDnsServerList(nic.Id),
                        Ipv4Support       = nic.Supports(NetworkInterfaceComponent.IPv4),
                        Ipv6Support       = nic.Supports(NetworkInterfaceComponent.IPv6),
                        OperationalStatus = nic.OperationalStatus
                    };
                    //do a strict check if the interface supports IPv6
                    localNetworkInterface.UseDnsCrypt = IsUsingDnsCrypt(listenAddresses, localNetworkInterface, localNetworkInterface.Ipv6Support);
                    interfaces.Add(localNetworkInterface);
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, "GetLocalNetworkInterfaces");
            }
            return(interfaces);
        }
        /// <summary>
        ///     Set's the IPv4 or IPv6 DNS Servers of an interface.
        /// </summary>
        /// <param name="localNetworkInterface">The interface to work with.</param>
        /// <param name="dnsServers">List of dns servers to set.</param>
        /// <param name="networkInterfaceComponent">IPv4 or IPv6.</param>
        public static void SetNameservers(LocalNetworkInterface localNetworkInterface, List<string> dnsServers,
            NetworkInterfaceComponent networkInterfaceComponent = NetworkInterfaceComponent.IPv4)
        {
            if (networkInterfaceComponent == NetworkInterfaceComponent.IPv4)
            {
                using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration"))
                {
                    using (var networkConfigs = networkConfigMng.GetInstances())
                    {
                        foreach (
                            var managementObject in
                                networkConfigs.Cast<ManagementObject>()
                                    .Where(
                                        mo =>
                                            (bool) mo["IPEnabled"] &&
                                            (string) mo["Description"] == localNetworkInterface.Description))
                        {
                            using (var newDns = managementObject.GetMethodParameters("SetDNSServerSearchOrder"))
                            {
                                newDns["DNSServerSearchOrder"] = dnsServers.ToArray();
                                managementObject.InvokeMethod("SetDNSServerSearchOrder", newDns, null);
                            }
                        }
                    }
                }
            }
            else
            {
                //TODO: find better way to set IPv6 nameservers
                using (var process = new Process())
                {
                    var processStartInfo = new ProcessStartInfo("netsh",
                        "interface ipv6 delete dns \"" + localNetworkInterface.Name + "\" all")
                    {
                        WindowStyle = ProcessWindowStyle.Minimized
                    };
                    process.StartInfo = processStartInfo;
                    process.Start();

                    foreach (var address in dnsServers)
                    {
                        //netsh interface ipv6 add dns "Interface Name" 127.0.0.1 validate=no
                        processStartInfo = new ProcessStartInfo("netsh",
                            "interface ipv6 add dns \"" + localNetworkInterface.Name + "\" " + address + " validate=no")
                        {
                            WindowStyle = ProcessWindowStyle.Minimized
                        };
                        process.StartInfo = processStartInfo;
                        process.Start();
                    }
                }
            }
        }
        /// <summary>
        ///     Get a list of the local network interfaces.
        /// </summary>
        /// <param name="userData"></param>
        /// <param name="showHiddenCards">Show hidden cards.</param>
        /// <param name="showOnlyOperationalUp">Include only connected network cards.</param>
        /// <param name="optionalAddress"></param>
        /// <returns>A (filtered) list of the local network interfaces.</returns>
        /// <exception cref="NetworkInformationException">A Windows system function call failed. </exception>
        /// <exception cref="ArgumentNullException"></exception>
        internal static List <LocalNetworkInterface> GetLocalNetworkInterfaces(UserData userData, bool showHiddenCards = false,
                                                                               bool showOnlyOperationalUp = true, string optionalAddress = "")
        {
            var interfaces = new List <LocalNetworkInterface>();

            foreach (var nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (showOnlyOperationalUp)
                {
                    if (nic.OperationalStatus != OperationalStatus.Up)
                    {
                        continue;
                    }
                }

                if (!showHiddenCards)
                {
                    var add = true;
                    foreach (var blacklistEntry in Global.NetworkInterfaceBlacklist)
                    {
                        if (nic.Description.Contains(blacklistEntry) || nic.Name.Contains(blacklistEntry))
                        {
                            add = false;
                        }
                    }
                    if (!add)
                    {
                        continue;
                    }
                }
                var localNetworkInterface = new LocalNetworkInterface
                {
                    Name              = nic.Name,
                    Description       = nic.Description,
                    Type              = nic.NetworkInterfaceType,
                    Ipv4Dns           = GetDnsServerList(nic.Id, NetworkInterfaceComponent.IPv4),
                    Ipv6Dns           = GetDnsServerList(nic.Id, NetworkInterfaceComponent.IPv6),
                    Ipv4Support       = nic.Supports(NetworkInterfaceComponent.IPv4),
                    Ipv6Support       = nic.Supports(NetworkInterfaceComponent.IPv6),
                    OperationalStatus = nic.OperationalStatus
                };

                localNetworkInterface.UseDnsCrypt = IsUsingDnsCrypt(localNetworkInterface, optionalAddress);
                if (!localNetworkInterface.UseDnsCrypt)
                {
                    localNetworkInterface.UseInsecureFallbackDns = IsUsingInsecureFallbackDns(localNetworkInterface, userData);
                }

                interfaces.Add(localNetworkInterface);
            }
            return(interfaces);
        }
        /// <summary>
        ///     Simple check if the network interface contains any of resolver addresses.
        /// </summary>
        /// <param name="listenAddresses"></param>
        /// <param name="localNetworkInterface">The interface to check.</param>
        /// <returns><c>true</c> if a address was found, otherwise <c>false</c></returns>
        public static bool IsUsingDnsCrypt(List <string> listenAddresses, LocalNetworkInterface localNetworkInterface, bool strictCheck = false)
        {
            if (listenAddresses == null)
            {
                return(false);
            }
            var addressOnly = (from listenAddress in listenAddresses let lastIndex = listenAddress.LastIndexOf(":", StringComparison.Ordinal) select listenAddress.Substring(0, lastIndex).Replace("[", "").Replace("]", "")).ToList();

            if (strictCheck)
            {
                // check for ALL addresses
                return(addressOnly.Intersect(localNetworkInterface.Dns.Select(x => x.Address).ToList()).Count() == addressOnly.Count());
            }

            return(localNetworkInterface.Dns.Any(d => addressOnly.Contains(d.Address)));
        }
Exemple #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="localNetworkInterface"></param>
        /// <param name="dnsServers"></param>
        /// <returns></returns>
        public static bool SetNameservers(LocalNetworkInterface localNetworkInterface, List <DnsServer> dnsServers)
        {
            try
            {
                if (dnsServers == null)
                {
                    dnsServers = new List <DnsServer>();
                }
                using (var process = new Process())
                {
                    var processStartInfoV4 = new ProcessStartInfo("netsh",
                                                                  "interface ipv4 delete dns \"" + localNetworkInterface.Name + "\" all")
                    {
                        WindowStyle    = ProcessWindowStyle.Hidden,
                        CreateNoWindow = true
                    };
                    process.StartInfo = processStartInfoV4;
                    process.Start();


                    var processStartInfoV6 = new ProcessStartInfo("netsh",
                                                                  "interface ipv6 delete dns \"" + localNetworkInterface.Name + "\" all")
                    {
                        WindowStyle    = ProcessWindowStyle.Hidden,
                        CreateNoWindow = true
                    };
                    process.StartInfo = processStartInfoV6;
                    process.Start();


                    foreach (var dnsServer in dnsServers)
                    {
                        if (dnsServer.Type == NetworkInterfaceComponent.IPv4)
                        {
                            var processStartInfo = new ProcessStartInfo("netsh",
                                                                        "interface ipv4 add dns \"" + localNetworkInterface.Name + "\" " + dnsServer.Address + " validate=no")
                            {
                                WindowStyle    = ProcessWindowStyle.Hidden,
                                CreateNoWindow = true
                            };
                            process.StartInfo = processStartInfo;
                            process.Start();
                        }
                        else
                        {
                            var processStartInfo = new ProcessStartInfo("netsh",
                                                                        "interface ipv6 add dns \"" + localNetworkInterface.Name + "\" " + dnsServer.Address + " validate=no")
                            {
                                WindowStyle    = ProcessWindowStyle.Hidden,
                                CreateNoWindow = true
                            };
                            process.StartInfo = processStartInfo;
                            process.Start();
                        }
                    }
                }
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Exemple #10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="localNetworkInterface"></param>
        /// <param name="dnsServers"></param>
        /// <returns></returns>
        public static bool SetNameservers(LocalNetworkInterface localNetworkInterface, List <DnsServer> dnsServers)
        {
            var succedded = true;

            try
            {
                if (dnsServers == null)
                {
                    dnsServers = new List <DnsServer>();
                }

                var delete4 = ExecuteWithArguments("interface ipv4 delete dns \"" + localNetworkInterface.Name + "\" all");
                if (delete4 != null)
                {
                    if (!delete4.Success)
                    {
                        Logger.Warning("failed to delete DNS (IPv4)");
                        succedded = false;
                    }
                    else
                    {
                        Logger.Information("delete DNS (IPv4) succeeded");
                    }
                }
                else
                {
                    Logger.Warning("failed to delete DNS (IPv4)");
                    succedded = false;
                }

                var delete6 = ExecuteWithArguments("interface ipv6 delete dns \"" + localNetworkInterface.Name + "\" all");
                if (delete6 != null)
                {
                    if (!delete6.Success)
                    {
                        Logger.Warning("failed to delete DNS (IPv6)");
                        succedded = false;
                    }
                    else
                    {
                        Logger.Information("delete DNS (IPv6) succeeded");
                    }
                }
                else
                {
                    Logger.Warning("failed to delete DNS (IPv6)");
                    succedded = false;
                }

                foreach (var dnsServer in dnsServers)
                {
                    if (dnsServer.Type == NetworkInterfaceComponent.IPv4)
                    {
                        var add4 = ExecuteWithArguments("interface ipv4 add dns \"" + localNetworkInterface.Name + "\" " + dnsServer.Address + " validate=no");
                        if (add4 != null)
                        {
                            if (!add4.Success)
                            {
                                Logger.Warning("failed to add DNS (IPv4)");
                                succedded = false;
                            }
                            else
                            {
                                Logger.Information("add DNS (IPv4) succeeded");
                            }
                        }
                        else
                        {
                            Logger.Warning("failed to add DNS (IPv4)");
                            succedded = false;
                        }
                    }
                    else
                    {
                        var add6 = ExecuteWithArguments("interface ipv6 add dns \"" + localNetworkInterface.Name + "\" " + dnsServer.Address + " validate=no");
                        if (add6 != null)
                        {
                            if (!add6.Success)
                            {
                                Logger.Warning("failed to add DNS (IPv6)");
                                succedded = false;
                            }
                            else
                            {
                                Logger.Information("add DNS (IPv6) succeeded");
                            }
                        }
                        else
                        {
                            Logger.Warning("failed to add DNS (IPv6)");
                            succedded = false;
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, "SetNameservers");
            }
            return(succedded);
        }
Exemple #11
0
 public static bool UnsetNameservers(LocalNetworkInterface localNetworkInterface)
 {
     return(SetNameservers(localNetworkInterface, null));
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="localNetworkInterface"></param>
        /// <param name="dnsServers"></param>
        /// <returns></returns>
        public static bool SetNameservers(LocalNetworkInterface localNetworkInterface, List <DnsServer> dnsServers)
        {
            try
            {
                if (dnsServers == null)
                {
                    dnsServers = new List <DnsServer>();
                }

                var delete4 = ProcessHelper.ExecuteWithArguments("netsh", "interface ipv4 delete dns \"" + localNetworkInterface.Name + "\" all");
                if (delete4 != null)
                {
                    if (!delete4.Success)
                    {
                        Log.Warn("failed to delete DNS (IPv4)");
                    }
                }
                else
                {
                    Log.Warn("failed to delete DNS (IPv4)");
                }

                var delete6 = ProcessHelper.ExecuteWithArguments("netsh", "interface ipv6 delete dns \"" + localNetworkInterface.Name + "\" all");
                if (delete6 != null)
                {
                    if (!delete6.Success)
                    {
                        Log.Warn("failed to delete DNS (IPv6)");
                    }
                }
                else
                {
                    Log.Warn("failed to delete DNS (IPv6)");
                }

                foreach (var dnsServer in dnsServers)
                {
                    if (dnsServer.Type == NetworkInterfaceComponent.IPv4)
                    {
                        var add4 = ProcessHelper.ExecuteWithArguments("netsh", "interface ipv4 add dns \"" + localNetworkInterface.Name + "\" " + dnsServer.Address + " validate=no");
                        if (add4 != null)
                        {
                            if (!add4.Success)
                            {
                                Log.Warn("failed to add DNS (IPv4)");
                            }
                        }
                        else
                        {
                            Log.Warn("failed to add DNS (IPv4)");
                        }
                    }
                    else
                    {
                        var add6 = ProcessHelper.ExecuteWithArguments("netsh", "interface ipv6 add dns \"" + localNetworkInterface.Name + "\" " + dnsServer.Address + " validate=no");
                        if (add6 != null)
                        {
                            if (!add6.Success)
                            {
                                Log.Warn("failed to add DNS (IPv6)");
                            }
                        }
                        else
                        {
                            Log.Warn("failed to add DNS (IPv6)");
                        }
                    }
                }
                return(true);
            }
            catch (Exception exception)
            {
                Log.Error(exception);
                return(false);
            }
        }
        /// <summary>
        ///     Set's the IPv4 or IPv6 DNS Servers of an interface.
        /// </summary>
        /// <param name="localNetworkInterface">The interface to work with.</param>
        /// <param name="dnsServers">List of dns servers to set.</param>
        /// <param name="networkInterfaceComponent">IPv4 or IPv6.</param>
        /// <returns><c>true</c> on success, otherwise <c>false</c></returns>
        /// <remarks>Win32_NetworkAdapter class is deprecated.
        /// https://msdn.microsoft.com/en-us/library/windows/desktop/hh968170(v=vs.85).aspx (only on windows 8+)</remarks>
        public static bool SetNameservers(LocalNetworkInterface localNetworkInterface, List <string> dnsServers,
                                          NetworkInterfaceComponent networkInterfaceComponent = NetworkInterfaceComponent.IPv4)
        {
            var status = false;

            if (networkInterfaceComponent == NetworkInterfaceComponent.IPv4)
            {
                using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration"))
                {
                    using (var networkConfigs = networkConfigMng.GetInstances())
                    {
                        //(bool)mo["IPEnabled"] &&
                        foreach (
                            var managementObject in
                            networkConfigs.Cast <ManagementObject>()
                            .Where(mo => (string)mo["Description"] == localNetworkInterface.Description))
                        {
                            var enabled = (bool)managementObject["IPEnabled"];
                            if (enabled)
                            {
                                // the network adapter is enabled, so we can change the dns settings per WMI.
                                using (var newDns = managementObject.GetMethodParameters("SetDNSServerSearchOrder"))
                                {
                                    newDns["DNSServerSearchOrder"] = dnsServers.ToArray();
                                    var outputBaseObject = managementObject.InvokeMethod("SetDNSServerSearchOrder", newDns, null);
                                    if (outputBaseObject == null)
                                    {
                                        continue;
                                    }
                                    var state = (uint)outputBaseObject["returnValue"];
                                    switch (state)
                                    {
                                    case 0:                                             // Successful completion, no reboot required
                                    case 1:                                             // Successful completion, reboot required
                                        status = true;
                                        break;

                                    case 84:                                             // IP not enabled on adapter
                                        status = false;
                                        break;

                                    default:
                                        status = false;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                // seems to be unplugged or disabled, so we need change this per registry (not optimal)
                                var registryId = managementObject["SettingID"];
                                if (registryId == null)
                                {
                                    continue;
                                }
                                var localMachine   = Registry.LocalMachine;
                                var interfaceEntry = localMachine.OpenSubKey(
                                    @"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + registryId, true);
                                if (interfaceEntry == null)
                                {
                                    continue;
                                }
                                interfaceEntry.SetValue("NameServer", dnsServers.Count > 0 ? string.Join(",", dnsServers.ToArray()) : "",
                                                        RegistryValueKind.String);
                                status = true;
                            }
                        }
                    }
                }
            }
            else
            {
                //TODO: find better way to set IPv6 nameservers
                using (var process = new Process())
                {
                    var processStartInfo = new ProcessStartInfo("netsh",
                                                                "interface ipv6 delete dns \"" + localNetworkInterface.Name + "\" all")
                    {
                        WindowStyle    = ProcessWindowStyle.Hidden,
                        CreateNoWindow = true
                    };
                    process.StartInfo = processStartInfo;
                    process.Start();

                    foreach (var address in dnsServers)
                    {
                        //netsh interface ipv6 add dns "Interface Name" 127.0.0.1 validate=no
                        processStartInfo = new ProcessStartInfo("netsh",
                                                                "interface ipv6 add dns \"" + localNetworkInterface.Name + "\" " + address + " validate=no")
                        {
                            WindowStyle    = ProcessWindowStyle.Hidden,
                            CreateNoWindow = true
                        };
                        process.StartInfo = processStartInfo;
                        process.Start();
                    }
                    status = true;
                }
            }
            return(status);
        }
        /// <summary>
        ///     Click event for the network cards.
        /// </summary>
        /// <param name="localNetworkInterface">The clicked network card.</param>
        public void NetworkCardClicked(LocalNetworkInterface localNetworkInterface)
        {
            if (localNetworkInterface == null) return;
            if (localNetworkInterface.UseDnsCrypt)
            {
                var status = LocalNetworkInterfaceManager.SetNameservers(localNetworkInterface, new List<string>(),
                    NetworkInterfaceComponent.IPv4);
                localNetworkInterface.UseDnsCrypt = !status;
            }
            else
            {
                var dns = new List<string>();
                if (PrimaryResolver != null)
                {
                    if (!string.IsNullOrEmpty(PrimaryResolver.ProviderPublicKey))
                    {
						// only add the local address if the proxy is running 
						if (PrimaryDnsCryptProxyManager.DnsCryptProxy.IsReady && PrimaryDnsCryptProxyManager.IsDnsCryptProxyRunning())
                        {
                            dns.Add(Global.PrimaryResolverAddress);
                        }
                    }
                }
                if (SecondaryResolver != null)
                {
                    if (!string.IsNullOrEmpty(SecondaryResolver.ProviderPublicKey))
                    {
						// only add the local address if the proxy is running 
						if (SecondaryDnsCryptProxyManager.DnsCryptProxy.IsReady && SecondaryDnsCryptProxyManager.IsDnsCryptProxyRunning())
                        {
                            dns.Add(Global.SecondaryResolverAddress);
                        }
                    }
                }
				var status = LocalNetworkInterfaceManager.SetNameservers(localNetworkInterface, dns, NetworkInterfaceComponent.IPv4);
                localNetworkInterface.UseDnsCrypt = status;
            }
	        LoadNetworkCards();
        }
 /// <summary>
 ///     Simple check if the network interface contains any of resolver addresses.
 /// </summary>
 /// <param name="localNetworkInterface">The interface to check.</param>
 /// <returns><c>true</c> if a address was found, otherwise <c>false</c></returns>
 internal static bool IsUsingDnsCrypt(LocalNetworkInterface localNetworkInterface)
 {
     var dns = new List<string> {Global.PrimaryResolverAddress, Global.SecondaryResolverAddress};
     var dns6 = new List<string> {Global.PrimaryResolverAddress6, Global.SecondaryResolverAddress6};
     if (localNetworkInterface.Ipv4Dns.Contains(dns[0]) || localNetworkInterface.Ipv4Dns.Contains(dns[1]))
     {
         return true;
     }
     if (localNetworkInterface.Ipv6Dns.Contains(dns6[0]) || localNetworkInterface.Ipv6Dns.Contains(dns6[1]))
     {
         return true;
     }
     return false;
 }
        /// <summary>
        ///     Get a list of the local network interfaces.
        /// </summary>
        /// <param name="showHiddenCards">Show hidden cards.</param>
        /// <param name="showOnlyOperationalUp">Include only connected network cards.</param>
        /// <returns>A (filtered) list of the local network interfaces.</returns>
        /// <exception cref="NetworkInformationException">A Windows system function call failed. </exception>
        /// <exception cref="ArgumentNullException"></exception>
        internal static List<LocalNetworkInterface> GetLocalNetworkInterfaces(bool showHiddenCards = false,
			bool showOnlyOperationalUp = true)
        {
            var interfaces = new List<LocalNetworkInterface>();
            foreach (var nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (showOnlyOperationalUp)
                {
                    if (nic.OperationalStatus != OperationalStatus.Up)
                    {
                        continue;
                    }
                }

                if (!showHiddenCards)
                {
                    var add = true;
                    foreach (var blacklistEntry in Global.NetworkInterfaceBlacklist)
                    {
                        if (nic.Description.Contains(blacklistEntry) || nic.Name.Contains(blacklistEntry))
                        {
                            add = false;
                        }
                    }
                    if (!add) continue;
                }
                var localNetworkInterface = new LocalNetworkInterface
                {
                    Name = nic.Name,
                    Description = nic.Description,
                    Type = nic.NetworkInterfaceType,
                    Ipv4Dns = GetDnsServerList(nic.Id, NetworkInterfaceComponent.IPv4),
                    Ipv6Dns = GetDnsServerList(nic.Id, NetworkInterfaceComponent.IPv6),
                    Ipv4Support = nic.Supports(NetworkInterfaceComponent.IPv4),
                    Ipv6Support = nic.Supports(NetworkInterfaceComponent.IPv6),
                    OperationalStatus = nic.OperationalStatus
                };

                localNetworkInterface.UseDnsCrypt = IsUsingDnsCrypt(localNetworkInterface);

                interfaces.Add(localNetworkInterface);
            }
            return interfaces;
        }
Exemple #17
0
 /// <summary>
 ///     Click event for the network cards.
 /// </summary>
 /// <param name="localNetworkInterface">The clicked network card.</param>
 public void NetworkCardClicked(LocalNetworkInterface localNetworkInterface)
 {
     if (localNetworkInterface == null) return;
     if (localNetworkInterface.UseDnsCrypt)
     {
         LocalNetworkInterfaceManager.SetNameservers(localNetworkInterface, new List<string>(),
             NetworkInterfaceComponent.IPv4);
         localNetworkInterface.UseDnsCrypt = false;
     }
     else
     {
         var dns = new List<string>();
         if (PrimaryResolver != null)
         {
             if (!string.IsNullOrEmpty(PrimaryResolver.ProviderPublicKey))
             {
                 if (PrimaryDnsCryptProxyManager.DnsCryptProxy.IsReady)
                 {
                     dns.Add(Global.PrimaryResolverAddress);
                 }
             }
         }
         if (SecondaryResolver != null)
         {
             if (!string.IsNullOrEmpty(SecondaryResolver.ProviderPublicKey))
             {
                 if (SecondaryDnsCryptProxyManager.DnsCryptProxy.IsReady)
                 {
                     dns.Add(Global.SecondaryResolverAddress);
                 }
             }
         }
         LocalNetworkInterfaceManager.SetNameservers(localNetworkInterface, dns, NetworkInterfaceComponent.IPv4);
         localNetworkInterface.UseDnsCrypt = true;
     }
 }
        /// <summary>
        ///     Set's the IPv4 or IPv6 DNS Servers of an interface.
        /// </summary>
        /// <param name="localNetworkInterface">The interface to work with.</param>
        /// <param name="dnsServers">List of dns servers to set.</param>
        /// <param name="networkInterfaceComponent">IPv4 or IPv6.</param>
        /// <returns><c>true</c> on success, otherwise <c>false</c></returns>
        /// <remarks>Win32_NetworkAdapter class is deprecated.
        /// https://msdn.microsoft.com/en-us/library/windows/desktop/hh968170(v=vs.85).aspx (only on windows 8+)</remarks>
        public static bool SetNameservers(LocalNetworkInterface localNetworkInterface, List<string> dnsServers,
			NetworkInterfaceComponent networkInterfaceComponent = NetworkInterfaceComponent.IPv4)
        {
            var status = false;
            if (networkInterfaceComponent == NetworkInterfaceComponent.IPv4)
            {
                using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration"))
                {
                    using (var networkConfigs = networkConfigMng.GetInstances())
                    {
                        //(bool)mo["IPEnabled"] &&
                        foreach (
                            var managementObject in
                                networkConfigs.Cast<ManagementObject>()
                                    .Where(mo => (string)mo["Description"] == localNetworkInterface.Description))
                        {
                            var enabled = (bool)managementObject["IPEnabled"];
                            if (enabled)
                            {
                                // the network adapter is enabled, so we can change the dns settings per WMI.
                                using (var newDns = managementObject.GetMethodParameters("SetDNSServerSearchOrder"))
                                {
                                    newDns["DNSServerSearchOrder"] = dnsServers.ToArray();
                                    var outputBaseObject = managementObject.InvokeMethod("SetDNSServerSearchOrder", newDns, null);
                                    if (outputBaseObject == null) continue;
                                    var state = (uint)outputBaseObject["returnValue"];
                                    switch (state)
                                    {
                                        case 0: // Successful completion, no reboot required
                                        case 1: // Successful completion, reboot required
                                            status = true;
                                            break;
                                        case 84: // IP not enabled on adapter
                                            status = false;
                                            break;
                                        default:
                                            status = false;
                                            break;
                                    }
                                }
                            }
                            else
                            {
                                // seems to be unplugged or disabled, so we need change this per registry (not optimal)
                                var registryId = managementObject["SettingID"];
                                if (registryId == null) continue;
                                var localMachine = Registry.LocalMachine;
                                var interfaceEntry = localMachine.OpenSubKey(
                                    @"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + registryId, true);
                                if (interfaceEntry == null) continue;
                                interfaceEntry.SetValue("NameServer", dnsServers.Count > 0 ? string.Join(",", dnsServers.ToArray()) : "",
                                    RegistryValueKind.String);
                                status = true;
                            }
                        }
                    }
                }
            }
            else
            {
                //TODO: find better way to set IPv6 nameservers
                using (var process = new Process())
                {
                    var processStartInfo = new ProcessStartInfo("netsh",
                        "interface ipv6 delete dns \"" + localNetworkInterface.Name + "\" all")
                    {
                        WindowStyle = ProcessWindowStyle.Hidden,
                        CreateNoWindow = true
                    };
                    process.StartInfo = processStartInfo;
                    process.Start();

                    foreach (var address in dnsServers)
                    {
                        //netsh interface ipv6 add dns "Interface Name" 127.0.0.1 validate=no
                        processStartInfo = new ProcessStartInfo("netsh",
                            "interface ipv6 add dns \"" + localNetworkInterface.Name + "\" " + address + " validate=no")
                        {
                            WindowStyle = ProcessWindowStyle.Hidden,
                            CreateNoWindow = true
                        };
                        process.StartInfo = processStartInfo;
                        process.Start();
                    }
                    status = true;
                }
            }
            return status;
        }