用Python编程检测Windows XP上的系统代理设置

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

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

不幸的是,我们正在扩大和开设新的办事处,这些办事处都有不同的代理设置 这些设置似乎每天都在变化,所以我们无法跟上那些没有告诉我们的外包安全人员。 它很烂,但我们只需要解决它。

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

组织中的每个人都运行Windows XP和Internet Explorer。 我已经证实,每个人都可以从IE下载我们的东西,不pipe它们在哪里,都不会有问题。

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

综上所述:

  • 我们在Windows XP上使用Python 2.4.4
  • 我们需要检测Internet Explorer代理设置(例如主机,端口和代理types)
  • 我将使用这些信息dynamic地重新configurationeasy_install,以便它可以通过代理下载egg文件。

UPDATE0:

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

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

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

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

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

据我所知,在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 

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

它显示了如何在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()