#contents

*目的 [#cd76fd11]
複数のIPを持ったWindowsクライアントから接続元IPを指定してリモートアクセスを行いたい。
*動機と目的 [#cd76fd11]
[[複数のIPを持ったWindowsクライアントから接続元IPを指定してリモートアクセスを行いたい。>http://q.hatena.ne.jp/1236340174]]
-↑これに対する回答。自分も何かの際に使うかもしれないので作ってみた。だってググっても出てこないんだもん。
-言語はWindowsだったらC#でいいよな、もう最後に触ったの数年前だけどw
-最近は[[VisualStudio無料版が落とせる>http://www.microsoft.com/japan/msdn/vstudio/Express/]]みたいだからそれ使おう、良い時代だ。

*用件 [#c28be8b4]
*要件 [#c28be8b4]
-接続元IPを列挙して選択出来るようにする
-指定IPでHTTP/HTTPSのGETリクエストが出来るようにする
-HTTPSは証明書のエラーを無視できるようにする

*何を使う? [#we2495c5]
-適当にぐぐったんだがそれらしきツールがなかなか見つからないのでサクッと作るか。
-言語はWindowsだったらC#でいいよな、もう数年は触ってなかったけどw
-最近はVisualStudio無料版が落とせるみたいだからそれ使おう、良い時代だ。

*実装してみた [#l80e48fb]
ポイントは以下の3点だよな。
-自分のIPアドレスの列挙
-接続元IPをバインドしてWebRequestを投げる
-SSL証明書の検証のON/OFF

**自分のIPアドレスの列挙 [#hba704f1]
適当にググったらすぐ分かった。↓こんな感じで取れるようだ。
 ManagementScope scope = new ManagementScope("root\\cimv2");
 scope.Connect();
 ObjectQuery query = new ObjectQuery("Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE");
 ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
 ManagementObjectCollection collection = searcher.Get();
 foreach (ManagementObject mo in collection)
 {
   foreach (string ipAddress in (string[])mo.Properties["IPAddress"].Value)
   {
     comboBox1.Items.Add(ipAddress);
   }
 }

**接続元IPの指定方法 [#u6ac35bf]
これに関しては情報が少なかったが、ipとかbindとかそれっぽいキーワードを頼りにMSDNとか調べたらそこそこすぐに見つかった。
WebRequestの接続時に呼ばれるデリゲートで差し替えるようだ。ところで僕の記憶よりC#も進化してて最近は無名delegateが使えるようになったんだね。便利だw
WebRequestの接続時に呼ばれるデリゲートで差し替えるようだ。&br;
ところで僕の記憶よりC#も進化してて最近は無名delegateが使えるようになったんだね。便利だw
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text);
 //接続元IPの選択
 //↓これに小さい値を設定しておかないと、IP切り替えてから別リクエストを実行しても
 //↓アプリ内部で前回接続時のEndPointが再利用されてしまい接続元が変わらない罠に陥る
 //  このプロパティに小さい値を設定しておかないと、IP切り替えてから別リクエストを実行しても
 //↓アプリ内部で前回接続時のEndPointが再利用されてしまい接続元が変わらない罠に陥るので注意
 ServicePointManager.MaxServicePointIdleTime = 100;
 request.ServicePoint.BindIPEndPointDelegate = delegate
 {
   if (comboBox1.Text == "自動")
   {
     return new IPEndPoint(IPAddress.Any, 0);
   }
   else
   {
     return new IPEndPoint(IPAddress.Parse(comboBox1.Text), 0);
   }
 };
 //実行
 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
この接続元IPの指定はやり方さえ分かればサクッと動いたかと思いきや、コメントに書いたとおり妙な罠があってこれの解決に時間がかかってしまった…。
-SSL証明書の検証のON/OFF

**SSL証明書の検証のON/OFF [#j066a08d]
これは結構サクッと出来た。↓こんな感じだ。ここでも無名デリゲートが活躍中。ちなみに checkBox1は「SSL証明書を検証する」っていうチェックボックスね。
 //SSL証明書チェック無効化
 ServicePointManager.ServerCertificateValidationCallback = delegate (
   object req,
   System.Security.Cryptography.X509Certificates.X509Certificate certificate,
   System.Security.Cryptography.X509Certificates.X509Chain chain,
   System.Net.Security.SslPolicyErrors sslPolicyErrors)
 {
   if (checkBox1.Checked)
   {
     return (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None);
   }
   return true;
 };

**こんなん出来ました。 [#j6062f1d]
使い方はみりゃ分かるだろってことで、ご自由に利用してください。
#ref(HQ1236340174.png)
*こんなん出来ました。 [#j6062f1d]
使い方はみりゃ分かるだろってことで。ご自由に利用してください。
#ref(http://f.hatena.ne.jp/images/fotolife/y/y-kawaz/20090307/20090307042614.png)

↓ソース&実行ファイルはこちら
-ソース&実行ファイルはこちら(実行ファイルは bin/Release/ の下にあります)
#ref(HQ1236340174.zip)


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS