свойства интернета - прочитать путь к скрипту конфигурации - PullRequest
0 голосов
/ 09 мая 2018

Я хотел бы прочитать значение в поле адреса «Использовать скрипт автоматической настройки».

Мне нужно установить прокси для CefSharp следующим образом

settings.CefCommandLineArgs.Add("proxy-pac-url","proxy address");

Я пробовал разные варианты WebRequest.GetSystemWebProxy и вызова функции InternetQueryOption в wininet.dll.

Код из репозитория CefSharp на Github

 public static class ProxyConfig
{
    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool InternetQueryOption(IntPtr hInternet, uint dwOption, IntPtr lpBuffer, ref int lpdwBufferLength);

    private const uint InternetOptionProxy = 38;

    public static InternetProxyInfo GetProxyInformation()
    {
        var bufferLength = 0;
        InternetQueryOption(IntPtr.Zero, InternetOptionProxy, IntPtr.Zero, ref bufferLength);
        var buffer = IntPtr.Zero;

        try
        {
            buffer = Marshal.AllocHGlobal(bufferLength);

            if (InternetQueryOption(IntPtr.Zero, InternetOptionProxy, buffer, ref bufferLength))
            {
                var ipi = (InternetProxyInfo)Marshal.PtrToStructure(buffer, typeof(InternetProxyInfo));
                return ipi;
            }
            {
                throw new Win32Exception();
            }
        }
        finally
        {
            if (buffer != IntPtr.Zero)
            {
                Marshal.FreeHGlobal(buffer);
            }
        }
    }
}

Этот код работает, если в настройках Windows есть прокси, его легко протестировать с помощью Fiddler.

Я мог бы прочитать значение из реестра, но это похоже на взлом

  RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", false);
  var autoConfigUrl = registry?.GetValue("AutoConfigURL");

Должен быть "правильный" способ сделать это?

Текущий тестовый код:

if (settingsViewModel.UseProxy)
        {
            // https://securelink.be/blog/windows-proxy-settings-explained/
            RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", false);
            var autoConfigUrl = registry?.GetValue("AutoConfigURL").ToString();
            var proxyEnable = registry?.GetValue("ProxyEnable").ToString();
            if (!string.IsNullOrEmpty(autoConfigUrl) && !string.IsNullOrEmpty(proxyEnable) && proxyEnable == "1")
            {
                settings.CefCommandLineArgs.Add("proxy-pac-url", autoConfigUrl);
            }
            else
            {
                var proxy = ProxyConfig.GetProxyInformation();
                switch (proxy.AccessType)
                {
                    case InternetOpenType.Direct:
                        {
                            //Don't use a proxy server, always make direct connections.
                            settings.CefCommandLineArgs.Add("no-proxy-server", "1");
                            break;
                        }
                    case InternetOpenType.Proxy:
                        {
                            settings.CefCommandLineArgs.Add("proxy-server", proxy.ProxyAddress.Replace(' ', ';'));
                            break;
                        }
                    case InternetOpenType.PreConfig:
                        {
                            settings.CefCommandLineArgs.Add("proxy-auto-detect", "1");
                            break;
                        }
                }
            }
        }

enter image description here

...