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構造体配列の要素数 );
#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; }
セッション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 ・・・・・・・・・・・・・・(続く)・・・・・・・・・・・・・・・・
#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