我开发由多国公司使用的关键应用。 在全球各地的分支机构的用户需要能够安装此应用程序。
该应用程序实际上是一个插件,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功能。
有什么建议? 有没有更优雅的方式来做到这一点?
据我所知,在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
下面是应该在你的系统托盘创建一个子弹绿色(代理启用)或红色(代理禁用)样本
它显示了如何阅读和在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()