イベントログからリモートデスクトップの接続ログを取得 [PowerShell]
PowerShellを使ってイベントログを照会してそこからリモートデスクトップ接続についてのログを抽出する。久々のPowerShellネタ。
リモートデスクトップの接続ログを取得
リモートデスクトップサービスのログはプロバイダー「RemoteDesktopServices-RdpCoreTS」にあります。次は接続ログを取得するサンプルです。このログでは接続元IPアドレスと接続・切断日時はわかりますが、接続先ユーザー名は判別できません。
$Events = get-winevent -logname Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational `
-filterxpath "Event[System[EventID='131' or EventID='102']"
$Events | Select-Object TimeCreated,MachineName,UserId,Message|format-table -auto
TimeCreated MachineName UserId Message
----------- ----------- ------ -------
06/20/2014 1:50:50 NT62 S-1-5-20 サーバーはクライアントとのメイン RDP 接続を終了しました。
06/20/2014 1:50:01 NT62 S-1-5-20 サーバーはクライアントとのメイン RDP 接続を終了しました。
06/20/2014 1:49:21 NT62 S-1-5-20 サーバーはクライアント xx.xx.xx.xx:yyyyy からの新しい TCP 接続を受け入れ...
06/20/2014 1:49:20 NT62 S-1-5-20 サーバーはクライアント xx.xx.xx.xx:yyyyy からの新しい TCP 接続を受け入れ...
06/20/2014 1:47:24 NT62 S-1-5-20 サーバーはクライアントとのメイン RDP 接続を終了しました。
06/20/2014 1:46:36 NT62 S-1-5-20 サーバーはクライアントとのメイン RDP 接続を終了しました。
06/20/2014 1:46:01 NT62 S-1-5-20 サーバーはクライアントとのメイン RDP 接続を終了しました。
06/20/2014 1:45:55 NT62 S-1-5-20 サーバーはクライアント xx.xx.xx.xx:yyyyy からの新しい TCP 接続を受け入れ...
06/20/2014 1:45:54 NT62 S-1-5-20 サーバーはクライアント xx.xx.xx.xx:yyyyy からの新しい TCP 接続を受け入れ...
06/20/2014 1:45:28 NT62 S-1-5-20 サーバーはクライアントとのメイン RDP 接続を終了しました。
06/20/2014 1:44:43 NT62 S-1-5-20 サーバーはクライアント xx.xx.xx.xx:yyyyy からの新しい TCP 接続を受け入れ...
06/20/2014 1:44:31 NT62 S-1-5-20 サーバーはクライアント xx.xx.xx.xx:yyyyy からの新しい TCP 接続を受け入れ...
特定ユーザーのログオン履歴と接続元IPアドレスを取得
Windowsユーザー認証のログはSecurityログにあります。Securityログへのアクセスには管理者権限が必要です。以前PopwerShellからログオン履歴を取得する記事で作ったものを多少いじっただけなので、解説は省略します。
$Events = get-winevent -logname Security `
-filterxpath ("Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] "`
+ "and EventID='4624']] "`
+ "and Event[EventData[Data[@Name='TargetUserName']='xxxxx@yyy.zz']]") -MaxEvents 16
ForEach ($Event in $Events) {
$eventXML = [xml]$Event.ToXml()
For ($i=0; $i -lt $eventXML.Event.EventData.Data.Count; $i++) {
Add-Member -InputObject $Event -MemberType NoteProperty -Force `
-Name $eventXML.Event.EventData.Data[$i].Name `
-Value $eventXML.Event.EventData.Data[$i].'#text'
}
}
$Events | Select-Object TimeCreated,Id,TargetUserName,IpAddress,TargetLogonId,Message|format-table -auto
ForEach-Addmemberまでのコマンドは、Eventに含まれているXML化された詳細なイベントデータをEventにオブジェクトとして追加する処理です。これによってイベントデータの値をPowerShellで直接扱うことができるようになります。EventData内Data要素のName属性が名前、その要素のデータが値になります。この部分は参考ページより引用したものです。XMLデータを直接参照してもいいのですが、スクリプトが冗長になることやこの部分をイベントログを処理する他のスクリプトで使い回せることを考えると、この方が都合がいいように思います。
TimeCreated Id TargetUserName IpAddress TargetLogonId Message
----------- -- -------------- --------- ------------- -------
06/21/2014 10:09:33 4624 xxxxx@yyy.zz - 0x175084f7 アカウントが正常にログオンしました。...
06/21/2014 10:09:33 4624 xxxxx@yyy.zz - 0x17508429 アカウントが正常にログオンしました。...
06/21/2014 10:09:33 4624 xxxxx@yyy.zz 127.0.0.1 0x17508441 アカウントが正常にログオンしました。...
06/21/2014 10:09:33 4624 xxxxx@yyy.zz 127.0.0.1 0x175083a7 アカウントが正常にログオンしました。...
06/21/2014 9:55:13 4624 xxxxx@yyy.zz - 0x1739ae5e アカウントが正常にログオンしました。...
06/21/2014 9:55:13 4624 xxxxx@yyy.zz - 0x1739ad83 アカウントが正常にログオンしました。...
06/21/2014 9:55:13 4624 xxxxx@yyy.zz 127.0.0.1 0x1739ad9d アカウントが正常にログオンしました。...
06/21/2014 9:55:13 4624 xxxxx@yyy.zz 127.0.0.1 0x1739ad01 アカウントが正常にログオンしました。...
06/21/2014 2:11:40 4624 xxxxx@yyy.zz 192.168.24.14 0x16df6fc4 アカウントが正常にログオンしました。...
06/21/2014 2:11:40 4624 xxxxx@yyy.zz 192.168.24.14 0x16df6f08 アカウントが正常にログオンしました。...
06/21/2014 1:21:35 4624 xxxxx@yyy.zz xx.xx.xx.xx 0x16bb9636 アカウントが正常にログオンしました。...
06/21/2014 1:21:35 4624 xxxxx@yyy.zz xx.xx.xx.xx 0x16bb95aa アカウントが正常にログオンしました。...
06/21/2014 0:33:58 4624 xxxxx@yyy.zz - 0x162be2a0 アカウントが正常にログオンしました。...
06/21/2014 0:33:58 4624 xxxxx@yyy.zz - 0x162be1d3 アカウントが正常にログオンしました。...
06/21/2014 0:33:58 4624 xxxxx@yyy.zz 127.0.0.1 0x162be1eb アカウントが正常にログオンしました。...
06/21/2014 0:33:58 4624 xxxxx@yyy.zz 127.0.0.1 0x162be153 アカウントが正常にログオンしました。...
結果からローカルのログオンを除くには次のようにします。
$Events = get-winevent -logname Security `
-filterxpath ("Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (EventID='4624' or EventID='4634' or EventID='4647')]] "`
+ "and Event[EventData[" `
+ "Data[@Name='TargetUserName']='xxxxx@yyy.zz'"`
+ "and Data[@Name='IpAddress']!='-'"`
+ "and Data[@Name='IpAddress']!='127.0.0.1'"`
+ "]]")
TargetLogonIdから該当セッションのログオフイベントを特定することができるので、そこからログオン時間を計算するスクリプトを作ってみたのですが、Microsoftアカウントを使っているとローカルユーザー名と混ざっていて一致しない場合があることと、実行にかなり時間が掛かるのでやめました。