いつもお世話になっております。
開発環境 VB6.0
OS環境 サーバ:Win2003Server
クライアント:WinXP
サーバ側で、接続されているクライアントのIPアドレス取得方法を
調べてみたのですが、わかりません。
ご存知の方がいらっしゃいましたらご教授ください。
サーバという事は、VB6 の "IIS アプリケーション" プロジェクトかな?
もしそうなら、WebClass.Request.ServerVariables("REMOTE_ADDR") で。
ご返信ありがとうございます。
ご説明が不足していたようです。
リモートソフト(MetaFrameのWebInterface)で接続されている
サーバとクライアントがいます。
クライアントからWebInterfaceを介して、サーバ側の公開アプリを起動
させるのですが、その公開アプリでコンピュータ名とIPアドレスを取得
したいのです。
コンピュータ名はEnviron("CLIENTNAME")で取得できたのですが、
IPアドレスはEnviron("REMOTE_ADDR") で取得できませんでした。
(環境変数にREMOTE_ADDR、値に%REMOTE_ADDR%と追加してみたのですが
ダメでした)
サーバの環境変数にREMOTE_ADDRを正しく追加すれば
取得できるのでしょうか?
それともDentalさんの方法を使わなければならないでしょうか?
勉強不足なので、もし内容とかけ離れたことを言っていたらお詫びします。
MetaFrameですか。
味覚にですが、WTSQuerySessionInformation API経由で、
WTS_INFO_CLASS.WTSClientAddress を取得できるかも知れません。
# 当方、MetaFrameを使った事が無いので、具体的な事は書けませんが……。
XPや2003ServerならnetstatがサーバープロセスのPIDまで教えてくれるので
(1)MetaFrameのPIDを得る
(2)netstat -no でTCP接続相手と接続しているPIDを情報を得る
(3)両者の結果を突き合わせる
の様な方法も考えられますね。
http://www.atmarkit.co.jp/fwin2k/win2ktips/236portcheck/portcheck.html
みなさんありがとうございます。
WTSQuerySessionInformationの使い方を調べてみたのですが、
VB.NET用のHPしか見つけられませんでした。
(私のAPIビューアにものっていませんでした)
VB6.0だとできないのかと一度は考えたのですが
当サイトの過去ログでVB6.0で作成された方がいらっしゃるよう
なので、VB6.0でもできるようです。
申し訳ありませんが、ヒント、または参考になるHPなどをご存知の
方いらっしゃいましたらご紹介していただけるとありがたいです。
もしかしたら、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
魔界の仮面弁士さんのサイトを拝見したのですが、
語学力と技術力不足で理解できませんでした。
http://www.activevb.de/tipps/vb6tipps/tipp0636.html
上記のサイトにWTSQuerySessionInformationのサンプルがあったので
サンプルのままサーバ上で実行したところ、ラベルにクライアントの
コンピュータ名が表示されました。
WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, _
SessionID, WTSClientName, lpBuffer, Count)
のWTSClientNameの部分をWTSClientAdressに変えてみたのですが、
"・”としか表示されません。
正直どの変数に何をあてはめればよいのか分からない状態です。
引き続きWMIも含めて自分なりに色々試してみます。
もし上記のサイトをご覧になられてこうやったらうまくいくかも、
などのヒントなど下さる方がいたらレス頂けると幸いです。
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
これかな?
http://www.vbcity.com/forums/topic.asp?tid=12264#RID37556
魔界の仮面弁士さんにご紹介いただいたサイトのコードを
ほとんどそのまま貼り付けてEXEを作成し、メタフレームで実行したところ
クライアントのIPアドレスを取得していました!
とても勉強になりました。
魔界の仮面弁士さんをはじめ、みなさん本当にありがとうございました!
| ツイート |
|