2023-01-19 補足:
この方法では screen unlock を正確に記録出来てないので、続きも参照
この方法では screen unlock を正確に記録出来てないので、続きも参照
Windows でログオン、もしくはスクリーンロックの解除を行った時刻を労力をかけずに知りたい。
「⊞(WindowsLogoKey)+X」→「イベントビューア(V)」で
「Windows ログ」→「セキュリティ」から「イベント ID」が 4672 の Special Logon で Message に「アカウント名 .*${USERNAME}」が含まれているのを拾えば良さそう。
「Windows ログイン時刻」でググると以下のページを見つけた。
Get-WinEvent か Get-EventLog で Security を拾って来来ればよいらしい。
以下のような感じでログオン・スクリーンロック解除の日時を拾う事が出来た。
ただ、これ、どちらも同じものを拾って来ているはずなのに、見ての通りメンバー名に統一性がないという謎仕様で、
更に Get-EventLog に比べて Get-WinEvent はどうしてこんなにと不思議になるレベルでトラバースが遅い。
もっとも、Get-EventLog も相当に遅いので、地味に辛いところ。
直近の記録だけでよいなら、Select-Object -First <件数> を途中にかませてフィルタリングしたほうが良いかもしれない。
あと、管理者権限ないと Security のログを拾えないようなので、管理者権限で PowerShell を実行しておく必要がある。
Start-Process で UAC のダイアログにより権限昇格させるなら以下のような感じだろうか?
スクリーンロック解除時刻や、過去のログオン時刻が不要で、現在のログオンについてのみのログオン時刻が欲しい場合は、
query user コマンド、または、quser コマンドが便利そうだった。
「⊞(WindowsLogoKey)+X」→「イベントビューア(V)」で
「Windows ログ」→「セキュリティ」から「イベント ID」が 4672 の Special Logon で Message に「アカウント名 .*${USERNAME}」が含まれているのを拾えば良さそう。
「Windows ログイン時刻」でググると以下のページを見つけた。
- HatenaBlog / "BOKU"のITな日常 / 2019-07-08: 勤務実態を調査用に、イベントログからログオン・ログオフ時間等を抽出する方法。(GET-WinEvent)
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 コマンドが便利そうだった。
- @IT / Windows Server Insider / Windows TIPS 2008-11-14: システムへのログオン時間を調べる
- Google: PowerShell grep
- HatenaBlog / Sanwa Systems Tech Blog / 2016-07-05: grepコマンドとPowerShellのsls (Select-String)の比較
- Google: powershell head tail
- 俺的備忘録 〜なんかいろいろ〜 / 2015-01-14: PowerShellでhead,tail相当の処理を行う
- Google: powershell typeof
- 全ては時の中に… / 2009-02-29: 【PowerShell】データ型の確認
- Google: PowerShell オブジェクト 詳細
- Microsoft / Docs
- PowerShell / スクリプト作成 / オブジェクトの構造を表示する (Get-member)
- Microsoft / Docs
- .NET / .NET API ブラウザー
- System / DateTime / DateTime 構造体
- System.Text.RegularExpressions / Match / Match クラス
- PowerShell / スクリプト作成 / Select-String
- .NET / .NET API ブラウザー
タグ
コメントをかく