WIn32API セッション情報を列挙する
セッション情報(ウィンドウステーション、セッションID、状態)を列挙するには、ターミナルサービスAPIのWTSEnumerateSessions関数を用いる。
BOOL WTSEnumerateSessions( HANDLE hServer, //ターミナルサーバーのハンドル(WSTOpenSeverで取得する) DWORD Reserved, //必ず0を指定する DWORD Version, //必ず1を指定する PWTS_SESSION_INFO *ppSessionInfo, //WTS_SESSION_INFO構造体配列へのポインタ DWORD *pCount //取得できたWTS_PROCESS構造体配列の要素数 );
typedef struct _WTS_SESSION_INFO { DWORD SessionId; //セッションID LPTSTR pWinStationName; //ウィンドウステーション名 WTS_CONNECTSTATE_CLASS State; //セッション接続状態 } WTS_SESSION_INFO, *PWTS_SESSION_INFO;
/*=================================================================== == WTS_CONNECTSTATE_CLASS - Session connect state =====================================================================*/ typedef enum _WTS_CONNECTSTATE_CLASS { WTSActive, // User logged on to WinStation WTSConnected, // WinStation connected to client WTSConnectQuery, // In the process of connecting to client WTSShadow, // Shadowing another WinStation WTSDisconnected, // WinStation logged on without client WTSIdle, // Waiting for client to connect WTSListen, // WinStation is listening for connection WTSReset, // WinStation is being reset WTSDown, // WinStation is down due to error WTSInit, // WinStation in initialization } WTS_CONNECTSTATE_CLASS;
#include <windows.h> #include <stdio.h> #include <wtsapi32.h> #pragma comment(lib, "wtsapi32.lib") const TCHAR * ToStringSessionConnectState(DWORD dwState) { switch (dwState) { case WTSActive://User logged on to WinStation return TEXT("WTSActive"); case WTSConnected://WinStation connected to client return TEXT("WTSConnected"); case WTSConnectQuery://In the process of connecting to client return TEXT("WTSConnectQuery"); case WTSShadow://Shadowing another WinStation return TEXT("WTSShadow"); case WTSDisconnected://WinStation logged on without client return TEXT("WTSDisconnected"); case WTSIdle://Waiting for client to connect return TEXT("WTSIdle"); case WTSListen://WinStation is listening for connection return TEXT("WTSListen"); case WTSReset://WinStation is being reset return TEXT("WTSReset"); case WTSDown://WinStation is down due to error return TEXT("WTSDown"); case WTSInit://WinStation in initialization return TEXT("WTSInit"); default: return TEXT("Unknown"); } } int main() { PWTS_SESSION_INFO SessionInfo; DWORD dwCount = 0; WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &SessionInfo, &dwCount); for (DWORD i=0; i < dwCount; i++) { _tprintf(TEXT("WinStationName:%s, SessionId:%d, State:%s\n"), SessionInfo[i].pWinStationName, SessionInfo[i].SessionId, ToStringSessionConnectState(SessionInfo[i].State)); } WTSFreeMemory(SessionInfo); return 0; }
WinStationName:Services, SessionId:0, State:WTSDisconnected WinStationName:Console, SessionId:1, State:WTSActive
#include <windows.h> #include <stdio.h> #include <wtsapi32.h> #pragma comment(lib, "wtsapi32.lib") const TCHAR * ToStringSessionConnectState(DWORD dwState) { switch (dwState) { case WTSActive://User logged on to WinStation return TEXT("WTSActive"); case WTSConnected://WinStation connected to client return TEXT("WTSConnected"); case WTSConnectQuery://In the process of connecting to client return TEXT("WTSConnectQuery"); case WTSShadow://Shadowing another WinStation return TEXT("WTSShadow"); case WTSDisconnected://WinStation logged on without client return TEXT("WTSDisconnected"); case WTSIdle://Waiting for client to connect return TEXT("WTSIdle"); case WTSListen://WinStation is listening for connection return TEXT("WTSListen"); case WTSReset://WinStation is being reset return TEXT("WTSReset"); case WTSDown://WinStation is down due to error return TEXT("WTSDown"); case WTSInit://WinStation in initialization return TEXT("WTSInit"); default: return TEXT("Unknown"); } } int main() { HANDLE hServer; PWTS_SESSION_INFO SessionInfo; DWORD dwCount = 0; TCHAR szNetBiosName[] = TEXT(<span class="deco" style="color:#FF0000;">"リモートPCのNETBIOS名"</span>);//リモートPCのNETBIOS名を指定する hServer = WTSOpenServer(szNetBiosName); if (hServer == NULL) { return 1; } WTSEnumerateSessions(hServer, 0, 1, &SessionInfo, &dwCount); for (DWORD i=0; i < dwCount; i++) { _tprintf(TEXT("WinStationName:%s, SessionId:%d, State:%s\n"), SessionInfo[i].pWinStationName, SessionInfo[i].SessionId, ToStringSessionConnectState(SessionInfo[i].State)); } WTSFreeMemory(SessionInfo); WTSCloseServer(hServer); return 0; }
http://msdn.microsoft.com/ja-jp/library/cc429613.aspx