5 Stimmen

Programmatische Erkennung von System-Proxy-Einstellungen unter Windows XP mit Python

Ich entwickle eine wichtige Anwendung, die von einem multinationalen Unternehmen genutzt wird. Benutzer in Büros auf der ganzen Welt müssen in der Lage sein, diese Anwendung zu installieren.

Die Anwendung ist eigentlich ein Plugin für Excel, und wir haben ein automatisches Installationsprogramm auf der Grundlage von Setuptools' easy_install, das sicherstellt, dass alle Abhängigkeiten eines Projekts automatisch installiert oder aktualisiert werden, sobald ein Benutzer sein Excel einschaltet. Das Ganze funktioniert sehr elegant, da die Benutzer nur selten etwas von der Installation mitbekommen, die vollständig im Hintergrund abläuft.

Leider expandieren wir und eröffnen neue Büros, die alle unterschiedliche Proxy-Einstellungen haben. Diese Einstellungen scheinen sich von Tag zu Tag zu ändern, so dass wir nicht mit den ausgelagerten Sicherheitsexperten Schritt halten können, die Dinge ändern, ohne uns zu informieren. Das ist ärgerlich, aber wir müssen einfach damit umgehen.

Ich möchte die systemweiten Proxy-Einstellungen auf den Windows-Workstations, die unsere Benutzer verwenden, programmatisch erkennen:

Jeder in der Organisation benutzt Windows XP und den Internet Explorer. Ich habe mich vergewissert, dass jeder unser Material problemlos aus dem IE herunterladen kann, unabhängig davon, wo auf der Welt er sich befindet.

Ich muss also nur noch herausfinden, welche Proxy-Einstellungen der IE verwendet, und Setuptools dazu bringen, diese Einstellungen zu verwenden. Theoretisch sollten alle diese Informationen in der Registrierung sein.. aber gibt es einen besseren Weg, um es zu finden, die garantiert nicht mit Menschen Upgrade IE zu ändern ist? Gibt es zum Beispiel einen Windows-API-Aufruf, mit dem ich die Proxy-Einstellungen ermitteln kann?

Zusammengefasst:

  • Wir verwenden Python 2.4.4 unter Windows XP
  • Wir müssen die Proxy-Einstellungen des Internet Explorer ermitteln (z. B. Host, Port und Proxy-Typ)
  • Ich werde diese Informationen verwenden, um easy_install dynamisch neu zu konfigurieren, damit es die Eizellen-Dateien über den Proxy herunterladen kann.

UPDATE0:

Ich habe ein wichtiges Detail vergessen: Jeder Standort hat eine automatische Konfigurationsdatei "pac".

Es gibt eine Taste in Windows \CurrentVersion\InternetSettings\AutoConfigURL die auf ein HTTP-Dokument auf einem lokalen Server verweist, das so etwas wie eine Javascript-Datei enthält.

Das pac-Skript ist im Grunde eine Reihe von verschachtelten if-Anweisungen, die URLs mit einem Regexp vergleichen und schließlich den Hostnamen des gewählten Proxy-Servers zurückgeben. Das Skript ist eine einzige Javascript-Funktion namens FindProxyForURL(url, host)

Die Herausforderung besteht also darin, für einen bestimmten Server herauszufinden, welcher Proxy zu verwenden ist. Der einzige Weg, der dies zu 100 % garantiert, ist das Nachschlagen in der pac-Datei und der Aufruf der Javascript-Funktion in Python.

Irgendwelche Vorschläge? Gibt es einen eleganteren Weg, dies zu tun?

4voto

rapdum Punkte 313

Hier ist ein Beispiel, das eine grüne (Proxy aktivieren) oder rote (Proxy deaktivieren) Kugel in Ihrem Systray erzeugen sollte

Es zeigt, wie man in der Windows-Registrierung lesen und schreiben kann

es verwendet gtk

#!/usr/bin/env python
import gobject
import gtk
from _winreg import *

class ProxyNotifier:
    def __init__(self):        
        self.trayIcon = gtk.StatusIcon()
        self.updateIcon()

        #set callback on right click to on_right_click
        self.trayIcon.connect('popup-menu', self.on_right_click)
        gobject.timeout_add(1000, self.checkStatus)

    def isProxyEnabled(self):

        aReg = ConnectRegistry(None,HKEY_CURRENT_USER)

        aKey = OpenKey(aReg, r"Software\Microsoft\Windows\CurrentVersion\Internet Settings") 
        subCount, valueCount, lastModified = QueryInfoKey(aKey)

        for i in range(valueCount):                                           
            try:
                n,v,t = EnumValue(aKey,i)
                if n == 'ProxyEnable':
                    return v and True or False
            except EnvironmentError:                                               
                break
        CloseKey(aKey)  

    def invertProxyEnableState(self):
        aReg = ConnectRegistry(None,HKEY_CURRENT_USER)
        aKey = OpenKey(aReg, r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", 0, KEY_WRITE)
        if self.isProxyEnabled() : 
            val = 0 
        else:
            val = 1
        try:   
            SetValueEx(aKey,"ProxyEnable",0, REG_DWORD, val) 
        except EnvironmentError:                                          
            print "Encountered problems writing into the Registry..."
        CloseKey(aKey)

    def updateIcon(self):
        if self.isProxyEnabled():
            icon=gtk.STOCK_YES
        else:
            icon=gtk.STOCK_NO
        self.trayIcon.set_from_stock(icon)

    def checkStatus(self):
        self.updateIcon()
        return True

    def on_right_click(self, data, event_button, event_time):
        self.invertProxyEnableState()
        self.updateIcon()

if __name__ == '__main__':
    proxyNotifier = ProxyNotifier()
    gtk.main()

3voto

sunqiang Punkte 6274

Soweit ich weiß, werden in einer Windows-Umgebung, wenn keine Proxy-Umgebungsvariablen gesetzt sind, die Proxy-Einstellungen aus dem Abschnitt "Interneteinstellungen" der Registrierung bezogen. . Reicht das nicht aus?

Oder Sie können nützliche Informationen aus dem Register erhalten: HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\Internet Einstellungen \ProxyServer

Editar:
Entschuldigung, dass ich nicht weiß, wie man den Quellcode des Kommentars formatiert, ich poste ihn hier.

>>> import win32com.client
>>> js = win32com.client.Dispatch('MSScriptControl.ScriptControl')
>>> js.Language = 'JavaScript'
>>> js.AddCode('function add(a, b) {return a+b;}')
>>> js.Run('add', 1, 2)
3

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X