hack のためのネタ帳, etc,,,

2023-01-19 補足:
この方法では screen unlock を正確に記録出来てないので、続きも参照

経緯

Windows でログオン、もしくはスクリーンロックの解除を行った時刻を労力をかけずに知りたい。

「⊞(WindowsLogoKey)+X」→「イベントビューア(V)」で
「Windows ログ」→「セキュリティ」から「イベント ID」が 4672 の Special Logon で Message に「アカウント名 .*${USERNAME}」が含まれているのを拾えば良さそう。

Windows ログイン時刻」でググると以下のページを見つけた。
Get-WinEvent か Get-EventLog で Security を拾って来来ればよいらしい。

以下のような感じでログオン・スクリーンロック解除の日時を拾う事が出来た。
Get-WinEvent Security | Where-Object { $_.Id -eq 4672 } |% { $x=$_; $_.Message | sls "アカウント名.*(${Env:USERNAME})" |% { "$($x.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss")) $($_.Matches.Groups[1].Value)"} }
Get-EventLog Security | Where-Object { $_.InstanceId -eq 4672 } |% { $x=$_; $_.Message | sls "アカウント名.*(${Env:USERNAME})" |% { "$($x.TimeGenerated.ToString("yyyy-MM-dd HH:mm:ss")) $($_.Matches.Groups[1].Value)"} }

ただ、これ、どちらも同じものを拾って来ているはずなのに、見ての通りメンバー名に統一性がないという謎仕様で、
更に Get-EventLog に比べて Get-WinEvent はどうしてこんなにと不思議になるレベルでトラバースが遅い。
もっとも、Get-EventLog も相当に遅いので、地味に辛いところ。
直近の記録だけでよいなら、Select-Object -First <件数> を途中にかませてフィルタリングしたほうが良いかもしれない。

あと、管理者権限ないと Security のログを拾えないようなので、管理者権限で PowerShell を実行しておく必要がある。
Start-Process で UAC のダイアログにより権限昇格させるなら以下のような感じだろうか?
Start-Process -Verb RunAs powershell '-Command Get-EventLog Security | Where-Object { $_.InstanceId -eq 4672 } |% { $x=$_; $_.Message | sls \"アカウント名.*(${Env:USERNAME})\" |% { \"$($x.TimeGenerated.ToString(\"yyyy-MM-dd HH:mm:ss\")) $($_.Matches.Groups[1].Value)\"} };pause'
シングルクオーテーションで括っているのに、ダブルクォーテーションをエスケープしないとエラーになるのはなぜだ?

スクリーンロック解除時刻や、過去のログオン時刻が不要で、現在のログオンについてのみのログオン時刻が欲しい場合は、
query user コマンド、または、quser コマンドが便利そうだった。

参考

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます