Ads

動機と目的

複数のIPを持ったWindowsクライアントから接続元IPを指定してリモートアクセスを行いたい。

  • ↑これに対する回答。自分も何かの際に使うかもしれないので作ってみた。だってググっても出てこないんだもん。
  • 言語はWindowsだったらC#でいいよな、もう最後に触ったの数年前だけどw
  • 最近はVisualStudio無料版が落とせるみたいだからそれ使おう、良い時代だ。

要件

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

実装してみた

自分のIPアドレスの列挙

適当にググったらすぐ分かった。↓こんな感じで取れるようだ。

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の指定方法

これに関しては情報が少なかったが、ipとかbindとかそれっぽいキーワードを頼りにMSDNとか調べたらそこそこすぐに見つかった。 WebRequestの接続時に呼ばれるデリゲートで差し替えるようだ。
ところで僕の記憶よりC#も進化してて最近は無名delegateが使えるようになったんだね。便利だw

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text);
//接続元IPの選択
//  このプロパティに小さい値を設定しておかないと、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

これは結構サクッと出来た。↓こんな感じだ。ここでも無名デリゲートが活躍中。ちなみに 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;
};

こんなん出来ました。

使い方はみりゃ分かるだろってことで。ご自由に利用してください。

20090307042614.png
  • ソース&実行ファイルはこちら(実行ファイルは bin/Release/ の下にあります)

添付ファイル: fileHQ1236340174.zip 759件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-03-09 (月) 15:31:09 (3566d)