Вопрос по python, windows – Программно определять настройки системного прокси в Windows XP с Python

4

Я разрабатываю критически важное приложение, используемое многонациональной компанией. Пользователи в офисах по всему миру должны иметь возможность установить это приложение.

Приложение на самом деле является плагином для Excel, и у нас есть автоматический установщик, основанный на easy_install от Setuptools, который гарантирует, что все зависимости проекта автоматически устанавливаются или обновляются каждый раз, когда пользователь включает свой Excel. Все это работает очень элегантно, поскольку пользователи редко знают обо всей установке, которая происходит полностью в фоновом режиме.

К сожалению, мы расширяем и открываем новые офисы с разными настройками прокси. Эти настройки, кажется, меняются изо дня в день, поэтому мы не можем идти в ногу с внешними сотрудниками службы безопасности, которые меняют вещи, не сообщая нам. Это отстой, но нам просто нужно обойти это.

Я хочу программно определять общесистемные настройки прокси на рабочих станциях Windows, которые запускают наши пользователи:

Все в организации работают под управлением Windows XP и Internet Explorer. Я убедился, что каждый может загрузить наши вещи из IE без проблем, независимо от того, где они находятся в мире.

Так что все, что мне нужно сделать, это определить, какие настройки прокси использует IE, и заставить Setuptools использовать эти настройки. Теоретически вся эта информация должна быть в Реестре ... но есть ли лучший способ найти ее, которая гарантированно не изменится при обновлении IE людьми? Например, есть ли вызов Windows API, который я могу использовать для определения настроек прокси-сервера?

В итоге

Мы используем Python 2.4.4 в Windows XP Нам нужно определить настройки прокси-сервера Internet Explorer (например, хост, порт и тип прокси) Я собираюсь использовать эту информацию для динамической перенастройки easy_install, чтобы он мог загружать файлы egg через прокси.

UPDATE0:

Я забыл одну важную деталь: на каждом сайте есть файл автоматической настройки "pac".

В Windows \ CurrentVersion \ InternetSettings \ AutoConfigURL есть ключ, который указывает на документ HTTP на локальном сервере, который содержит то, что выглядит как файл javascript.

Сценарий pac - это, в основном, последовательность вложенных операторов if, которые сравнивают URL-адреса с регулярным выражением, а затем в конечном итоге возвращают имя хоста выбранного прокси-сервера. Сценарий представляет собой одну функцию JavaScript, которая называется FindProxyForURL (url, host)

Поэтому задача состоит в том, чтобы выяснить для каждого конкретного сервера, какой прокси использовать. Единственный 100% гарантированный способ сделать это - найти файл pac и вызвать функцию Javascript из Python.

Какие-либо предложения? Есть ли более элегантный способ сделать это?

Если вы видите FindProxyForURL (url, host), то это определенно настройка автоконфигурации прокси (PAC) En.wikipedia.org / вики / Proxy_auto-конфигурации. Вы можете использовать pacparser для анализа файла сценария java, чтобы определить прокси-сервер и порт. Code.google.com / р / pacparser RP.

Ваш Ответ

2   ответа
4

который должен создать зеленый пул (включение прокси) или красный (отключение прокси) в вашем системном окне

Показывает, как читать и писать в реестре Windows

использует 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()
Хорошее решение, но, пожалуйста, проверьте обновление. Кстати, это должно выполняться без Excel, поэтому мы не можем использовать GTK. Salim Fadhley
3

в среде Windows, если не заданы переменные среды прокси, настройки прокси-сервера берутся из раздела настроек Интернета в реестре. , Разве этого не достаточно?

Или вы можете получить полезную информацию из реестра: HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ ProxyServer

Редактировать
извините за то, что не знаете, как форматировать исходный код комментария, я разместил его здесь.

>>> 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
Вы уверены? У меня есть «HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings», но он не содержит объект с именем ProxyServer. Salim Fadhley
Я только что добавил обновление, вносящее большую сложность. Salim Fadhley
Salim, я думаю, может быть, теперь это проблема с парсером JavaScript? У меня почти нет опыта работы с JavaScript. Кто-то просто сказал мне, что скрипт Microsoft Controlcontrol может быть полезен: ... не знаю, как форматировать исходный код, я публикую демо-код в ответной част sunqiang
Да, это решение! Я могу запустить файл Pac через win32com и найти правильный прокси для использования. Хороший Salim Fadhley
@ SalimFadhley, есть ли вероятность, что вы можете опубликовать код, который вы использовали, чтобы найти правильный прокси для использования? Я был бы признателен, если бы вы могли! duhaime

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