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

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

新規登録して質問してみよう
ただいま回答率
85.48%
.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

3回答

4251閲覧

リモートデスクトップに接続しているPC名を取得したい

xail2222

総合スコア1497

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

1クリップ

投稿2021/04/21 22:47

編集2021/04/23 22:53

前提・実現したいこと

リモートデスクトップに接続しているPC名を取得したいです。
だいぶ昔から調べたいなと思ってて実現できずにいます。

リモートから調べれるといいのですが
RPCを許可しないといけない?のであればそれは避けたいので
その対象PCのタスクでログオン時にプログラムを実行させて
共有フォルダに結果を出力でいいと思ってます。
その為、言語はvbsに限らず.netでも良いです。
c++は私は苦手なので避けたいところです。

また、別にプログラムで実現できなくても
どうにかして確認するすべがあればよいと思っています。

発生している問題・エラーメッセージ

Microsoft WMI Scripting V1.2 Library
を使ってログを調べるプログラムを書いてるつもりだけどセキュリティログが取得できない

試したこと・現状のソースコード

色々試行錯誤、切り貼りしてる状況なので
汚いコードですが、現状こんな感じです。

VBScript

1Dim Locator 2Dim Service 3Dim MesStr 4Dim EveSet 5Dim Eve 6 7Const CONVERT_TO_LOCAL_TIME = True 8Dim tNow 9tNow = Now 10Dim dtmStartDate 11Dim dtmEndDate 12Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime") 13Set dtmEndDate = CreateObject("WbemScripting.SWbemDateTime") 14 15dtmStartDate.SetVarDate Left(tNow, 10), CONVERT_TO_LOCAL_TIME 16dtmEndDate.SetVarDate Left(tNow + 1, 10), CONVERT_TO_LOCAL_TIME 17 18 19strComputer="." 20Set Service = GetObject("winmgmts:" _ 21 & "{impersonationLevel=impersonate}!\" & strComputer & "\root\cimv2") 22 23 24Set EveSet = Service.ExecQuery("Select * From Win32_NTLogEvent Where Logfile='Security'" & _ 25 " And TimeWritten >= '" & dtmStartDate & "' and TimeWritten < '" & dtmEndDate & "'") 26 27 28Dim tempDate 29Set tempDate = CreateObject("WbemScripting.SWbemDateTime") 30Dim tDate 31For Each Eve In EveSet 32 tempDate.Value = Eve.TimeWritten 33 tDate = tempDate.GetVarDate(True) 34 MesStr = MesStr & Eve.EventCode & ": " & Eve.Message & ":@" & tDate 35 36' End If 37Next 38 39Dim outStream 40Set outStream =CreateObject("ADODB.Stream") 41outStream.type = 2 42outStream.charset = "UTF-8" '出力ファイルの文字コード設定 43outStream.open 44outStream.WriteText MesStr, 1 45 46outStream.SaveToFile "C:\work\log.txt", 2 47outStream.Close 48 49Set outStream=Nothing 50Set EveSet = Nothing 51Set Eve = Nothing 52Set Locator = Nothing 53Set Service = Nothing 54

Logfile='Security'を外すと何か結果は取得できます。

(追記20210422)

vbs

1Dim Locator 'As WbemScripting.SWbemLocator 2Dim Service 'As WbemScripting.SWbemServices 3Dim MesStr 4Dim EveSet 'As WbemScripting.SWbemObjectSet 5Dim Eve 'As WbemScripting.SWbemObject 6Dim Eveex 'As WbemScripting.SWbemObjectEx 7 8Const CONVERT_TO_LOCAL_TIME = True 9 10Dim tNow 11tNow = Now 12Dim dtmStartDate 13Dim dtmEndDate 14Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime") 15Set dtmEndDate = CreateObject("WbemScripting.SWbemDateTime") 16 17dtmStartDate.SetVarDate Left(tNow, 10), CONVERT_TO_LOCAL_TIME 18dtmEndDate.SetVarDate Left(tNow + 1, 10), CONVERT_TO_LOCAL_TIME 19 20Dim tRegExp1 'As RegExp 21Set tRegExp1 = CreateObject("VBScript.RegExp") 22Dim tRegExp2 'As RegExp 23Set tRegExp2 = CreateObject("VBScript.RegExp") 24 25tRegExp1.Global = True 26tRegExp1.Pattern = "ログオン タイプ:\s*10\r" 27tRegExp2.Global = True 28tRegExp2.Pattern = "ソース ネットワーク アドレス:\s*(.*)\r" 29 30strComputer = "." 31Set oService = GetObject("winmgmts:" _ 32 & "{(Security)}!\" & strComputer & "\root\cimv2") 33 34 35Set EveSet = oService.ExecQuery("Select * From Win32_NTLogEvent Where Logfile='Security'" & _ 36 " And TimeWritten >= '" & dtmStartDate & "' and TimeWritten < '" & dtmEndDate & "'") 37 38 39Dim tempDate 40Set tempDate = CreateObject("WbemScripting.SWbemDateTime") 41Dim tDate 42 43Dim tResult 'As VBScript_RegExp_55.MatchCollection 44Dim tMatch 'As VBScript_RegExp_55.Match 45 46For Each Eve In EveSet 47 If Eve.EventCode = 4624 Then 48 If tRegExp1.test(Eve.Message) Then 49 tempDate.Value = Eve.TimeWritten 50 tDate = tempDate.GetVarDate(True) 51 Set tResult = tRegExp2.Execute(Eve.Message) 52 Set tMatch = tResult.Item(0) 53 MesStr = MesStr & tMatch.SubMatches(0) & ":" & tDate & vbCrLf 54 End If 55 End If 56Next 57 58Dim outStream 59Set outStream = CreateObject("ADODB.Stream") 60outStream.Type = 2 61outStream.Charset = "UTF-8" '出力ファイルの文字コード設定 62outStream.Open 63outStream.WriteText MesStr, 1 64 65outStream.SaveToFile "C:\work\log.txt", 2 66outStream.Close 67 68Set outStream = Nothing 69Set EveSet = Nothing 70Set Eve = Nothing 71Set oLocator = Nothing 72Set oService = Nothing 73 74

とすることで、セキュリティログは取得できました。

ただ、上述のコードでは「ソース ネットワーク アドレス」が
VBA、vb.netで実行するときちんと取れるのだけど、vbsだと取れないです。

また、端末によってセキュリティログが取得出来る所と出来ない所がありました。
この端末によってというのは、UACを完全に無効にしてるか否かでした。
そして管理者として実行すればUACを完全に無効にしなくても取得出来ました。

という所なのですが、今PC(Windows8.1)とVM間でリモートデスクトップへの接続でのログを確認していると
ログオンタイプ:10がない。代わりにログインタイプ:3と7でソース ネットワーク アドレスが設定されていました。
デスクトップのWindows8.1からノートPCのWindows10であっても7は設定されていました。
VMと言うより、windows8.1の特徴なのでしょうか。

Windowsのログオン成功イベントを監査【連載:ここに注目!セキュリティログをご紹介】

ログを出力する設定は
ローカルセキュリティ ポリシー>ローカルポリシー>監査ポリシー>アカウント ログオン イベントの監査
で設定しています。

【残っている問題】
・windows8.1からリモートデスクトップ接続した場合、ログオンタイプ:10がない
どうしてログインタイプ:10がないのか。という情報があればお待ちしております。
・VBSでは、messageの内容文字コードが違う?のか理由はわかりませんが、内容を上記コードで解析できない。
こちらは謎です。情報あればお待ちしております。

補足情報(FW/ツールのバージョンなど)

windows10

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

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

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

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

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

guest

回答3

0

自己解決

今回行ったリモートデスクトップへの接続PCの情報出力をする仕方について以下に記します。

(1)リモートデスクトップの接続を許可する。仕方は割愛

(2)リモートデスクトップへの接続の情報をWindows ログ に出力する設定

コントロールパネル>管理ツール>ローカル セキュリティ ポリシー
>ローカルポリシー>監査ポリシー>アカウント ログオン イベントの監査
で、次の場合に監査する「成功」にチェックをつける

(3)セキュリティーログを取得しファイルに出力するプログラムを作る

VisualBasic

1 2Imports System.Net 3Imports VBScript_RegExp_55 4 5Module Module1 6 7 Sub Main() 8 Dim tPath As String 9 Dim cmds As String() = System.Environment.GetCommandLineArgs() 10 'コマンドライン引数を列挙する 11 If cmds.Length > 1 Then 12 tPath = cmds.GetValue(1) 13 Else 14 tPath = System.IO.Path.Combine(My.Application.Info.DirectoryPath, "connect.txt") 15 End If 16 17 18 Dim tService As WbemScripting.SWbemServices 19 Dim tMesStr As String 20 Dim tEveSet As WbemScripting.SWbemObjectSet 21 Dim tEve As WbemScripting.SWbemObject 22 23 tMesStr = "" 24 25 Const CONVERT_TO_LOCAL_TIME = True 26 Dim tNow As Date 27 tNow = Now 28 Dim tDtmStartDate As WbemScripting.SWbemDateTime 29 Dim tDtmEndDate As WbemScripting.SWbemDateTime 30 tDtmStartDate = CreateObject("WbemScripting.SWbemDateTime") 31 tDtmEndDate = CreateObject("WbemScripting.SWbemDateTime") 32 33 tDtmStartDate.SetVarDate(DateAdd(DateInterval.Minute, -10, tNow), CONVERT_TO_LOCAL_TIME) 34 tDtmEndDate.SetVarDate(CDate(Strings.Format(DateAdd(DateInterval.Day, 1, tNow), "yyyy/MM/dd")), CONVERT_TO_LOCAL_TIME) 35 36 Dim tRegExp1 As RegExp 37 tRegExp1 = CreateObject("VBScript.RegExp") 38 Dim tRegExp2 As RegExp 39 tRegExp2 = CreateObject("VBScript.RegExp") 40 41 tRegExp1.Global = True 42 'tRegExp1.Pattern = "ログオン タイプ:\s*10\r" 43 tRegExp1.Pattern = "ログオン タイプ:\s*(.*)\r" 44 45 tRegExp2.Global = True 46 tRegExp2.Pattern = "ソース ネットワーク アドレス:\s*(.*)\r" 47 48 Dim tComputer 49 tComputer = "." 50 tService = GetObject("winmgmts:{(Security)}!\" & tComputer & "\root\cimv2") 51 52 tEveSet = tService.ExecQuery("Select * From Win32_NTLogEvent Where Logfile='Security'" & 53 " And TimeWritten >= '" & tDtmStartDate.Value & "' and TimeWritten < '" & tDtmEndDate.Value & "'") 54 55 Dim tTempDate 56 tTempDate = CreateObject("WbemScripting.SWbemDateTime") 57 Dim tDate 58 59 60 Dim tResult1 As VBScript_RegExp_55.MatchCollection 61 Dim tMatch1 As VBScript_RegExp_55.Match 62 Dim tResult2 As VBScript_RegExp_55.MatchCollection 63 Dim tMatch2 As VBScript_RegExp_55.Match 64 65 For Each tEve In tEveSet 66 If tEve.EventCode = 4624 Then 67 If tRegExp1.Test(tEve.Message) Then 68 tResult1 = tRegExp1.Execute(tEve.Message) 69 tMatch1 = tResult1.Item(0) 70 tTempDate.Value = tEve.TimeWritten 71 tDate = tTempDate.GetVarDate(True) 72 tResult2 = tRegExp2.Execute(tEve.Message) 73 tMatch2 = tResult2.Item(0) 74 If tMatch2.SubMatches(0) <> "-" Then 75 tMesStr = tMesStr & tMatch1.SubMatches(0) & vbTab & tMatch2.SubMatches(0) & vbTab & GetHostNameFromIP(tMatch2.SubMatches(0)) & vbTab & tDate & vbCrLf 76 End If 77 End If 78 End If 79 Next 80 81 Dim tSw As New System.IO.StreamWriter(tPath) 82 tSw.Write(tMesStr) 83 tSw.Close() 84 85 tSw = Nothing 86 tEveSet = Nothing 87 tEve = Nothing 88 tService = Nothing 89 90 End Sub 91 92 Private Function GetHostNameFromIP(ByVal IPAddress As String) As String 93 94 Dim tIPHstEnt As IPHostEntry 95 Dim tServer As String 96 97 Try 98 tIPHstEnt = Dns.GetHostEntry(IPAddress) 99 tServer = tIPHstEnt.HostName 100 Catch ex As Exception 101 tServer = "" 102 End Try 103 104 Return tServer 105 106 End Function 107 108 109End Module 110

(4)プログラムをタスクに登録

コントロールパネル>管理ツール>タスク スケジューラ
で、タスクの作成、
全般で最上位の特権で実行する
トリガーがユーザーセッションへの接続時、遅延時間15秒
操作はプログラムの開始で上記のプログラム、場合によっては出力パスを指定

出力パスをリモートPCから確認できる場所にしておけばリモートから確認できると思います。

以上となります。

あと、リモートPCから直接プログラムで確認をするやり方は…
したくないと言ってましたがやり方をしらない。というのもあります。
PCの設定を含めやり方を知ってる人いたら情報くれると嬉しいです。

気づいてしまいました。ローカルログイン時の情報が出力されていないのは不十分じゃないか!と
誰がログインして使ってるのかを、いちいち声をかけて調べないといけないのを避けるためなのだから
ローカルログインしているかもわかった方が良いと思いました。

とりあえず、質問自体は解決ですが
プログラムとタスクの設定は、改善が必要です!

投稿2021/04/22 21:42

編集2021/04/22 22:21
xail2222

総合スコア1497

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

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

0

(Security)は私も加えたんですけど、Logfile='Security'が取れなかったのはvbsだからかもですね。
なぜvbsでダメだったり端末によって取得できない場合があるのかわかりませんが、もしかしたら下記の設定が関係するかもしれません。

In order to successfully execute scripts that use WMI, the computer where WMI queries are addressed (the computer where the script is executed or a remote computer) should meet the following requirements:

https://support.smartbear.com/testcomplete/docs/scripting/working-with/wmi-objects.html#Permissions

でも、これを読んで私もいろいろやってみたんですけど、まだ成功していません…

なので違うかもですが、ご参考までに。

投稿2021/04/22 07:24

itagagaki

総合スコア8402

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

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

itagagaki

2021/04/22 07:26

あ、私がこれ書いてる間に解決しちゃいましたか。
xail2222

2021/04/22 07:48

いえ、情報ありがとうございます。 wmiのconfig managerが有ることは知りませんでした。 またvbsで取得出来ない謎も残っています ただ目的は達成出来た感じです
xail2222

2021/04/22 22:14 編集

コメント追加します。 vbsでもログは取得できました。ただ、中身の解析が出来なかったのです。 itagagakiさんがvbsで取得できなかったのは UACを完全に無効にしていない場合、管理者権限で実行しないと取得できないので そこの問題だったのかもしれないですね。
itagagaki

2021/04/23 01:22

なるほど、情報ありがとうございます。
guest

0

Logfile='System'Logfile='Application'なら取れましたが、Logfile='Security'が取れないですね。どうしてでしょうね?

(追記)
teratailのルールを理解していませんでした。
問題解決に向けての情報交換のつもりでしたが、どうやらteratailの「回答」というのは、そういう使い方は不適切なんですね。
失礼しました。

投稿2021/04/22 02:41

編集2021/04/23 17:55
itagagaki

総合スコア8402

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

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

xail2222

2021/04/22 03:52

情報ありがとうございます。セキュリティログを取るのを悩んでたのですが、とりあえず取れた気がします。 後は何処から接続しているかだと思います イベントビューアーからは見れるんですよね。。。
xail2222

2021/04/23 18:15 編集

>問題解決に向けての情報交換のつもりでしたが、どうやらteratailの「回答」というのは、そういう使い方は不適切なんですね。 どういう事ですか? 私は低評価していないですよ? 今回は、私が先々色々見付けれたので私の方で回答や質問に追記を書かせて頂きましたが、お互いに調べた結果を書いていって解決に導くと言うのも良いと思いますよ。 反応をくれないより全然いいと思います この回答も、質問の修正依頼でもないですし、回答に書いても良いんじゃないかと思います securityは取得できない。が回答になった可能性もあったのですし
itagagaki

2021/04/23 18:29

はい、xail2222さんが低評価されたとは思っていません :-) どなたが低評価されたのかわからないシステムですが、その方に向けて追記しました。 問題の解決の仕方については、私もそういう観点だったのですが、低評価されたことで、teratailはそういう使い方はダメ(つまり確実に回答になっていないことを「回答」に書いてはダメ)なのだと知りました。 正直納得はしかねるのですがルールなら仕方がありませんね… まあ納得はしていないのですが、これまた余計なことなのかもしれませんが、低評価されたことへのリアクションとして反省の弁を書き残させていただいた次第です。もしそれが気を悪くされたならすみません。
xail2222

2021/04/23 22:01 編集

低評価した人のポリシーでは『回答になっていないことを「回答」に書いてはダメ』と言うのはあるかもしれないですね。ですが、それはその低評価した人のポリシーです。 私も私なりのポリシーを持って参加していますが、一部の人のポリシーとはかみ合わない。と感じることがあります。 ですが、かみ合わない点が相手のポリシーに合せても良いと考える程度の点ではない場合もあります。 その場合は、私は自分のポリシーを大切にしているつもりです。 まぁ。合わせてもいい点なら合わせますけどね。 >正直納得はしかねるのですがルールなら仕方がありませんね… 低評価した人の中にはあるルールかもしれませんが、どこまでteratailの中で共有されているルールなのでしょうか。また、運営側から提示されているルールなのでしょうか。 私は投稿する立場としての参加はまだ浅いので、間違ったとらえ方かもしれませんが。 ※以前は、そんなに見てもいませんでした。 >低評価されたことへのリアクションとして反省の弁を書き残させていただいた次第です。 >もしそれが気を悪くされたならすみません。 追記の理由については、了解しました。解説ありがとうございます。 私は気を悪くしていませんが、気を悪くする人はもしかしたら可能性としてはいるかもしれないですね。 ですが、低評価の理由も、気を悪くしているかもしれない。というのも 推測でしかありません、直接言明されているわけでもありません。 ですので、あまり気にしない方が良いと思いますよ。 と私は思うのですが、itagagakiさんは気にしたいのかもしれないですね。 ま。私がこういう風に私の見解を述べるのも、私の自分勝手な感覚からです。 色々な人が居てこそ楽しいと私は感じているので、自分のポリシーは大切にしてほしいな。と感じました。 楽しむ場ではないのかもしれないですが、私は質問も回答もコメントも楽しみを感じるからこそ、参加しているので、これを運営側から否定されると寂しいですね。
itagagaki

2021/04/24 00:52

> 低評価した人の中にはあるルールかもしれませんが、どこまでteratailの中で共有されているルールなのでしょうか。また、運営側から提示されているルールなのでしょうか。 https://teratail.com/help 低評価の理由は書いてくれていなかったので、私は自分で調べて、ここに、こう書いているのを見つけました。 | 回答の評価基準は下記のように定めています。 | | 低評価(-)がつく回答 | ・間違っている回答 | ・質問の回答になっていない投稿 | ・スパムや攻撃的な表現など不快な投稿 この評価システムは、問題をずばっと解決する回答ほど上位に表示するための仕組みということで、それもまあ理解はできたのですが、せっかく問題解決に向けて書いたことに対してまで低評価をされると、やっぱり人間ですので、否定されたように感じてしまって、正直面白くないというのはありましたね。 私はteratailに本格的に参加してまだ2日目で、ちょっと独特な感じにびっくりしちゃいました。 このシステムは、おっしゃるとおり私も寂しいと思いますが、気にしないようにします。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問