- 2013-3-28
- Visual C++
Windowsサービスから現在のログオンユーザを取得するプログラム。
サービスから取得するには、通常のGetUserNameとかでは取得できないっぽい。。
色々と調べた結果、下記で取得できそう。
まぁ、自己責任でお願いします。
ソース
#include "wtsapi32.h" #pragma comment(lib, "wtsapi32.lib") void CTest::GetActUserName() { PWTS_SESSION_INFOW pStSesInf = NULL; DWORD dwCount = 0; DWORD dwSesId = 0; DWORD dwSize = 0; LPTSTR lpNameTmp = NULL; // ログオンユーザのセッションリストを取得する if( ::WTSEnumerateSessionsW( NULL, 0, // 予約(必ず0を指定) 1, // 列挙要求のバージョン(必ず1を指定) &pStSesInf, // 構造体の配列へのポインタを受取る &dwCount ) == FALSE ) // 構造体の数格納用(セッションリスト数) { // 取得失敗 return; } // セッションリスト数分繰り返す for( DWORD dwLoop = 0; dwLoop < dwCount; dwLoop++ ) { // セッションリストから順次セッション情報を取得する if( ::WTSQuerySessionInformation( WTS_CURRENT_SERVER_HANDLE, // ターミナルサーバハンドル pStSesInf[ dwLoop ].SessionId, // セッションの識別子 WTSUserName, // セッションに関連付けられたユーザー受取を指定 &lpNameTmp, // ユーザ名ポインタ格納用 &dwSize ) == TRUE ) // 受取のデータサイズ { // 現在アクティブなセッションのIDを取得 dwSesId = ::WTSGetActiveConsoleSessionId(); // セッションIDを比較しアクティブなセッションIDと同一ならユーザ名を表示する if( pStSesInf[ dwLoop ].SessionId == dwSesId ) { CString strName; strName.Format( "\nLogonUser:%s\n", lpNameTmp ); // デバック出力 TRACE( strName ); } else { // たぶん複数ユーザでログインしている場合でアクティブじゃないユーザが表示される? // 未確認・・確認した誰か教えて・・ CString strName; strName.Format( "\nLogonUser:%s\n", lpNameTmp ); // デバック出力 TRACE( strName ); } } else { // 取得失敗 return; } } if( lpNameTmp != NULL ) { // 解放 WTSFreeMemory( lpNameTmp ); lpNameTmp = NULL; } if( pStSesInf != NULL ) { // 解放 WTSFreeMemory( pStSesInf ); pStSesInf = NULL; } return; }
各APIのヘルプ
WTSEnumerateSessions
WTSQuerySessionInformation
WTSGetActiveConsoleSessionId
んな、感じ。
各APIで検索すると結構引っかかったりする^^;