【问题标题】:Programmatically detect system-proxy settings on Windows XP with Python使用 Python 以编程方式检测 Windows XP 上的系统代理设置
【发布时间】:2010-11-07 06:44:49
【问题描述】:

我开发了一个跨国公司使用的关键应用程序。全球各地办公室的用户都需要能够安装此应用程序。

该应用程序实际上是 Excel 的一个插件,我们有一个基于 Setuptools 的 easy_install 的自动安装程序,可确保在用户打开 Excel 时自动安装或更新所有项目的依赖项。这一切都运行得非常优雅,因为用户很少意识到完全在后台进行的所有安装。

很遗憾,我们正在扩建和开设新办公室,这些办公室都有不同的代理设置。这些设置似乎每天都在变化,所以我们无法跟上那些在不告诉我们的情况下改变东西的外包安全人员。这很糟糕,但我们只需要解决它。

我想以编程方式检测用户运行的 Windows 工作站上的系统范围代理设置:

组织中的每个人都运行 Windows XP 和 Internet Explorer。我已经验证每个人都可以毫无问题地从 IE 下载我们的东西,无论他们身在何处。

所以我需要做的就是检测 IE 正在使用哪些代理设置并让 Setuptools 使用这些设置。理论上所有这些信息都应该在注册表中。但是有没有更好的方法来找到它,保证不会随着人们升级 IE 而改变?例如,是否有可用于发现代理设置的 Windows API 调用?

总结:

  • 我们在 Windows XP 上使用 Python 2.4.4
  • 我们需要检测 Internet Explorer 代理设置(例如主机、端口和代理类型)
  • 我将使用此信息动态重新配置easy_install,以便它可以通过代理下载egg 文件。

更新0:

我忘记了一个重要细节:每个站点都有一个自动配置“pac”文件。

Windows\CurrentVersion\InternetSettings\AutoConfigURL 中有一个键,它指向本地服务器上的 HTTP 文档,其中包含看起来像 javascript 文件的内容。

pac 脚本基本上是一系列嵌套的 if 语句,它们将 URL 与正则表达式进行比较,然后最终返回所选代理服务器的主机名。该脚本是一个名为 FindProxyForURL(url, host) 的单个 javascript 函数

因此,挑战在于找出任何给定服务器要使用哪个代理。唯一 100% 保证的方法是查找 pac 文件并从 Python 调用 Javascript 函数。

有什么建议吗?有没有更优雅的方法来做到这一点?

【问题讨论】:

标签: python windows networking proxy setuptools


【解决方案1】:

据我所知,在 Windows 环境下,如果没有设置代理环境变量,代理设置是从注册表的 Internet 设置部分获取的。 . 还不够吗?

或者你可以从注册表中获取一些有用的信息: 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,我想现在可能是 JavaScript 解析器问题?我对 JavaScript 几乎没有任何经验。有人刚刚告诉我微软的 scriptcontrol 可能有用:...这里不知道如何格式化源代码,我将演示代码发布到答案部分。
  • 是的,这就是解决方案!我可以通过 win32com 执行 Pac 文件并找到要使用的正确代理。不错。
  • @SalimFadhley,您是否有机会发布您用来发现要使用的正确代理的代码?如果可以的话,我将不胜感激!
【解决方案2】:

这是一个应该在您的系统托盘中创建子弹绿色(代理启用)或红色(代理禁用)的示例

它展示了如何在 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。
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 2015-03-14
  • 1970-01-01
相关资源
最近更新 更多