環境:WinXP Pro + VC++6(Win32SDK)
ユーザーがログインした状態かログオフした状態か
はどのようにして判断できるのか分かりません。
ご存知の方がいましたら教えて下さい。
それを判断したいということは、ユーザーがログインしていない状態でも実行されるプロ
グラムを作りたいということですね。
この前提は合っていますか?
aetos様
合ってます。
サービスかタスク起動のものにする予定です。
具体的に言いますと
ログオフ状態ならばマシンをシャットダウンするプログラムを作成中です。
どうぞ宜しくお願い致します。
検証していないので確証はありませんが、ターミナル サービス系の API が使えるんじゃ
ないかなーと思います。
WTSGetActiveConsoleSessionId 関数でうまくいけばお手軽ですね。
http://msdn.microsoft.com/en-us/library/aa383835(VS.85).aspx
あ、WTSGetActiveConsoleSessionId だと、リモートデスクトップ等で遠隔ログインして
いる場合は検出できないかもしれません。
リモートデスクトップ等も「ログインしている」とみなすなら、試してみてください。
もう一つ。
例えば、そのアプリが動くマシンがファイル共有しているとして、誰かがその共有フォル
ダを開いているってのは、シャットダウンしちゃっていいんですか?
そのマシンが Web サーバや FTP サーバで…っていう可能性を考えるときりがないので、
それは考えないものとしましょうか。
さて、リモートデスクトップもログインしているうちに含み、かつ、
WTSGetActiveConsoleSessionId ではそれを検出できない場合となると、ログオンセッシ
ョンを列挙して、そのタイプ(インタラクティブ、リモート、サービス、タスク等)を判
断し、サービスやタスク等、ユーザが明示的にログインしていないセッションだけならシ
ャットダウンして OK、と判断することになりますか。
セッションの列挙には WTSEnumerateSessions 関数、
http://msdn.microsoft.com/en-us/library/aa383833.aspx
列挙したセッション ID からログオンタイプを取得するには、WTSQueryUserToken 関数と
GetTokenInformation 関数でいけそうな気がします。
WTSQueryUserToken はサービスからしか実行できないので、タスクの場合は別の手段を考
えましょう。
http://msdn.microsoft.com/en-us/library/aa383840.aspx
http://msdn.microsoft.com/en-us/library/aa446671.aspx
GetTokenInformation 関数でログオンタイプを識別するには、TokenGroups 情報を取得し
て、どのグループに所属しているかを見ます。
グループは、Administrators や Users 等のよく知られたものの他に、ネットワーク、イ
ンタラクティブ、サービス、バッチ(タスク)、リモートなど、現在のログイン形態を表
すものがあります。
CreateWellKnownSid 関数を参考にしてください。
http://msdn.microsoft.com/en-us/library/aa446585.aspx
連投失礼。
上記の方法は、任意のタイミングで、ログオンしているユーザーがいるかどうかを調べる
ものです。
そうでなく、ユーザーがログオフしたタイミングを知りたい場合、
Winlogon Notification Packages
http://msdn.microsoft.com/en-us/library/aa380545.aspx
WTSRegisterSessionNotification
http://msdn.microsoft.com/en-us/library/aa383841.aspx
サービスであれば、SERVICE_CONTROL_SESSIONCHANGE イベント
http://msdn.microsoft.com/en-us/library/ms683241.aspx
等で判断できるでしょう。