Программно определять настройки системного прокси-сервера в Windows XP с помощью Python

StackOverflow https://stackoverflow.com/questions/1068212

Вопрос

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

Приложение на самом деле является плагином для 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 через прокси.

ОБНОВЛЕНИЕ0:

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

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

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

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

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

Это было полезно?

Решение

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

Или вы можете получить что-то полезное из реестра:HKEY_CURRENT_USER\Программное обеспечение\ Microsoft\Windows\CurrentVersion\ Настройки Интернета\Прокси-сервер

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

>>> 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

Другие советы

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

В нем показано, как читать и записывать данные в реестре 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top