サーバーからクライアントのIPアドレスを取得したい

解決


れいこ  2005-12-20 10:24:33  No: 93317

いつもお世話になっております。
開発環境  VB6.0
OS環境  サーバ:Win2003Server
        クライアント:WinXP

サーバ側で、接続されているクライアントのIPアドレス取得方法を
調べてみたのですが、わかりません。
ご存知の方がいらっしゃいましたらご教授ください。


Dental  2005-12-20 10:47:21  No: 93318

サーバという事は、VB6 の "IIS アプリケーション" プロジェクトかな?

もしそうなら、WebClass.Request.ServerVariables("REMOTE_ADDR") で。


れいこ  2005-12-20 11:54:06  No: 93319

ご返信ありがとうございます。

ご説明が不足していたようです。
リモートソフト(MetaFrameのWebInterface)で接続されている
サーバとクライアントがいます。

クライアントからWebInterfaceを介して、サーバ側の公開アプリを起動
させるのですが、その公開アプリでコンピュータ名とIPアドレスを取得
したいのです。

コンピュータ名はEnviron("CLIENTNAME")で取得できたのですが、
IPアドレスはEnviron("REMOTE_ADDR") で取得できませんでした。
(環境変数にREMOTE_ADDR、値に%REMOTE_ADDR%と追加してみたのですが
  ダメでした)

サーバの環境変数にREMOTE_ADDRを正しく追加すれば
取得できるのでしょうか?
それともDentalさんの方法を使わなければならないでしょうか?

勉強不足なので、もし内容とかけ離れたことを言っていたらお詫びします。


魔界の仮面弁士  2005-12-20 12:27:34  No: 93320

MetaFrameですか。
味覚にですが、WTSQuerySessionInformation API経由で、
WTS_INFO_CLASS.WTSClientAddress を取得できるかも知れません。

# 当方、MetaFrameを使った事が無いので、具体的な事は書けませんが……。


ひろ  2005-12-20 13:02:35  No: 93321

XPや2003ServerならnetstatがサーバープロセスのPIDまで教えてくれるので

(1)MetaFrameのPIDを得る
(2)netstat -no でTCP接続相手と接続しているPIDを情報を得る
(3)両者の結果を突き合わせる

の様な方法も考えられますね。

http://www.atmarkit.co.jp/fwin2k/win2ktips/236portcheck/portcheck.html


れいこ  2005-12-20 13:54:16  No: 93322

みなさんありがとうございます。

WTSQuerySessionInformationの使い方を調べてみたのですが、
VB.NET用のHPしか見つけられませんでした。
(私のAPIビューアにものっていませんでした)

VB6.0だとできないのかと一度は考えたのですが
当サイトの過去ログでVB6.0で作成された方がいらっしゃるよう
なので、VB6.0でもできるようです。

申し訳ありませんが、ヒント、または参考になるHPなどをご存知の
方いらっしゃいましたらご紹介していただけるとありがたいです。


魔界の仮面弁士  2005-12-20 14:50:09  No: 93323

もしかしたら、API のような面倒な方法を使わずとも、WMI で取得できるかも…?

http://msdn.microsoft.com/library/en-us/termserv/termserv/terminal_services_wmi_provider_reference.asp
http://support.citrix.com/forums/forum.jspa?forumID=67

# 未確認情報ばかりで済みません。m(_ _)m


あとは、下記の clientip.exe を呼び出して、
その出力結果を受け取るようにしてみるとか。

http://www.administrator.de/index.php?content=bda7c341832ce1bf8baa342e36bec692


れいこ  2005-12-20 16:12:16  No: 93324

魔界の仮面弁士さんのサイトを拝見したのですが、
語学力と技術力不足で理解できませんでした。

http://www.activevb.de/tipps/vb6tipps/tipp0636.html
上記のサイトにWTSQuerySessionInformationのサンプルがあったので
サンプルのままサーバ上で実行したところ、ラベルにクライアントの
コンピュータ名が表示されました。

WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, _
        SessionID, WTSClientName, lpBuffer, Count)
のWTSClientNameの部分をWTSClientAdressに変えてみたのですが、
"・”としか表示されません。

正直どの変数に何をあてはめればよいのか分からない状態です。
引き続きWMIも含めて自分なりに色々試してみます。

もし上記のサイトをご覧になられてこうやったらうまくいくかも、
などのヒントなど下さる方がいたらレス頂けると幸いです。


魔界の仮面弁士  2005-12-20 16:42:12  No: 93325

SDK を見ると、以下のように書かれていますね。

  クライアントのネットワークの種類とネットワークアドレスが入った
  WTS_CLIENT_ADDRESS 構造体へのポインタを受け取ります。

  Pointer to a WTS_CLIENT_ADDRESS structure containing
  the network type and network address of the client.

なので、WTSClientAdress を渡すつもりならば、こうかな? (未確認)


Private Type WTS_CLIENT_ADDRESS
  AddressFamily As Long
  Address(19) As Byte
End Type

  Dim X As WTS_CLIENT_ADDRESS
  If lpBuffer <> 0 Then
    RtlMoveMemory X, lpBuffer, 24
    Dim I As Integer
    For I = 0 To 19
      Debug.Print X.Address(I)
    Next
  End If


魔界の仮面弁士  2005-12-20 17:02:30  No: 93326

これかな?

http://www.vbcity.com/forums/topic.asp?tid=12264#RID37556


れいこ  2005-12-20 17:45:54  No: 93327

魔界の仮面弁士さんにご紹介いただいたサイトのコードを
ほとんどそのまま貼り付けてEXEを作成し、メタフレームで実行したところ
クライアントのIPアドレスを取得していました!

とても勉強になりました。

魔界の仮面弁士さんをはじめ、みなさん本当にありがとうございました!


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加