質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
IPv4

IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。

RDP(Remote Desktop Protocol)

RDP(Remote Desktop Protocol)は、リモートデスクトップ用の通信プロトコルです。リモートデスクトップとは、離れた場所のパソコンを遠隔操作ができるサービス。RDPには、サーバにクライアントが接続する際のデータ形式やデータ伝送手順が定められています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

4回答

4489閲覧

リモートデスクトップにてPCのipアドレスを取得するEXCEL-VBAマクロを作りたい

nono789

総合スコア1

IPv4

IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。

RDP(Remote Desktop Protocol)

RDP(Remote Desktop Protocol)は、リモートデスクトップ用の通信プロトコルです。リモートデスクトップとは、離れた場所のパソコンを遠隔操作ができるサービス。RDPには、サーバにクライアントが接続する際のデータ形式やデータ伝送手順が定められています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/10/10 04:11

編集2020/10/22 16:28

前提・実現したいこと

はじめて質問いたします。
よろしくお願いいたします!

リモートデスクトップにてクライアントPCから、別PC(Windows10Pro)にアクセスしたときに、クライアントPCのipアドレスを取得するEXCEL-VBAマクロを作ろうと思っています。

Windows10 pro を導入しているPCに対して、他のPC(Windows)からリモートデスクトップ接続を実行しています。
このとき接続先で起動しているEXCEL-VBAより、接続元端末のIPアドレスやホスト名を簡単に取得する方法はないでしょうか?

どの端末(IPアドレス)から接続されたかという情報を取得し、管理側として接続ログを保存したいと思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/10/10 08:30

>簡単に取得する方法はないでしょうか? 簡単でなかったら取得する方法は試したということですか?
nono789

2020/10/10 14:42 編集

コメントをすみません! なんとか理解できそうなものから取り組みたいという意味です。 そのあたり、よくわからないので、どのあたりから、学んだらよいか。 今は、Windows Script Hostを調べています。
bsdfan

2020/10/12 23:42

Excel VBAマクロで、ということなので直接の回答ではないですが、接続ログということなら、OS(Windows)のイベントログを活用するのがいいと思います。 「リモートデスクトップ イベントログ」で検索するといろいろでてきます。
nono789

2020/10/13 15:28

ヒントの回答をありがとうございます。調べたことが回答できておらずすみません;;  →リモートデスクトップ イベントログで、検索してみました! イベントビューア>Windowsログ>セキュリティ イベントID=4624 Logon ↓ スクロールして下のほうにipアドレスの記載がありました! 少し、答えに近づいている気がします。 これを、どう取得するか、、調べてみます!
nono789

2020/10/14 23:40

↑を確認してみましたが、イベントログ(XML)を読み込み、、というかなり難しい感じです。 試してみたいですが、実装が難しそうです。。
bsdfan

2020/10/14 23:56

「どの端末(IPアドレス)から接続されたかという情報を取得し、管理側として接続ログを保存したい」という目的に対しては、こういうのもありますよというぐらいのコメントでした。 VBAでやりたい、っていうのが重要でしたら、こちらの方法からは離れたほうがいいかもしれません。
nono789

2020/10/15 08:25

アドバイスを恐縮です。 バッチファイル、VBSは使えます。
guest

回答4

0

試してないので微妙ですが、イベントログ側のアプローチがあったので、メモ代わりに回答します。

Windows踏み台のログイン証跡の賢い取り方

証跡系のアプリからアプローチを探すと、もっと良い案があるかもしれないです。

投稿2020/10/17 02:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nono789

2020/10/17 03:36

こちらもありがとうございます。 今回は、目的が違いますが、こちらで本格的にイベントログの解析できそうですねο(*´˘`*)ο
退会済みユーザー

退会済みユーザー

2020/10/22 20:58

ん?目的は以下ですよね? > 管理側として接続ログを保存したいと思っています。 本質的にはイベントログからの抽出の方が近いと思いますよ?
nono789

2020/11/03 15:00

お礼がおそくなりすみません! 回答を頂きありがとうございます! 頂いた周辺技術の情報については、理解してから質問を絞り込んでみたいと思います。 難しそう。。。! 取り急ぎお礼いたします。
guest

0

ベストアンサー

ホスト名でしたら環境変数に格納されているので、Environ("ClientName") で簡単に取得できそうです。

参考:Windows がリモートデスクトップ上で実行されているか確認する

投稿2020/10/11 00:10

編集2020/10/14 01:55
segavvy

総合スコア1038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nono789

2020/10/12 23:13 編集

クライアントPCからリモートデスクトップで接続先PCに入り、コマンドプロンプトから >set にて、環境変数を確認しましたが、どの変数がホスト名かわからず;; 30個ほど表示されました。
Y.H.

2020/10/14 01:42 編集

取り消します。
segavvy

2020/10/13 02:14 編集

その30個くらい並ぶ中の ClientName がホスト名です。 それをExcelのVBAの中で取得する方法が、回答に書いた Environ("ClientName") です。 例えばVBAのプログラムの中で、 MsgBox Environ("ClientName") とすればホスト名が表示されるかと思います。
nono789

2020/10/13 15:41 編集

ご回答をありがとうございます! >setで、 ClientNameは、見当たらず。。 以下やってみたこと、ご報告します。 ◇ユーザー環境変数(ユーザー環境で、コマンドプロンプトをたちあげて、>setと実行しました) USERNAME=〇〇〇〇(←ログインしたときのid) SESSIONNAME=Console ◇コマンドプロンプトを管理者権限で起動させて>set COMPUTERNAME=□□□□□□□□ USERNAME=〇〇〇〇(←ログインしたときのid) などが現れました。 ClientNameを表示させるには、何か事前の環境変数の設定が必要でしょうか? echo %CLIENTNAME% でも、「%CLIENTNAME%」と表示されてしまい、値がはいっていないようです。 もし、ヒントがあればお願いいたします!
segavvy

2020/10/13 17:01

CLIENTNAMEは、リモートデスクトップでアクセスした場合は自動的にセットされますが、直接そのPCにログインした場合はセットされません。 SESSIONNAME=Console になっているとのことですので、おそらく、リモートデスクトップからのアクセスではなく、直接そのPCにログインして試されているのではないかと思います。もしそうであれば、最初のご質問と同じ状況(=リモートデスクトップにてクライアントPCから、別PC(Windows10Pro)にアクセスしたとき)でお試しください。
nono789

2020/10/13 23:18 編集

おはようございます。 ご回答をありがとうございます。 もちろん、リモートデスクトップにて、接続先PCへログインし、コマンドプロンプトより、>setを試しましたが、みあたらないです。念のため、GUI操作でシステムのプロパティ>詳細設定>環境変数にて確認しましたが、CLIENTNAMEという変数は存在していません。 OSは、接続先はWindows10Proです。 何か、初期設定が必要でしょうか?
Y.H.

2020/10/14 01:42

Windows標準のリモートデスクトップですよね? 「Chromeリモートデスクトップ」とか「teamviewer」とか「VNC」とかじゃなく [スタートメニュー]-[Windowsアクセサリ]-[リモートデスクトップ接続]からアクセスする。
segavvy

2020/10/14 01:43

大変失礼しました、私の回答の誤りでした。 手元の Windows 10 Enterprise で確認しましたが、nano789さんと同じ現象が確認できました。 Windows 10 ではリモートデスクトップで接続してもコンソールセッションになるため CLIENTNAME も格納されず、私の回答したやり方では取得できないことがわかりました。 (Windows 10 は同時に複数人で使うことが許諾されていないため、このような仕様になっている模様です。) お手数おかけしてしまいすいません。 他の方の回答をお待ちください。
Y.H.

2020/10/14 02:29 編集

リモートデスクトップ接続先で一度サインアウトし 再度リモートデスクトップでログインから行うとセットされませんか? Windows10Pro Version 10.0.20226.1000 への接続で確認 1)リモートデスクトップでログインセッションを開始すると  CLIENTNAMEはセットされます。 2)ローカルログインでログインセッションを開始すると  CLIENTNAMEはセットされません。 「2」でログインセッションを閉じずにリモートデスクトップで  既存ログインセッションに接続するとCLIENTNAMEは更新されないので  リモートデスクトップで接続しても存在しないままです。
segavvy

2020/10/14 01:54

Y.H.さん、フォローありがとうございます! 確かにセットされました! なるほど、すでにセッションがあるとそこにつながってしまうということですね。 nono789 さん、一度サインアウトしてからお試しください。
Y.H.

2020/10/14 02:36

CLIENTNAMEはそのセッションを作成したクライアントの情報を保持する って仕様のようですね。 MSのドキュメントのどこかに明示されてるかはわかりませんが・・・
nono789

2020/10/17 12:11 編集

いろいろ皆様ご回答をありがとうございます!私もやってみました。 手順) 1_接続先でサインアウトしておく 2_リモートデスクトップでログイン 3_コマンドプロンプトをそのユーザー権限で立ち上げ 4_>setと入力 USERNAME=〇〇〇〇(←ログインしたときのid) SESSIONNAME=RDP-Tcp#9 CLIENTNAME=DESKTOP23 「DESKTOP23」が、ホスト名なんですね。 このPC名(デバイス名)は、接続元クライアントPCのシステム>バージョン情報>デバイスの仕様>PCの名前を変更 にて、変更できることがわかりました。 かならず、接続先はローカルでログオフしておく習慣をつけていないといけないので、ちょっと失敗しそうで(忘れそうで)怖いですが、できました。 あとは、VBAから読み込めればいいので、調べてみます。
nono789

2020/10/17 03:07 編集

ところで、「CLIENTNAME」は、クライアントが自由に設定できてしまうことから、なりすましが可能かと思いますが、セキュリティは今は求めていないので、(ユーザーが)簡便な方法ということなので、いいかもしれないです。ローカルでログインは開発時もリモートなので、いけそうです!
segavvy

2020/10/15 11:33

> あとは、VBAから読み込めればいいので、調べてみます。 最初の回答と重複しますが、VBAからは Environ("ClientName") で取れるかと思いますのでお試しください。
hana_yama_san

2020/10/15 11:50

これだと接続してきたPC名は判っても、 DNSの適正な設定と、クライアントもしくは DHCPサーバによるPC名とIPアドレスの 紐付けを動的にDNS登録する仕組みが 必要では無いでしょうか。 「nslookup」をキックするは不可とします。 なぜならunixのbindのおまけから移植された nslookupは独自リゾルバを持っており、 サーバの診断には有用ですが、 windowsアプリの名前解決とは関係ないからです。
segavvy

2020/10/15 16:44 編集

VBAで簡単に取得できる方法ということで環境変数の利用について回答しましたが、IPアドレスを簡単に取得する方法は思いつきませんでした。 なお、接続をTCPに限定できる場合(参考:https://blog.cles.jp/item/11293)に限るのですが、Windows 10ということでリモートデスクトップのセッションが1つしかなさそうなので、VBAから「netstat -n」をキックして標準出力を取得し、正規表現などを使って「ローカル アドレス」のポート番号が「3389」かつ「状態」が「ESTABLISHED」になっている行の「外部アドレス」のIPアドレス部分を抽出する、という形でも取得できるかもしれません。
nono789

2020/10/16 13:15

hana_yama_san様 コメントありがとうございます。 今回の目的は、「ログインしてきたクライアントを識別したい」ということなので、PC名で大丈夫です。ipアドレスやMACアドレスでもなりすましが可能とわかったので、セキュリティを配慮するならば、ほかの方法を考える必要があることも今回、よくわかりました。
nono789

2020/10/16 13:19

segavvy様 いろいろなアイディアが面白いです☆早速、試してみます! まずは、PC名のVBAマクロから作ってみます。
nono789

2020/10/17 01:46 編集

VBAマクロは、Environ("ClientName")で、非常に簡単にできました!(感動!!) (→回答に記載) ありがとうございました。
nono789

2020/10/16 16:52 編集

「netstat -n」から、外部アドレス(ipアドレス)を抽出する方法も実施してみました! ipアドレスを取得することができました!(→回答に記載) ありがとうございます!!
segavvy

2020/10/17 01:26

いえいえ、お役に立てたようでよかったです!
guest

0

VBAから「netstat -n」をキックして標準出力を取得し、
正規表現などを使って「ローカル アドレス」の
ポート番号が「3389」かつ「状態」が「ESTABLISHED」に
なっている行の「外部アドレス」のIPアドレス部分を抽出する

VBA

1Sub test3() 2 3 Dim WSH, wExec, cmd As String, Result As String 4 5 6 Set WSH = CreateObject("WScript.Shell") 7 8 ' 実行したいDOSコマンド 9 cmd = "netstat -n" 10 11 ' DOSコマンドを実行 12 Set wExec = WSH.exec("%ComSpec% /c " & cmd) 13 14 ' DOSコマンドが終了するまで待機 15 Do While wExec.Status = 0 16 DoEvents 17 Loop 18 19 ' DOSコマンドの実行結果(標準出力)を取得 20 Result = wExec.StdOut.ReadAll 21 22 ' 取得した標準出力をメッセージボックスに表示 23 MsgBox Result 24 25 26 27 28 Set RE = CreateObject("VBScript.RegExp") 29 30 ' 正規表現の条件を設定 31 RE.Pattern = "^\s*\S+\s+\S+:3389\s+(\S+):\d+\s+ESTABLISHED\s*$" 32 RE.MultiLine = True ' 複数行に対して検索する指定 33 34 ' 検索 35 Set reMatch = RE.Execute(Result) 36 37 ' 最初に条件に該当した行の、最初のカッコ内(=IPアドレス部分)を取り出し 38 Cells(7, 2) = reMatch(0).SubMatches.Item(0) 39 40 41 ' オブジェクトを空に 42 Set reMatch = Nothing 43 Set RE = Nothing 44 Set wExec = Nothing 45 Set WSH = Nothing 46 47End Sub

投稿2020/10/16 16:46

編集2020/10/17 03:26
nono789

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

segavvy

2020/10/17 01:43

念のため、注意事項をコメントします。 ・状態が「ESTABLISHED」かどうかのチェックは必要です。netstatの結果には「TIME_WAIT」などの切断済みのものも含まれることがあるためです。 ・これはリモートデスクトップの通信がTCPの場合のみ使える方法です。UDPが使われた場合はnetstatでは調べられません。なお、OSの設定でリモートデスクトップの通信をTCPに限定することはできます(「RDP TCP」などでググると見つかります)。 ・リモートデスクトップが使うポート番号は変更できるので、変えている場合は3389もそれに合わせて変更しましょう。
nono789

2020/10/17 01:53 編集

・ESTABLISHEDは入れていなかったので、いれます。 ・TCPに限定は、サーバー側PCで設定ですね。 ・また、3389を含む行をみつけたあと、ipアドレスを見つける私の方法が、ちょっと無理やりすぎるような気がしているのですが、正規表現を使うとどんな感じになるのでしょう(正規表現を具体的に使ったことがなく、よくわからなすぎで。もし、ヒントをいただけると幸甚です。)
nono789

2020/10/17 02:00

そうなんですね~!これは、お伺いしないとまず、気が付かない! 本当にありがとうございます☆
segavvy

2020/10/17 02:09 編集

正規表現は、例えばこんな感じです。MsgBox Result 以降の行を置き換えてみてください。 なお、正規表現そのものは簡単に解説できないので、すいませんが解説サイトなどをご参照ください。 Set RE = CreateObject("VBScript.RegExp") ' 正規表現の条件を設定 RE.Pattern = "^¥s*¥S+¥s+¥S+:3389¥s+(¥S+):¥d+¥s+ESTABLISHED¥s*$" RE.MultiLine = True ' 複数行に対して検索する指定 ' 検索 Set reMatch = RE.Execute(Result) ' 最初に条件に該当した行の、最初のカッコ内(=IPアドレス部分)を取り出し Cells(5, 2) = reMatch(0).SubMatches.Item(0) Set reMatch = Nothing Set RE = Nothing
nono789

2020/10/17 03:28

再度ありがとうございます!ヾ(*´∀`*)ノキャ--- できました(→回答コード修正しました) 正規表現を使えてうれしいです。これをきっかけに理解できそうです(#^^#)
segavvy

2020/10/17 05:43

よかったです!
nono789

2020/10/17 06:54

ありがとうございます✨
guest

0

リモートデスクトップ接続しているときのクライアント名(pc名)を表示する方法 ###

  • サーバー側PC:Windows10Pro
  • サーバー側のユーザーはサインアウトしている必要あります。
  • 環境変数を取得する関数を使います。

VBA

1Sub クライアント名() 2 Dim クライアント名 As String 3 クライアント名 = Environ("ClientName") 4 MsgBox クライアント名 5End Sub

投稿2020/10/16 14:53

編集2020/10/18 11:41
nono789

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問