servidor script responde problemas para error configurar configurado chrome automaticamente windows internet-explorer firefox proxy browser

windows - script - ¿Cómo averiguo la configuración del proxy del navegador?



problemas de proxy windows 10 (4)

Aquí hay un ejemplo de código completo de cómo llamar WinHttpGetIEProxyConfigForCurrentUser método winhttp.dll biblioteca winhttp.dll en C #

[TestClass] public class UnitTest1 { [StructLayout(LayoutKind.Sequential)] public struct WinhttpCurrentUserIeProxyConfig { [MarshalAs(UnmanagedType.Bool)] public bool AutoDetect; [MarshalAs(UnmanagedType.LPWStr)] public string AutoConfigUrl; [MarshalAs(UnmanagedType.LPWStr)] public string Proxy; [MarshalAs(UnmanagedType.LPWStr)] public string ProxyBypass; } [DllImport("winhttp.dll", SetLastError = true)] static extern bool WinHttpGetIEProxyConfigForCurrentUser(ref WinhttpCurrentUserIeProxyConfig pProxyConfig); [TestMethod] public void TestMethod1() { var config = new WinhttpCurrentUserIeProxyConfig(); WinHttpGetIEProxyConfigForCurrentUser(ref config); Console.WriteLine(config.Proxy); Console.WriteLine(config.AutoConfigUrl); Console.WriteLine(config.AutoDetect); Console.WriteLine(config.ProxyBypass); } }

Estoy escribiendo una herramienta de línea de comandos para Windows que usa libcurl para descargar archivos de Internet.

Obviamente, la descarga no funciona cuando el usuario está detrás de un servidor proxy, porque el proxy necesita ser configurado. Sin embargo, quiero mantener mi herramienta lo más simple posible y no tener que cargar al usuario con la necesidad de configurar el proxy. Mi herramienta ni siquiera tiene un archivo de configuración, por lo que el usuario tendría que pasar la configuración del proxy en cada comando, o establecer una variable de entorno o algo así - demasiada molestia.

Así que pensé, el navegador de todos generalmente ya estará configurado correctamente, el proxy configurado y todo. Esto será cierto incluso para el usuario más básico porque de lo contrario "su internet no funcionaría".

Entonces me imagino que puedo averiguar si usar un proxy mirando la configuración de proxy de IE.

¿Cómo hago esto? Más específicamente:

  • ¿Existe un conjunto de "configuración proxy" en Windows, utilizado por todos los navegadores (probablemente IE), o tendría que escribir diferentes rutinas para IE, Firefox, Opera, etc.?
  • Sé que probablemente pueda leer los valores directamente desde las ubicaciones de registro adecuadas si se configuran manualmente, pero ¿esto también funciona con "detectar automáticamente el servidor proxy"? ¿Tengo que molestarme con esa opción, o es (casi) nunca utilizada?

Antes de que la gente comience a sugerir alternativas: estoy usando C, por lo que estoy limitado a la API de Win32, y realmente quiero seguir usando C y libcurl.


Hay claves de registro para estos valores que puede obtener directamente, por supuesto. También podría hacer esto en .NET sin mucha molestia. Creo que el objeto WebClient negocia las configuraciones de proxy en función de la configuración actual. Esto se vería así en C #:

using System.Net; string url = "http://www.example.com"; WebClient client = new WebClient(); byte[] fileBuffer = client.DownloadFile(url);

O algo parecido a eso.


La función que está buscando es WinHttpGetIEProxyConfigForCurrentUser (), que está documentado en http://msdn.microsoft.com/en-us/library/aa384096(VS.85).aspx . Esta función es utilizada por Firefox y Opera para obtener su configuración de proxy por defecto, aunque puede anularlos por navegador. No hagas eso, sin embargo. Lo correcto (lo que hacen todos los demás) es obtener la configuración de IE y asumir que son correctas, ya que casi siempre lo son.

Aquí hay una muestra de la lógica relevante, que debe adaptar para sus necesidades:

if( WinHttpGetIEProxyConfigForCurrentUser( &ieProxyConfig ) ) { if( ieProxyConfig.fAutoDetect ) { fAutoProxy = TRUE; } if( ieProxyConfig.lpszAutoConfigUrl != NULL ) { fAutoProxy = TRUE; autoProxyOptions.lpszAutoConfigUrl = ieProxyConfig.lpszAutoConfigUrl; } } else { // use autoproxy fAutoProxy = TRUE; } if( fAutoProxy ) { if ( autoProxyOptions.lpszAutoConfigUrl != NULL ) { autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL; } else { autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT; autoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A; } // basic flags you almost always want autoProxyOptions.fAutoLogonIfChallenged = TRUE; // here we reset fAutoProxy in case an auto-proxy isn''t actually // configured for this url fAutoProxy = WinHttpGetProxyForUrl( hiOpen, pwszUrl, &autoProxyOptions, &autoProxyInfo ); } if ( fAutoProxy ) { // set proxy options for libcurl based on autoProxyInfo } else { if( ieProxyConfig.lpszProxy != NULL ) { // IE has an explicit proxy. set proxy options for libcurl here // based on ieProxyConfig // // note that sometimes IE gives just a single or double colon // for proxy or bypass list, which means "no proxy" } else { // there is no auto proxy and no manually configured proxy } }


Para Firefox / Seamonkey, el problema es un poco más complicado debido a la existencia de muchos perfiles.

Si desea suponer que solo hay un perfil, solo necesita encontrar prefs.js. Analiza network.proxy.type y luego lo usa para decidir qué valores relacionados leer.

Estoy trabajando en algunos documentos para Mozilla, así que ponga sus preguntas de seguimiento aquí (recuadro del cuadro marcado), e intentaré darle la información que necesita.