2015年11月9日月曜日

プロキシ設定とレジストリ

(この記事は以前にウェブページで公開した内容をブログに移行したものです)

ノートパソコンの無線LANの接続先によってシステムのプロキシ設定を変えたいことってありませんか?そのためには、ソフトウェアからシステムのプロキシをいじる必要があります。 しかし、多分、インターネットオプションのプロキシ設定をいじるAPI的なものは無いです。いや、もしかしたらあるのかもしれませんが、情弱な私は見つけられませんでした。ですが、プロキシの設定がレジストリに書き込まれるという情報を得たので、どう書き込まれるのかレジストリを研究してみることにしました。

注意:これは私の独自研究であり、正確性を保証するものではありません。この記事を信用してレジストリをいじっていかなる不具合や損害が起きても当方では一切責任を負いません。

どこの設定の話?

インターネットオプションの「LANの設定」の項目での設定の話です。FirefoxやOperaのプロキシの設定とは違います。IE以外のブラウザはたいてい独自にそのブラウザのみプロキシを履いてインターネットに接続する仕組みを持っているようですが、IEのプロキシ設定はWindowsシステムと共通のものとなっているようです。そして、事実上、様々なソフトがこの設定を使ってプロキシを認識しているようなので、プロキシ環境下でインターネット接続をする場合はここの設定が必要になる場合が非常に多いです。


プロキシの設定で戦ったことがある人ならば誰もが見たことがあるであろうこのダイアログボックスです。今回は、このダイアログボックスで設定できるすべての項目(詳細設定ダイアログも含む)について調べていきます。

設定は一体どこに書き込まれるのか?

ズバリ、レジストリの
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\
と、その子エントリだと思われます。実際、ここにもProxyEnableなどのそれらしいキーが散見されますね。しかし、おそらくそのProxyEnableなどは飾りで、これらのそれらしいキーを変更しても期待される動作はしないっぽいです。ProxyEnableなどのレジストリキーは見るからにしてわかりやすいのでそれを読み込んでプロキシ設定をするソフトもあるようですが、Windowsシステムの本命はここではないようです。

では、その本命はどこかと言うと
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\DefaultConnectionSettings
です。プロキシ設定というか、インターネットオプションの「LANの設定」の項目はすべてこのキーの中に保管されています。その下に似たようなキー 「SavedLegacySettings」がありますが、名前からしてバックアップっぽいですよね。確証はありませんが。でも、こっちは基本いじらなく ても大丈夫っぽいです。

環境によっては、DefaultConnectionSettingsとSavedLegacySettings以外のエントリがあるかもしれません。それらのエントリを見ると、そのWndowsに保存しているVPN設定名だったりするので、もしかしたらそのあたりの設定も入っているのかもしれませんが、今回はとりあえずDefaultConnectionSettingsのみに注目していきます。

バイナリデータの構造

で、そのDefaultConnectionSettingsについてなんですが、色々調べているとこの辺までたどり着いている人は結構いるっぽいんですが、結局バイナリ データということで敬遠して諦めてしまっている人が多いように見受けられました。しかし、バイナリデータの構造なんていうのは、古い時代?からプログラミ ングしている人が考えることはだいたい一緒です。着目すべきところに着目すれば、構造が自然と見えてきました。
というわけで、レジストリ設定をポチポチ変えながらDefaultConnectionSettingsのどこが変化したかを追っていきました。その結果わかったバイナリデータの構造は下記の通りです。

 インデックス 型内容
0DWORD0x46(ヘッダー?よくわからない)
4DWORD内容が更新されるたびに値がインクリメントされているっぽい。
8DWORDチェックボックスのフラグ。2^0のビットを0ビット目…2^31のビットを31ビット目と呼ぶと
1ビット目:プロキシを使うかどうか(使うなら1)
2ビット目:自動構成スクリプトを使うかどうか(使うなら1)
3ビット目:設定を自動的に検出するかどうか(検出するなら1)
12DWORDプロキシの長さ(インデックス16からの文字列の長さ)
16BYTE配列プロキシをASCII文字列で記述している。
全てのプロトコルが同じプロキシの場合、URL:ポートのフォーマット
プロトコルで違う場合、http=URL:ポート;https=URL:ポート;ftp=URL:ポート;socks=URL:ポート
といった具合の文字列になっている。
16+プロキシ長DWORDプロキシを使用しないアドレスの長さ
20+プロキシ長BYTE配列プロキシを使用しないアドレスがASCII文字列で記述してある。
複数の場合は;で区切ってあり、「ローカルアドレスはプロキシサーバーを使用しない」にチェックが入れられている場合は、さらに<local>が付く。
20+プロキシ長+不使用長DWORD自動構成スクリプトのアドレスの長さ
24+プロキシ長+不使用長BYTE配列自動構成スクリプトのアドレスがASCII文字列で記述してある。


ここまでわかっていれば、あとはレジストリ編集でLANの設定をレジストリ編集で行ったり、またはそこから読み出したりすることができます。文字列みたいにバイト数が定まらないデータを保存する際は、そのデータを記述する前にその長さを書き込んでやればいいっていうのは定石ですよね。
この上記の表の最後にある「自動構成スクリプトのアドレス」よりも後にもデータがあるようですが、何の設定なのかはよくわかりませんでした。まあ、そこがわからなくてもプロキシ設定は全部マークできているのでノータッチにしておけば問題ないでしょう。あ、ちなみにWindowsが動いているIntelのCPUのアーキテクチャはDWORDなどの2バイト以上あるデータはリトルエンディアンで記述されるっていうのはいいですよね。
あとは、この設定と連動してHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion \Internet Settings\以下のProxyEnable、ProxyOverride、ProxyServerなどのレジストリキーをいい感じに編集しておけば、よりそれらしい挙動になると思います。プロキシ設定を読み込むソフトウェアによっては、これらのレジストリキーを参照しているものも少なくないので、DefaultConnectionSettingsと同時にこれらを書き換えておくのが安牌です。

これらの一連の設定を行う機能をソフトウェアに組み込めば、この記事の冒頭に書いたニーズのソフトウェアとかが作れるわけです。(´◔౪◔)۶ヨッシャ!
そして、それを実際に実装したソフトがSSIDProxyです。よろしくね!

※この記事はWindows 8 Pro with MediaCenter (64bit版)において実験的に調べたものです。他の環境に当てはまるかどうかは未検証ですし、不備や間違いがあるかもしれません。ご利用は自己責任でお願いいたします。

0 件のコメント:

コメントを投稿