Win32API 起動中プロセスの情報(プロセス名、プロセスID、セッションID)を列挙する

起動中のプロセスの情報(プロセス名、プロセスID、セッションID)を列挙するには、ターミナルサービスAPIのWTSEnumerateProcesses関数を用いる。


WTSEnumerateProcesses関数のプロトタイプ

BOOL WTSEnumerateProcesses(
  HANDLE hServer, //ターミナルサーバーのハンドル(WSTOpenSeverで取得する)
  DWORD Reserved, //必ず0を指定する
  DWORD Version, //必ず1を指定する
  PWTS_PROCESS_INFO *ppProcessInfo, //WTS_PROCESS構造体配列へのポインタ
  DWORD *pCount //取得できたWTS_PROCESS構造体配列の要素数
);



  • WTSEnumerateProcesses関数で、このプログラムを実行中のターミナルサーバーのプロセス名、プロセスID、セッションIDを列挙するサンプルプログラム
  • #include <windows.h>
    #include <stdio.h>
    #include <wtsapi32.h>
    
    #pragma comment(lib, "wtsapi32.lib")
    
    int main()
    {
        HANDLE hServer = WTS_CURRENT_SERVER_HANDLE;
        PWTS_PROCESS_INFO ProcessInfo;
        DWORD dwCount = 0;
    
        //プロセス情報を取得する
        WTSEnumerateProcesses(hServer,
            0,
            1,
            &ProcessInfo,
            &dwCount);
    
        //取得したプロセス情報(プロセス名、プロセスID、セッションID)をコンソールに表示する
        for (DWORD i=0; i < dwCount; i++) {
    
            _tprintf(TEXT("ProcessName:%s, ProcessId:%d, SessionId:%d\n"), 
                ProcessInfo[i].pProcessName, 
                ProcessInfo[i].ProcessId, 
                ProcessInfo[i].SessionId);
        
        }
    
        //WTS_PROCESS_INFO構造体配列のメモリを解放する
        WTSFreeMemory(ProcessInfo);
    
        return 0;
    }


  • 実行結果(実行環境はWindows7)

  • セッションIDに0と1が存在するのは、Windows Vistaから実装されたセッション0の分離のため。

    ProcessName:, ProcessId:0, SessionId:0
    ProcessName:System, ProcessId:4, SessionId:0
    ProcessName:smss.exe, ProcessId:384, SessionId:0
    ProcessName:csrss.exe, ProcessId:496, SessionId:0
    ProcessName:wininit.exe, ProcessId:612, SessionId:0
    ProcessName:csrss.exe, ProcessId:636, SessionId:1
    ProcessName:services.exe, ProcessId:668, SessionId:0
    ProcessName:lsass.exe, ProcessId:684, SessionId:0
    ProcessName:lsm.exe, ProcessId:692, SessionId:0
    ProcessName:svchost.exe, ProcessId:804, SessionId:0
    ProcessName:TrueSuiteService.exe, ProcessId:864, SessionId:0
    ProcessName:winlogon.exe, ProcessId:916, SessionId:1
    ProcessName:svchost.exe, ProcessId:976, SessionId:0
    ProcessName:MsMpEng.exe, ProcessId:160, SessionId:0
    ProcessName:svchost.exe, ProcessId:540, SessionId:0
    ProcessName:svchost.exe, ProcessId:556, SessionId:0
    ProcessName:svchost.exe, ProcessId:500, SessionId:0
    ProcessName:stacsv64.exe, ProcessId:624, SessionId:0
    ProcessName:svchost.exe, ProcessId:1436, SessionId:0
    ProcessName:svchost.exe, ProcessId:1520, SessionId:0
    ProcessName:spoolsv.exe, ProcessId:1692, SessionId:0
    ・・・・・・・・・・・・・・(続く)・・・・・・・・・・・・・・・・




  • リモートののターミナルサーバーであれば、以下の例のようにWTSOpenServer関数にリモートPCののNETBIOS名を指定して、ターミナルサーバーのハンドルをオープンする必要がある。
  • #include <windows.h>
    #include <stdio.h>
    #include <wtsapi32.h>
    
    #pragma comment(lib, "wtsapi32.lib")
    
    int main()
    {
        HANDLE hServer;
        PWTS_PROCESS_INFO ProcessInfo;
        DWORD dwCount = 0;
        TCHAR szNetBiosName[] = TEXT("リモートPCののNETBIOS名");//リモートPCのNETBIOS名を指定する
        
        //ターミナルサーバーのハンドルを開く
        hServer = WTSOpenServer(szNetBiosName);
        if (hServer == NULL) {
            return 1;
        }
    
        //プロセス情報を取得する
        WTSEnumerateProcesses(hServer,
            0,
            1,
            &ProcessInfo,
            &dwCount);
    
        //取得したプロセス情報(プロセス名、プロセスID、セッションID)をコンソールに表示する
        for (DWORD i=0; i < dwCount; i++) {
    
            _tprintf(TEXT("ProcessName:%s, ProcessId:%d, SessionId:%d\n"), 
                ProcessInfo[i].pProcessName, 
                ProcessInfo[i].ProcessId, 
                ProcessInfo[i].SessionId);
        
        }
    
        //WTS_PROCESS_INFO構造体配列のメモリを解放する
        WTSFreeMemory(ProcessInfo);
    
        //ターミナルサーバーのハンドルを閉じる
        WTSCloseServer(hServer);
    
        return 0;
    }




  • 参考

  • http://msdn.microsoft.com/ja-jp/library/cc429622.aspx WTSOpenServer
    http://msdn.microsoft.com/ja-jp/library/cc429609.aspx WTSEnumerateProcesses
    http://msdn.microsoft.com/ja-jp/library/cc429617.aspx WTSFreeMemory
    http://msdn.microsoft.com/ja-jp/library/cc429603.aspx WTSCloseServer