Kot_Matrosskin
@Kot_Matrosskin

Как применить настройки прокси-сервера через реестр в С#?

Доброго времени суток. Столкнулся с интересной проблемой. При изменении настроек прокси-сервера через реестр, настройки браузеры и софт не подхватывают, если просто открыть окно настроек и закрыть, то сразу применяются (настройки при этом обновлены). Гугл такую проблему не дал, код распространенный, привожу ниже. По ощущениям, как будто, не применяются где-то еще изменения. Важный момент, изменения должны быть без повышения привилегий, под текущим пользователем.

private void SetProxyOFF()
        {
            using (RegistryKey keyProxyOFF = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
            {
                keyProxyOFF.SetValue("ProxyEnable", 0);
                if (!keyProxyOFF.GetValueNames().Contains("AutoDetect"))
                    keyProxyOFF.CreateSubKey("AutoDetect");
                keyProxyOFF.SetValue("AutoDetect", 1);
                keyProxyOFF.Close();
            }
        }


и код простановки прокси:
private void SetProxyON()
        {
            using(RegistryKey keyProxyON = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
            {
                keyProxyON.SetValue("ProxyEnable", 1);
                keyProxyON.CreateSubKey("ProxyServer");
                keyProxyON.SetValue("ProxyServer",
                    //прокси-адрес и порт из массива.
                    $"{SettingFromFile[5][0]}.{SettingFromFile[5][1]}.{SettingFromFile[5][2]}." +
                    $"{SettingFromFile[5][3]}:{SettingFromFile[6][0]}");
                if (!keyProxyON.GetValueNames().Contains("AutoDetect"))
                    keyProxyON.CreateSubKey("AutoDetect");
                keyProxyON.SetValue("AutoDetect", 0);
                keyProxyON.Close();
            }
        }
  • Вопрос задан
  • 376 просмотров
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
Браузеру надо сообщить, что настройки изменились парой вызовов процедуры InternetSetOption из WinInet.dll. Вызывать надо через P/Invoke На stackoverflow нашел пример, как это делать в Powershell.
function Refresh-System
{
  $signature = @'
[DllImport("wininet.dll", SetLastError = true, CharSet=CharSet.Auto)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
'@

$INTERNET_OPTION_SETTINGS_CHANGED   = 39
$INTERNET_OPTION_REFRESH            = 37
$type = Add-Type -MemberDefinition $signature -Name wininet -Namespace pinvoke -PassThru
$a = $type::InternetSetOption(0, $INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)
$b = $type::InternetSetOption(0, $INTERNET_OPTION_REFRESH, 0, 0)
return $a -and $b
}

Адаптируйте этот код к C# (пояснение: Add-Type в PS служит для загрузки сборки или неуправляемой DLL ). Или поищите по имени этой процедуры код на C#.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vapaamies
@Vapaamies
Психанул и снес свои ответы козлам, не отмечающим…
Продолжая идею MVV, скажу, что по возможности нужно вообще перестать лазить в реестр, а начать использовать исключительно wininet.dll, раз уж от нее отказаться не удалось. Структура значений в реестре может поменяться, а программные интерфейсы останутся.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы