在Windows XP上使用Python编程检测系统,代理服务器设置(Programmaticall

2019-06-24 14:50发布

我开发由多国公司使用的关键应用。 在全球各地的分支机构的用户需要能够安装此应用程序。

该应用程序实际上是一个插件,Excel和我们有基于setuptools的easy_install的自动安装程序,确保所有项目的依赖关系自动安装或更新用户在他们的Excel开关的任何时间。 这一切都工作得非常优雅,因为用户很少意识到所有这些完全在后台发生的安装。

不幸的是,我们正在扩大,并开设新的办事处,所有有不同的代理服务器设置。 这些设置似乎每天都改变,因此,我们不能改变谁的东西,而告诉我们外包的安全家伙跟上。 它吮吸但是我们必须解决它。

我希望通过编程检测在Windows工作站我们的用户运行系统范围的代理设置:

每个人都在organisazation运行Windows XP和Internet Explorer。 我已经验证了,每个人都可以下载我们从IE浏览器的东西没有问题,无论他们是INT的世界里。

因此,所有我需要做的是检测IE浏览器正在使用什么代理服务器设置,让setuptools的使用这些设置。 理论上,所有的这些信息应该是在注册表..但有没有更好的方式来找到它保证不会与人改变升级IE? 例如有一个Windows API调用,我可以用它来发现代理服务器设置?

综上所述:

  • 我们使用Python 2.4.4在Windows XP
  • 我们需要检测Internet Explorer代理设置(如主机,端口和代理型)
  • 我将使用这些信息来动态地重新配置的easy_install,以便它可以通过代理下载鸡蛋文件。

UPDATE0:

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

有一个在的Windows \ CurrentVersion \互联网设定\ AutoConfigURL的关键指向包含什么看起来像一个JavaScript文件的本地服务器上的HTTP文件。

该PAC脚本基本上是一系列嵌套的if语句,其比较的URL对一个正则表达式,然后最终返回所选择的代理服务器的主机名。 该脚本称为FindProxyForURL一个JavaScript函数(URL,主机)

因此,我们面临的挑战是找出任何给定的服务器使用的代理服务器。 唯一100%保证的方式来做到这一点是查找PAC文件并调用从Python中的JavaScript功能。

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

Answer 1:

据我所知,在Windows环境中,如果没有代理设置环境变量,从注册表中的网络设置部分获得代理设置。 。 难道还不够吗?

或U可以从注册表获得一些有用的信息:HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \ Internet设置\访问代理服务器

编辑:
对不起,不知道如何格式化注释的源代码,我在这里贴一次。

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


Answer 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()


文章来源: Programmatically detect system-proxy settings on Windows XP with Python