前提・実現したいこと
リモートデスクトップに接続している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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。