2009-07-01 98 views
4

我开发了一家跨国公司使用的关键应用程序。全球各地办事处的用户需要能够安装此应用程序。使用Python以编程方式检测Windows XP上的系统代理设置

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

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

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

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

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

总结:

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

UPDATE0:

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

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

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

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

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

+0

如果您看到FindProxyForURL(url,host),那么它肯定是代理自动配置设置(PAC)http://en.wikipedia.org/wiki/Proxy_auto-config。您可以使用pacparser来解析java脚本文件以确定代理服务器和端口。 https://code.google.com/p/pacparser/ – 2014-03-21 06:45:04

回答

3

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

或U可以从注册表获得一些有用的信息: HKEY_CURRENT_USER \软件\微软\的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 
+0

你确定吗?我有“HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings”,但它不包含名为ProxyServer的对象。 – 2009-07-01 10:45:43

+0

我刚刚添加了一个更新,引入负载更复杂。 – 2009-07-01 10:57:21

4

这里是一个应该在你的系统托盘创建一个子弹绿色(代理启用)或红色(代理禁用)样品

它显示了如何阅读和在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() 
相关问题