GetLastInputInfo() が偽装中のユーザーの情報を返さないのはなぜか?
GetLastInputInfo() 関数は、偽装 (impersonation) 中のユーザーではなく、常に現在のセッションの対話ユーザー (現在デスクトップにログオンしているユーザー) の最終入力情報を返します。これは、この関数が偽装を考慮せず、システム全体の最終入力時刻を追跡するように設計されているためです。したがって、偽装コンテキストで実行していても、呼び出し元のスレッドが偽装しているユーザーの情報は取得できません。
背景メモ
レイモンド・チェン(Raymond Chen)は、Microsoftの公式ブログ「The Old New Thing」でWindowsの内部動作や設計思想を解説する著名エンジニア。本記事で扱われる「GetLastInputInfo()」は、システム全体で最後にユーザー入力(キーボード・マウス操作など)があった時刻を取得するWindows API。このAPIはプロセスが別のユーザーを偽装(impersonation)している場合でも、偽装先ではなく元のユーザーの最終入力時刻を返す仕様になっている。偽装とは、あるスレッドが一時的に別のユーザーのセキュリティコンテキストで動くことを指す。チェンはこの挙動がなぜ「バグ」ではなく設計上の意図(偽装は認証情報の一時的借与であり、操作対象のユーザーセッションを変更するわけではない)に基づくのかを説明している。