it-swarm.com.de

Wie finde ich die Proxy-Einstellungen des Browsers heraus?

Ich schreibe ein Befehlszeilentool für Windows, das libcurl zum Herunterladen von Dateien aus dem Internet verwendet.

Offensichtlich funktioniert das Herunterladen nicht, wenn sich der Benutzer hinter einem Proxyserver befindet, da der Proxy konfiguriert werden muss. Ich möchte mein Tool jedoch so einfach wie möglich halten und muss den Benutzer nicht damit belasten, den Proxy konfigurieren zu müssen. Mein Tool hat nicht einmal eine Konfigurationsdatei, daher müsste der Benutzer ansonsten die Proxy-Einstellungen bei jedem Befehl übergeben oder eine Umgebungsvariable oder etwas anderes festlegen - viel zu viel Aufwand.

Also dachte ich, jeder Browser wird normalerweise schon richtig eingerichtet, Proxy konfiguriert und alles. Dies gilt auch für den einfachsten Benutzer, da ansonsten "das Internet nicht funktioniert".

Aus diesem Grund kann ich anhand der Proxy-Einstellungen des IE herausfinden, ob ein Proxy verwendet werden soll.

Wie gehe ich vor? Genauer:

  • Gibt es eine Reihe von "Proxy-Einstellungen" in Windows, die von allen Browsern (wahrscheinlich IE) verwendet werden, oder muss ich verschiedene Routinen für IE, Firefox, Opera usw. schreiben?
  • Ich weiß, dass ich die Werte wahrscheinlich direkt aus den entsprechenden Registrierungspfaden lesen kann, wenn sie manuell konfiguriert werden. Funktioniert dies auch mit "Proxy-Server automatisch erkennen"? Muss ich mich überhaupt mit dieser Option beschäftigen oder wird sie (fast) nie genutzt?

Bevor jemand Alternativen vorschlägt: Ich verwende C, bin also auf die Win32-API beschränkt und möchte wirklich C und libcurl weiterhin verwenden.

25
rix0rrr

Die gesuchte Funktion ist WinHttpGetIEProxyConfigForCurrentUser (), die unter http://msdn.Microsoft.com/en-us/library/aa384096(VS.85).aspx dokumentiert ist. Diese Funktion wird von Firefox und Opera standardmäßig verwendet, um die Proxy-Einstellungen abzurufen. Sie können sie jedoch auch pro Browser außer Kraft setzen. Tu das aber nicht. Das Richtige (was alle anderen tun) ist, einfach die Einstellungen für IE abzurufen und anzunehmen, dass sie korrekt sind, da dies fast immer der Fall ist.

Hier ist ein Beispiel der relevanten Logik, die Sie an Ihre Bedürfnisse anpassen sollten:

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
    }
}
36
JSBձոգչ

Hier finden Sie ein vollständiges Codebeispiel zum Aufrufen der Methode WinHttpGetIEProxyConfigForCurrentUser aus der Bibliothek winhttp.dll in 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);
    }
}
3
Maksym Kozlenko

Es gibt Registrierungsschlüssel für diese Werte, auf die Sie natürlich direkt zugreifen können. Sie können dies auch in .NET ohne großen Aufwand tun. Ich glaube, das WebClient-Objekt handelt die Proxy-Einstellungen für Sie basierend auf den aktuellen Einstellungen aus. Dies würde in C # so aussehen:

using System.Net;

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

Oder etwas in der Nähe davon.

1
justin.m.chase

Für Firefox/Seamonkey ist das Problem aufgrund der vielen vorhandenen Profile etwas kniffliger.

Wenn Sie davon ausgehen möchten, dass es nur ein Profil gibt, müssen Sie nur prefs.js suchen. Sie analysieren die Datei "network.proxy.type" und entscheiden anhand dieser Datei, welche zugehörigen Werte gelesen werden sollen.

Ich arbeite an einigen Dokumenten für Mozilla, also stelle deine folgenden Fragen hier (angekreuztes Wiki-Feld) und ich versuche dir die Informationen zu geben, die du brauchst.

0
benc