セッション情報を列挙するには、WTSEnumerateSessions()関数を利用します。セッションの数だけWTS_SESSION_INFOが格納されたメモリへのポインタと、セッションの数を取得できます。
#include <tchar.h>
#include <iostream>
#include <windows.h>
#include <wtsapi32.h>
// lib
#pragma comment( lib, "wtsapi32.lib" )
/*
セッション情報を列挙する
*/
int _tmain
(
int argc
, _TCHAR* argv[]
)
{
// 標準出力にユニコードを表示できるようにする
setlocale( LC_ALL, "Japanese" );
/*
セッション情報を列挙する
*/
{
WTS_SESSION_INFO* pSessionInfos = NULL;
DWORD dwCount = 0;
// 指定したターミナルサーバー上のセッションのリストを取得
if ( 0 != ::WTSEnumerateSessions(
WTS_CURRENT_SERVER_HANDLE // アプリケーションを実行中のターミナルサーバー
, 0 // Reserved
, 1 // Version 1を固定で指定する
, &pSessionInfos // WTS_SESSION_INFOの受け取りポインタ
, &dwCount // セッション情報の数
) ) {
if ( NULL != pSessionInfos ) {
const static TCHAR* pStrState[] = {
L"WTSActive"
, L"WTSConnected"
, L"WTSConnectQuery"
, L"WTSShadow"
, L"WTSDisconnected"
, L"WTSIdle"
, L"WTSListen"
, L"WTSReset"
, L"WTSDown"
, L"WTSInit"
};
// セッション情報の表示
for ( int nI = 0; nI < (int)dwCount; nI++ ) {
WTS_SESSION_INFO* pTmp = &pSessionInfos[ nI ];
std::wcout << L"[ " << nI << L" ]" << std::endl;
std::wcout << L"SessionName = " << pTmp->pWinStationName << std::endl;
std::wcout << L"SessionId = " << pTmp->SessionId << std::endl;
std::wcout << L"SessionState = " << pStrState[ pTmp->State ] << L"( " << pTmp->State << L" )" << std::endl;
}
// メモリの解放
::WTSFreeMemory( pSessionInfos );
}
}
}
// 処理結果を返す
return 0;
}
[ 0 ] SessionName = Services SessionId = 0 SessionState = WTSDisconnected( 4 ) [ 1 ] SessionName = Console SessionId = 6 SessionState = WTSActive( 0 ) [ 2 ] SessionName = 7A78855482A04FA781DC SessionId = 65536 SessionState = WTSListen( 6 )