ログオフ状態の検出 – プログラミング – Home

通知
すべてクリア

ログオフ状態の検出


ken
 ken
(@ken)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

環境:WinXP Pro + VC++6(Win32SDK)

ユーザーがログインした状態かログオフした状態か
はどのようにして判断できるのか分かりません。

ご存知の方がいましたら教えて下さい。


引用解決済
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

それを判断したいということは、ユーザーがログインしていない状態でも実行されるプロ
グラムを作りたいということですね。
この前提は合っていますか?


返信引用
ken
 ken
(@ken)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

aetos様

合ってます。
サービスかタスク起動のものにする予定です。

具体的に言いますと
ログオフ状態ならばマシンをシャットダウンするプログラムを作成中です。
どうぞ宜しくお願い致します。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

検証していないので確証はありませんが、ターミナル サービス系の API が使えるんじゃ
ないかなーと思います。

WTSGetActiveConsoleSessionId 関数でうまくいけばお手軽ですね。
http://msdn.microsoft.com/en-us/library/aa383835(VS.85).aspx


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

あ、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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

連投失礼。

上記の方法は、任意のタイミングで、ログオンしているユーザーがいるかどうかを調べる
ものです。
そうでなく、ユーザーがログオフしたタイミングを知りたい場合、

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

等で判断できるでしょう。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました