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アカウントを使っているとローカルユーザー名と混ざっていて一致しない場合があることと、実行にかなり時間が掛かるのでやめました。

参考ページ


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!