2009-07-01 45 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() 
相關問題