ラベル プロキシ設定 の投稿を表示しています。 すべての投稿を表示
ラベル プロキシ設定 の投稿を表示しています。 すべての投稿を表示

2015年11月27日金曜日

ProxySwitcher ver.1.0.0

さて、先日公開しましたSSIDProxy ver.1.1.1ですが、実はこっそりプロキシ設定機能の分離を行っておりました。ProxySwitcher.dllっていう新しいDLLが付属するようになったことが勘の良い方は気づいたかもしれません。
なぜ分離したかと言いますと、まあ、プログラムのモジュール化どうこうみたいな話はとりあえず置いておいて、私以外の他人がこれを直接いじれるようにするためです。 先日、ネットサーフィンと言いますか、いわゆるエゴサをしていたところ、VB.NETでプロキシ設定をいじることに苦労されている方がいるのを見かけました。私もこちらの記事で書いたように、一生懸命調べ、レジストリを解析し、やっとC#で設定できるようにこぎつけた経緯があり、この成果を多くの方に使ってもらえるよう、レジストリのデータ構造だけでなくやっぱりライブラリとして公開しようと思い至りました。

というわけで、SSIDProxyに組み込んでいたプロキシ切り替え機能の部分を抽出し、ライブラリとしました。それがProxySwitcherです。
(ちなみに、先日お話をしましたレジストリの変更通知を吐くライブラリもこれに組み込まれています。レジストリの変更通知だけを使いたい方もこのライブラリをどうぞ)

プロキシ設定の仕組み

復習ですが、Windowsのプロキシ設定にかかわるレジストリの項目は下記のようになっています。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
┣Connections
┃┖DefaultConnectionSettings
┠AutoConfigURL
┠ProxyEnable
┠ProxyServer
┖ProxyOverride

システムはこのうちのDefaultConnectionSettingsに格納されているバイナリデータのみを読み込み、それをプロキシ設定として扱うようになっているようです。しかし、バイナリデータだけでは人間には中身がよくわからないからか、Internett Settings直下の各値にも同じデータを格納してくれるので、これを読み込むことで現在の設定を知ることも可能です。しかし、これはあくまでもダミーで、これを書き換えたところでシステムはそれをプロキシ設定として認識されないことに注意してください。
すなわち、プロキシ設定の読み出しにはDefaultConnectionSettingsを解読するのが素直で、書き込みの時にはDefaultConnectionSettingsとProxyEnableなどの値に適切な値を書き込む必要があるといえます。

ProxySwitcherの使い方

SystemLanSettingsクラス

上記のようなプロキシ設定を行うクラスがSystemLanSettingsクラスです。このクラスは以下のプロパティを持っています。
  • AutomaticallyDetectSettings
  • UseScript
  • ScriptAddress
  • UseProxy
  • Proxy
  • ProxyOverride
これらのプロパティを読み込み、書き込みをすることでシステムのプロキシ設定を読み込み、書き込みすることができます。また、このクラスはレジストリの変更を監視し、プロキシ設定が変化したらそれを通知する機能が付いています。その通知はINotifyPropertyChangedインターフェースによるプロパティ変更通知の実装で実現されているので、変更されたプロキシ設定に対応するプロパティの変更通知として飛んできます。また、レジストリ監視はWin32APIを使用しており、終了時に各種ハンドルを解放しなければならないので、IDisposableインターフェースを実装しております。インスタンスが不必要になったときはDisposeメソッドを呼び出す必要があります
多くのプロパティはstring型かbool型なのでわかりやすいかと思います。しかし、ProxyOverrideはプロキシの不使用をするアドレスを列挙したList<string>型になっているので注意してください。ローカルアドレスにもプロキシを使用しない場合は"<local>"というテキストをそのリストに含ませる必要があります。また、ProxyプロパティはProxySettings型になっております。

ProxySettingsクラス

プロキシ設定を保持するためのクラスです。WindowsはHTTP、HTTPS、FTP、Socksの4種類のプロトコルに対して個別にプロキシサーバーを設定することができます(使ったことないですが)。なので、ProxySettingsクラスはそれに合わせて
  • HttpProxy
  • HttpsProxy
  • FtpProxy
  • SocksProxy
の4つのプロパティを持っており、それぞれの値を設定できます。
このクラスは初期化時以外では値を書き換えることができない(immutableな)設計がされています。プロキシを設定した場合は適当に値を書き換えた上で新しいインスタンスを作ってあげてください。
ちなみに、コンストラクタのオーバーロードがいくつかありますが、そのうちでもstring型のテキストを受け取るものは、レジストリのProxyServerの値をそのまま受け取ってインスタンス化できるものになっています。また、ProxySettingsのインスタンスをToStringするとそのProxyServerのレジストリ値に書き込めるタイプのフォーマットになります。
なお、このクラスで扱われるそれぞれのプロキシ設定はProxy型になっています。

Proxyクラス

これはサーバーのアドレスとポートの2つの値を保持するためだけのクラスです。ProxySettingsクラスと同様にimmutableな設計をしています。string1つを受け取るコンストラクタは「URL:ポート番号」の書式のテキストを受け付けます。

LanSettingsクラス

今まではシステムのLAN設定を読み書きするためのクラスと、そのクラスに付随したクラスの説明をしましたが、単にLAN設定を保持するためのLanSettingsクラスもあります。このクラスのプロパティを読み書きしてもシステムのLAN設定が変化することはありませんが、SystemLanSettings.ToData()やSystemLanSettings.FromData()というstaticメソッドを介してシステムのLAN設定とLanSettingsインスタンスを相互変換できます。この場合、SystemLanSettingsクラスのインスタンスを作るのに比べてレジストリ監視に伴うオーバーヘッドを減らせますし、Dispose()メソッドを呼ぶ必要も無いので扱いやすいかと思います。

サンプルコード

static void Main(string[] args)
{
    LanSettings stg = SystemLanSettings.ToData();
    Console.WriteLine(stg);

    using(var sysstg = new SystemLanSettings()) {
        sysstg.PropertyChanged += (s, e) => Console.WriteLine($"\"{e.PropertyName}\" has changed.");

        Console.WriteLine("Watching LAN Settings...");
        Console.ReadLine();
    }

    Console.WriteLine("Stop Watching.");
    Console.WriteLine("Press Enter to exit...");
    Console.ReadLine();
}

このプログラムを実行するとこんな感じになります。


最初に現在の設定を表示しております。そのあとにインターネットオプションからいくらかプロキシ設定をいじってみたところ、ちゃんとレジストリ変更を認識して画面に表示してくれています。最後にEnterを押せば監視を終了してくれます。

おまけ:レジストリ監視

このライブラリはレジストリ監視機能を含んでいます。ProxySwitcher.Registry.Watcher名前空間内のRegistryWatcherがそれです。面倒くさいんでサンプルプログラムで使い方は察してください。

static void Main(string[] args)
{
    using(var watcher = new RegistryWatcher(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings")) {
        watcher.ValueChanged += (s, e) => {
            foreach(var info in e.ChangeInfo)
                Console.WriteLine(info);
        };
        watcher.SubKeyChanged += (s, e) => {
            foreach(var key in e.CreatedKeyNames)
                Console.WriteLine($"\"{key}\" has created.");
            foreach(var key in e.DeletedKeyNames)
                Console.WriteLine($"\"{key}\" has deleted.");
        };

        Console.WriteLine("Watching LAN Settings...");
        Console.ReadLine();
    }

    Console.WriteLine("Stop Watching.");
    Console.WriteLine("Press Enter to exit...");
    Console.ReadLine();
}

実行結果はこんな感じになります。


このクラスでは指定したキーの直下にある値の変更、指定したキーの直下へのキーの作成、削除を認識できます。これをうまく使って上記のSystemLanSettingsクラスはプロキシ設定の変更通知を行っています。ちゃんとそのキー下の値やキー名を記憶しておいて、変更があった時に素の差分を通知してくれるようになっています。

免責事項

このソフトウェアを使用することによって発生したいかなるトラブル(データ喪失、パソコン故障、データ流出等)についても、作成者は責任を負わないものといたします。特に、このソフトウェアは独自研究によるレジストリ編集を行っているため、その方法が完全ではなかったり、Windowsのバージョン・システム構成等の環境によって正常に動作しない可能性があります。場合によっては重大なトラブルを引き起こす可能性がありますので、そのようなリスクをご承知の上、ご利用ください。
なお、このソフトウェアを起動した時点で、免責事項を読んだかどうかにかかわらず、これらの免責事項に同意したものとみなします。
テンプレですが、どうぞご注意、ご理解くださいませ。

ライセンス

さて、このライブラリのライセンスをどうしようか考えましたが、SSIDProxyの開発に伴って作ったものということもあり、基本的にはSSIDProxyに準じ、それ以外に下記の条項を付け加えています。
  • このライブラリを改変してはならない。
  • 有償アプリケーションには使用してはならない。
  • 使用方法やバグに関するサポートをする責任を作者は負わない。
  • 完成したソフトウェアのどこか(ヘルプ、バージョン情報など)と、ReadMeなどのドキュメンテーションに私のライブラリを使用したことを明記すること。ただし、作者がこのライブラリを使用するときはその限りではない。
  • このライブラリを利用したアプリケーションをユーザーが配布するときに限って、作者に無断で再配布できるものとする。ただし、必要最小限のファイルに留めること。
今時クローズドソースも流行らないかもしれませんが、まあ、とりあえず現状はこのような形で。ニーズが出てきたら適宜ライセンスを変更してオープンソースにするかもしれません。

ダウンロード

SSIDProxyをダウンロードしてください。
SSIDProxy ver.1.1.1
そのうちの 
  • bin\ProxySwitcher.dll
  • bin\ja-JP\ProxySwitcher.resources.dll
の2つがProxySwitcherで必要なファイルです。プロジェクトからProxySwitcher.dllを参照をして使用してください。

2015年11月26日木曜日

SSIDProxy ver.1.1.1

さて、前回に引き続きSSIDProxyを更新いたしました。いちいち概要や使い方を何度も書くのもアレなので、初めてこのソフトについて知った方は前回の記事を読んでください。今回の更新は主にディテールのリファインやリファクタリングですが、表に出てくるような変更点としては下記のとおりです。

今回の変更

【新機能】
    • 他のアプリケーションによるプロキシ設定の変更を検知できるようになった。
    【機能変更】
    • 翻訳の改善
    • ポップアップ、タスクトレイアイコンのツールチップのメッセージを微妙に変更
    【バグ修正】
    • 一部環境でLAN設定の読み込み時に不正終了するバグの修正
    • 一部レジストリ設定の挙動模倣が不十分だったので修正
    • 自動設定用スクリプトの設定機能が不十分だったのを修正
    • ManagedNativeWifiはManaged Wifi APIの派生プロジェクトではありませんでした。バージョン情報等の謝辞を一部変更しています。
    まず、今回のバージョンからレジストリを監視し、他のアプリケーション(もちろんインターネットオプションからの変更を含む)によるプロキシの変更を検知し、ポップアップでお知らせできるようにしました。
    他のアプリケーションによってルールに違反した設定がされたとき、すぐさま元に戻すような機能を実装しよかと一瞬考えましたが、そのプロキシを設定した側のソフトで意図しない動作が起こる可能性や、もしくはSSIDProxyと同様のソフトが同時に動作していた場合、プロキシの設定の変更合戦になってしまうことを考えて、通知に留めました。SSIDProxyの保持しているルールに則った設定に戻したい場合は、アイコンを右クリックして今すぐルールを適用すればおkです。

    なお、上の箇条書きのところには書いておりませんが、内部的にルールの保存データのフォーマットが若干変更になっています。ver.1.1.0からのコンバーターは内蔵しているので、上書きインストールをすれば特に気にすることなく新データに移行してくれますが、多分次のバージョンでそのコンバーターが削除されるので、ver.1.1.1を介さずにver.1.1.0のデータを引き継ぐことはできなくなるかと思います。

    免責事項

    このソフトウェアを使用することによって発生したいかなるトラブル(データ喪失、パソコン故障、データ流出等)についても、作成者は責任を負わないものといたします。特に、このソフトウェアは独自研究によるレジストリ編集を行っているため、その方法が完全ではなかったり、Windowsのバージョン・システム構成等の環境によって正常に動作しない可能性があります。場合によっては重大なトラブルを引き起こす可能性がありますので、そのようなリスクをご承知の上、ご利用ください。
    なお、このソフトウェアを起動した時点で、免責事項を読んだかどうかにかかわらず、これらの免責事項に同意したものとみなします。
    テンプレですが、どうぞご注意、ご理解くださいませ。

    ダウンロード

    SSIDProxy ver.1.1.1

    2015年11月9日月曜日

    SSIDProxy ver.1.1.0

    (2015/11/26追記)現在の最新版はver.1.1.1になっています。こちらからどうぞ。


    さて、前回の記事で紹介したレジストリをいじってプロキシ設定をする方法を実装し、さらにネットワーク接続状況が変わると自動的にSSIDに応じて設定したプロキシ設定に切り替えてくれるソフトを作りました。それが、SSIDProxyです。

    実は、近々閉鎖予定のウェブページにも公開しておりますが、2年以上前に作ったソフトということもあり、大幅にリファクタリングを行いました。というよりプロジェクトを新規で作り直すレベルで作り直しました。私自身、当時よりプログラミングのスキルが上がっているわけですし、C#やその他のライブラリも大きく進化しております。それらを含めて多少の改善と、あとは多少の機能追加も行いました。

    というわけで、このSSIDProxyについて説明していきます。

    概要

    このソフトはWindowsのプロキシの設定を無線LAN接続先のSSIDやMACアドレスによって自動的に変更するソフトです。例えばAndroidなんかは、Wi-Fiの設定の中にプロキシの設定があり、接続先によってプロキシを変更してくれますよね。しかし、WindowsではWi-Fiとプロキシの設定は別物です。それは不便で前時代的。
    そこでこのSSIDProxy。
    SSIDやMACアドレスに応じて適切なプロキシ設定に自動的に切り替えてくれます。たとえば、学校などではプロキシ環境下、家ではプロキシ無しの環境を往復するノートパソコンなどで、いちいち設定する煩わしさから解放してくれます。

    使い方

    ソフトを起動するとタスクトレイにアイコンが現れます。


    このアイコンを右クリックするかダブルクリックで設定画面を開きます。


    これが設定画面です。ここに「ルール」と呼ばれるものを設定することで、そのルールに従ったプロキシ設定をしてくれます。ルールは基本的にこの表の上へ行くほど優先度が高いですが、「デフォルト」は表のどこにあっても優先度は一番低くなります。複数のデフォルトのルールがある場合は、表の一番上側のものが適用されます。
    ルールやその優先順位等は、「追加」「編集」「削除」「上へ」「下へ」のボタンを用いて編集ができます。
    追加を押すと、下記のような画面が出てきます。


    無線LANのところで、SSIDかMACアドレスかデフォルトを設定します。現在接続しているネットワークがここで設定したSSID、もしくはMACアドレスに一致した場合、このプロキシ設定が適用されます。どれとも一致しなかった場合はデフォルトのものが適用されます。
    自動構成、プロキシサーバーのところはWindowsのインターネットオプションから行うプロキシ設定とほぼ同じデザインになっているため、難なく設定できるかと思います。

    これで設定ができました。あとは、接続先のネットワークが変更になると自動的にルールに従ってプロキシが切り替わります。
    また、強制的に現在のルールに従ってプロキシ設定を変更したい場合は、タスクトレイのアイコンを右クリックして「今すぐルールを適用する」をクリックすればOKです。
    ソフトウェア起動時にルールを適用したい場合、"--apply-with-start"をコマンドラインオプションに付けて起動すると起動直後にルールが適用されます。

    動作環境

    下記の条件をすべて満たしている必要があります。
    • .NET Framework 4.5.1以上
    • Windows Vista以上のWindows
    • Wi-Fiデバイスが付いており、正常に動作していること
     なお、動作確認はWindows 8.1 Pro with Media Centerで行っております。

    インストール・アンインストール方法

    インストーラは特別用意しておりませんので、適当なフォルダに解凍してお使いください。スタートアップに設定し、常駐させると便利です。起動時にルールを適用するには、"--apply-with-start"をコマンドラインオプションに付けてください。
    また、アンインストールはそのまま削除していただくだけで大丈夫です。

    使用ライブラリ

    このソフトウェアは下記のライブラリを使用しております。
     これらの有用なソフトウェアを公開してくださった方たちには深く感謝いたします。また、これらのライブラリのオリジナル部分に関しての著作権等の権利は作成者に帰属いたします。

    ※11/14追記:Managed Native Wifiの作者様より、派生ライブラリではない旨のご指摘をいただきましたので訂正いたしました。十分に確認しておらず誤ったことを記してしまい大変申し訳ございませんでした。なお、アプリケーションのバイナリについては次期バージョンより訂正させていただきます。

    免責事項

    このソフトウェアを使用することによって発生したいかなるトラブル(データ喪失、パソコン故障、データ流出等)についても、作成者は責任を負わないものといたします。特に、このソフトウェアは独自研究によるレジストリ編集を行っているため、その方法が完全ではなかったり、Windowsのバージョン・システム構成等の環境によって正常に動作しない可能性があります。場合によっては重大なトラブルを引き起こす可能性がありますので、そのようなリスクをご承知の上、ご利用ください。
    なお、このソフトウェアを起動した時点で、免責事項を読んだかどうかにかかわらず、これらの免責事項に同意したものとみなします。

    今バージョンでの追加機能

    • 日本語SSIDに対応
    • アクセスキー(アクセラレータキー)に対応
    • ルールの編集、順序変更機能を実装
    • その他細かなリファイン、ソースコードの全面的なリファクタリング 

    ダウンロード

    SSIDProxy ver.1.1.0

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

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

    ノートパソコンの無線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版)において実験的に調べたものです。他の環境に当てはまるかどうかは未検証ですし、不備や間違いがあるかもしれません。ご利用は自己責任でお願いいたします。