Windowsサービスから現在のログオンユーザを取得する

  • デル株式会社
  • 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で検索すると結構引っかかったりする^^;

    
       
             

    関連記事

    ページ上部へ戻る