使用Python在Windows XP上以编程方式检测系统代理设置
我开发了一个跨国公司使用的关键应用程序。全球各地办公室的用户都需要能够安装此应用程序 该应用程序实际上是Excel的一个插件,我们有一个基于Setuptools的easy_install的自动安装程序,确保用户在任何时候打开Excel时自动安装或更新项目的所有依赖项。这一切都非常优雅,因为用户很少意识到所有安装都是在后台进行的 不幸的是,我们正在扩大和开设新的办事处,这些办事处都有不同的代理设置。这些设置似乎每天都在变化,所以我们无法跟上外包安全人员的步伐,他们在不通知我们的情况下更改了内容。这很糟糕,但我们必须克服它 我想通过编程方式检测用户运行的Windows工作站上的系统范围代理设置: 组织中的每个人都运行Windows XP和Internet Explorer。我已经证实,无论我们的东西在世界的哪个角落,每个人都可以毫无问题地从IE下载我们的东西 所以我需要做的就是检测IE使用的代理设置,并让Setuptools使用这些设置。理论上,所有这些信息都应该在注册表中。。但是有没有更好的方法可以保证它不会随着人们升级IE而改变呢?例如,我是否可以使用Windows API调用来发现代理设置 总之:使用Python在Windows XP上以编程方式检测系统代理设置,python,windows,networking,proxy,setuptools,Python,Windows,Networking,Proxy,Setuptools,我开发了一个跨国公司使用的关键应用程序。全球各地办公室的用户都需要能够安装此应用程序 该应用程序实际上是Excel的一个插件,我们有一个基于Setuptools的easy_install的自动安装程序,确保用户在任何时候打开Excel时自动安装或更新项目的所有依赖项。这一切都非常优雅,因为用户很少意识到所有安装都是在后台进行的 不幸的是,我们正在扩大和开设新的办事处,这些办事处都有不同的代理设置。这些设置似乎每天都在变化,所以我们无法跟上外包安全人员的步伐,他们在不通知我们的情况下更改了内容。这
- 我们在Windows XP上使用Python 2.4.4
- 我们需要检测Internet Explorer代理设置(例如主机、端口和代理类型)
- 我将使用此信息动态重新配置easy_install,以便它可以通过代理下载egg文件李>
有什么建议吗?有没有更优雅的方法可以做到这一点?据我所知,在Windows环境中,如果未设置代理环境变量,则可以从注册表的“Internet设置”部分获取代理设置。 这还不够吗 或者你可以从注册表中获得一些有用的信息: HKEY\ U当前\用户\软件\ Microsoft\Windows\CurrentVersion\Internet设置\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
下面是一个示例,它应该在您的systray中创建一个项目符号绿色(代理启用)或红色(代理禁用) 它显示了如何在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()
你确定吗?我有“HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\Internet设置”,但它不包含名为ProxyServer.Salim的对象,我想现在可能是JavaScript解析器的问题了?我几乎没有JavaScript方面的经验。有人告诉我微软的scriptcontrol可能很有用:……我不知道如何在这里格式化源代码,我将演示代码重新发布到答案部分。是的,这就是解决方案!我可以通过win32com执行Pac文件,并发现要使用的正确代理。很好。@SalimFadhley,你有没有可能发布你用来发现要使用的正确代理的代码?如果你能,我将不胜感激!很好的解决方案,但请检查更新。顺便说一下,这必须在Excel后面无头运行,所以我们不能使用GTK。如果您看到FindProxyForURL(url,主机),那么它肯定是代理自动配置设置(PAC)。您可以使用pacparser来解析java脚本文件,以确定代理服务器和端口。可能重复的