5

多国籍企業が使用する重要なアプリケーションを開発しています。世界中のオフィスのユーザーがこのアプリケーションをインストールできる必要があります。

このアプリケーションは実際には 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 ファイルをダウンロードできるようにします。

UPDATE0:

重要な詳細を 1 つ忘れていました。各サイトには、自動構成の「pac」ファイルがあります。

Windows\CurrentVersion\InternetSettings\AutoConfigURL には、javascript ファイルのように見えるものを含むローカル サーバー上の HTTP ドキュメントを指すキーがあります。

pac スクリプトは基本的に、URL を正規表現と比較し、最終的に選択したプロキシ サーバーのホスト名を返す一連のネストされた if ステートメントです。スクリプトは、FindProxyForURL(url, host) と呼ばれる単一の JavaScript 関数です。

したがって、課題は、特定のサーバーで使用するプロキシを見つけることです。これを行う唯一の 100% 保証された方法は、pac ファイルを検索し、Python から Javascript 関数を呼び出すことです。

助言がありますか?これを行うよりエレガントな方法はありますか?

4

2 に答える 2

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()
于 2009-07-01T10:54:28.580 に答える
3

私の知る限り、Windows 環境では、プロキシ環境変数が設定されていない場合、プロキシ設定はレジストリのインターネット設定セクションから取得されます。. 十分ではありませんか?

または、レジストリから何か有用な情報を取得できます: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\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
于 2009-07-01T09:59:40.797 に答える