- 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で検索すると結構引っかかったりする^^;








