我开发了一个跨国公司使用的关键应用程序。全局办公室的用户都需要能够安装此应用程序。
该应用程序实际上是 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 函数。
有什么建议吗?有没有更优雅的方法来做到这一点?
最佳答案
这是一个示例,它应该在您的系统托盘中创建一个子弹绿色(代理启用)或红色(代理禁用)
它展示了如何读写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()
关于python - 使用 Python 以编程方式检测 Windows XP 上的系统代理设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1068212/