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構造体配列の要素数
);



  • WTS_SESSION_INFO構造体は、WtsApi32.h に以下のように定義されている。
  • typedef struct _WTS_SESSION_INFO {
      DWORD                  SessionId; //セッションID
      LPTSTR                 pWinStationName; //ウィンドウステーション名
      WTS_CONNECTSTATE_CLASS State; //セッション接続状態
    } WTS_SESSION_INFO, *PWTS_SESSION_INFO;


  • WTS_CONNECTSTATE_CLASS列挙体は以下のように定義されている。
  • /*===================================================================
    ==   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;





  • WTSEnumerateSessions関数で、このプログラムを実行中のターミナルサーバー上のウィンドウステーション名、セッションID、セッション接続状態を列挙するサンプルプログラム
  • #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




  • リモートPCのターミナルサーバーのセッション情報を取得するためには、WTSOpenServer関数でターミナルサーバーのハンドルをオープンする必要がある
  • #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