WinHTTP プロキシ設定ツール (proxycfg clone) by kanegon 1. 概要 WinHTTP(Windows HTTP Services) 用のデフォルトプロキシを設定します。 WinHTTP のデフォルトプロキシの設定には通常 proxycfg.exe のコマンドを使いま す。しかし、このコマンドは WinXP/2003 以降にしか添付されておらず、Win2K で プロキシを設定する手段がありませんでした。(※) このコマンドは proxycfg.exe と同等の機能を提供するもので、Win2K でのプロキ シ設定を可能にします。 なお、WinHTTP のデフォルトプロキシの設定は WinHttpSetDefaultProxyConfiguration() という専用の API を呼び出すだけで、大 したことをしているわけではありません。レジストリも直接参照していません。 ※ MSXML 4.0 SP2 をインストールすると proxycfg も同時にインストールされるよ うです。 2. 動作環境 以下の環境で動作を確認しています。 Windows 2000 SP4 Windows XP Pro SP2 WinXP SP1 以降であれば標準で proxycfg.exe が存在するため、当ツールは不要です。 また、Win2K SP2 以前、WinXP(SPなし) は、前提となる WinHTTP がないため、当ツー ルは動作しません。 当ツールは、基本的に Windows 2000 SP3/SP4 のために存在します。 3. インストール アーカイブには以下のファイルが含まれています。 proxyconfig.exe readme.txt これらのファイルを展開した後、任意のディレクトリにコピーしてください。 4. アンインストール インストールでコピーしたファイルをすべて削除してください。 5. 使い方 コマンドプロンプトを開き、proxyconfig.exe のあるディレクトリに移動します。 その後、以下のようにコマンドを入力します。 > proxyconfig [オプション] 6. コマンド書式 以下のオプションをサポートします。 それぞれのオプションは排他です(/v オプションを除く)。 proxyconfig : 現在のプロキシ情報を表示します。 proxyconfig /d : 直接アクセス(プロキシを使用しない)設定にします。 proxyconfig /p <サーバ名> [<バイパスリスト>] : プロキシサーバとプロキシをバイパスするアドレスのリストを 設定します。パイパスリストはオプションです。 サーバ名、バイパスリストの詳細は「7. 設定例」を参照して ください。 proxyconfig /u : IE から設定情報をインポートします。 インポートできる情報はプロキシサーバを直接指定している場合 の情報のみで、「設定を自動的に検出する」または「自動構成ス クリプトを使用する」で設定されたプロキシ情報をインポートす ることはできません。 proxyconfig /v : 詳細な情報を表示します。 proxyconfig /? : 簡単な使い方を表示します。 7. 設定例 いくつかの設定の例を示します。 > proxyconfig /p proxy.example.com:8080 "" proxy.example.com:8080 をプロキシサーバとして使用します。ただし、ローカル アドレスは除外され、直接接続となります。 "" はローカルアドレスを表現する特殊表記です。ここでいうローカルア ドレスとはピリオドを含まない名前を指します。 この例のように、明にプロトコルを指定しない場合、指定したプロキシサーバは HTTP と HTTPS の両方に有効になります。 > proxyconfig -p "http=http_proxy.example.com:8080 https=https_proxy.example.com:8080" "*.example.net;*.example.org;10.*;" HTTP 通信では http_proxy.example.com:8080、HTTPS 通信では https_proxy.example.com:8080 をプロキシとして使用します。 ただし、*.example.com、*.example.org、10.* およびローカルアドレスは除外さ れ直接接続します。 この書式では HTTP と HTTPS がそれぞれ区別されます。 > proxyconfig /d プロキシ設定を初期化し、常に直接接続を行います。 > proxyconfig /u 現在のユーザの IE の設定からプロキシ情報をインポートします。 このコマンドでインポートできるのはプロキシを直接記述した場合のみで、 自動構成のプロキシ設定情報をインポートすることはできません。 Microsoft によれば、proxycfg.exe の動作として proxycfg /d /p ... proxycfg /p ... が区別されるとの説明があります。しかし、WinHTTP の API 的に両者を区別できそ うな感じがせず、proxycfg がどのように処理しているかは不明です。 当ツールは /d と /p のオプションは排他として扱います。 8. 設定情報 以下に示すレジストリに格納された情報を取得または設定します。 これは WinHTTP のデフォルトプロキシ情報になります。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ Internet Settings\Connections\WinHttpSettings 9. 余談 9.1 WinHTTP について WinHTTP(Windows HTTP Services) は HTTP の高レベルインタフェースを提供する機 能です。 もともと Windows にはクライアント用の HTTP 通信機能として URLMon(WinInetベー ス) が存在します。 しかし、WinInet はクライアント用の機能であるため、ユーザのレジストリ情報 (HKCU)に依存したり、ユーザ認証などいくつかの操作で使用される GUI を内包して いる関係で、たとえばサービス内からの使用が困難などの問題がありました。 WinHTTP では GUI を想定せず、サービスなどからの使用も想定したものとしてして 設計され、Win2K SP3 で導入されました。プロキシ情報も HKLM のレジストリに格納 され、特定のユーザに依存しません。WinHTTP は WinINet に比べて、より安全で強 固であり、HTTP クライアントサービスを必要とするサーバアプリケーションは WinINet の代わりに WinHTTP を使うべきである、と Microsoft は主張しているよう です。 もっとも IE との互換性、自動認証ダイアログ、cookie の持続など、クライアント 機能を使用する場合には WinInet の方が適しているとも説明されています。 WinHTTP 5.1 は以下のシステムの OS コンポーネントとして提供されています。 Win2000 SP3 以降 (Datacenter Server を除く) WinXP SP1 以降 Windows Server 2003 family WinHTTP のプロキシ設定に関連する問題(注意点)は以下に示すようにいくつかあり あります。 - 異なる設計のサービスであるため、WinInet とはプロキシの設定方法が異なる。 - サービスやバックグラウンドの動作を想定しているため、ユーザ単位のプロキシ 設定(IE での設定)は利用されず、システム単位で設定を行う。 - プロキシの設定は、proxycfg.exe で行うが、Win2K ではコマンド自体が提供さ れない。 - Microsoft Windows Update(v5以降)と自動更新サービスの新しいバージョンで ファイル転送に使用されるバックグラウンド インテリジェント転送サービス (BITS) 2.0 では WinHTTP を利用する。 そのため、いやおうなしに意識せざるをえない。 しかし、この BITS が認識するプロキシのルールがややこしく、分かりにくい。 当ツールは WinHTTP のデフォルトプロキシを設定するものであり、IE (WinInet) の設定には影響を及ぼしません。 MSXML 4.0 SP2 をインストールすると proxycfg.exe も併せてインストールされる ようです。この方法で Win2K でも proxycfg.exe を導入することができます(ただ し、自分では未確認)。 MSXML 6.0 のインストールで proxycfg.exe がインストールされるかどうかは不明 です。 9.2 Windows Update、自動更新とプロキシの関係 Windows Update および自動更新の各サービスとプロキシの関係が非常にややこしく Windows Update v4 から v5 への移行ではずいぶんと大きな騒ぎになりました。 Windows Update v5(Microsoft Update含む)および自動更新ではいずれもファイル 転送に BITS(バックグラウンド インテリジェント転送サービス)を利用するように なりましたが、プロキシ設定の方法が一貫していないことも問題でした。 それぞれの関係についてわかる範囲で情報をまとめてみます。 ただし、以下のほとんどは自分で動作確認したものではなく、不正確な情報を含む 可能性があります。 a) Windows Update v5(Microsoft Update含む)と自動更新では BITS を使用する。 b) BITS は WinHTTP を使用する。 c) WinHTTP は以下のレジストリに格納された情報をデフォルトプロキシとして 利用する。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ Internet Settings\Connections\WinHttpSettings d) BITS では WinHTTP を単体で使用するのと異なり、以下の順番でプロキシを解決 する。 1) 自動構成(WPAD もしくは http:// か https:// で指定された .pac ファイル) で設定されているプロキシサーバ。 2) WinHTTP のデフォルトプロキシのレジストリに指定されたプロキシサーバ。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ Internet Settings\Connections\WinHttpSettings 3) プロキシサーバー無しと判断し、直接接続を行う。 e) WinHTTP が直接認識するプロキシ設定はあくまでレジストリの1箇所 d) の 1) で自動構成のプロキシが利用できるのはあくまで BITS 側の実装と考え られる。(WinHTTP にはデフォルト設定とは別に通信時に明示的にプロキシを設定 することが可能) f) d) で示された各情報は設定箇所が異なる。 自動構成(WPAD): IE の設定ではなく、常に解決を試みるらしい(?) (設定に依存しない) 自動構成(.pac ファイル): IE の [自動構成]>[自動構成スクリプトを使用する] の設定 (現在のユーザの IE 設定) WinHTTP のデフォルトプロキシ proxycfg コマンドで設定 (システムで一意なレジストリ) g) Windows Update と自動更新ではユーザが異なる。 Windows Update は現在のユーザ、自動更新では local SYSTEM ユーザとなる。 .pac ファイルを使う自動構成の場合、Windows Update では通常の IE のプロキ シ設定であり問題ない。自動更新の場合には、local SYSTEM アカウントの IE の プロキシ設定を有効にする必要がある。 なお、local SYSTEM アカウントは通常の方法ではログインできないユーザであ り、あえて .pac ファイルを使用した設定で対処するには - 「コンピュータ別にプロキシを設定する」ポリシーを設定した上で 管理者権限で IE の proxy を設定する - local SYSTEM アカウントのレジトスリ情報に IE の proxy を設定する local SYSTEM アカウント権限で特定のコマンドを実行するか、あるいは 直接レジストリを更新することで可能。レジストリは以下。 HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\ CurrentVersion\Internet Settings などがある。 h) WinHTTP のデフォルトプロキシの設定は WinHttpSetDefaultProxyConfiguration() の API 呼び出しで可能。この API は WinHTTP の機能として提供されているため、 Win2K でも問題なく使える。 i) Windows Update v5 で大きな問題となったのは、f)とg)の組み合わせ分かりにく かったためと思われる。 当ツールを使用して WinHTTP のプロキシを設定することで、Win2K でも問題がい くぶん単純化される(かもしれない)。 なお、自動更新を使用している場合、設定を即時反映させるためにはコマンド実行後 にサービスの再起動が必要です。 サービスの再起動を行うにはコマンドプロンプトで以下のコマンドを入力します。 > net stop wuauserv # サービスの停止 > net start wuauserv # サービスの再開 # これを書いた後で、再度 MSDN を読み返してみたが、まだかなりあやしそうな気が # する。特に WPAD の自動検出のあたり。 # 要、再調査。 9.3 WinHTTP、Windows Update 関連情報 「Windows HTTP Services」 http://msdn.microsoft.com/library/en-us/winhttp/http/winhttp_start_page.asp 「Windows Update に関する技術情報」 http://support.microsoft.com/kb/884101/JA/ 「Microsoft Update/Windows Update v6 の概要」 http://support.microsoft.com/kb/899788/JA/ 「サービスでは WinInet の使用はサポートされない」 http://support.microsoft.com/default.aspx?scid=kb;ja;JP238425 「ServerXMLHTTP に関してよく寄せられる質問 (FAQ)」 http://support.microsoft.com/default.aspx?scid=kb;ja;290761 「Windows Server 2003、Windows XP、Windows 2000 用のバックグラウンド インテリジェント転送サービス (BITS) 2.0 および WinHTTP 5.1 を含む 更新プログラム パッケージ」 http://support.microsoft.com/default.aspx?scid=kb;ja;842773 「自動構成スクリプトの指定方法によって Windows Update が失敗する」 http://support.microsoft.com/kb/890444/JA/ 「プロキシサーバーを利用して Windows Update にアクセスすると "エラー 0x80072EFD" が表示される」 http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B888859 「ServerXMLHTTP が動作するにはプロキシ構成ユーティリティを使用する」 http://support.microsoft.com/kb/289481/JA/ 10. 使用条件、免責 本プログラムおよびソースコードは自由に使用することができます。 本プログラムおよびソースコードの配布や改変に制限はなく、商用利用も可能としま す。改変した生産物に著作権表示も不要です。 本プログラムおよびソースコードは無保証です。 本プログラムおよびソースコードの使用において生じた如何なる損害についても作者 は一切の責任を負いません。 11. 修正履歴 ver0.01 2006.02.07 新規作成 ver0.01a 2006.02.09 readme.txt のみ修正 ver0.02 2006.02.11 メモリの解放誤り修正 ver0.03 2006.03.11 verbose モード追加 金子尚史(kanegon) e-mail : wbs01621@mail.wbs.ne.jp WebPage : http://www2.wbs.ne.jp/~kanegon/