WIn32API ターミナルサーバー上のプロセスを終了させる

ターミナルサーバー上のプロセスを終了させるには、WTSTerminateProcess関数を用いる。


  • WTSTerminateProcess関数のプロトタイプ
  • BOOL WTSTerminateProcess(
      HANDLE hServer, //ターミナルサーバーのハンドル
      DWORD ProcessId,//終了させるプロセスID
      DWORD ExitCode //終了コード
    );



  • このプログラムを実行中のターミナルサーバー上で、インターネットエクスプローラのプロセスを終了させるサンプルコード

  • 実際は、予めインターネットエクスプローラを起動しておく必要がある

    #include <windows.h>
    #include <stdio.h>
    
    #include <wtsapi32.h>
    #pragma comment(lib, "wtsapi32.lib")
    
    #include <shlwapi.h>
    #pragma comment(lib, "shlwapi.lib")
    
    int main()
    {
        PWTS_PROCESS_INFO ProcessInfo;
        DWORD dwCount = 0;
    
        //ターミナルサーバー上のプロセス情報を取得する
        WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE,
            0,
            1,
            &ProcessInfo,
            &dwCount);
    
        //インターネットエクスプローラのプロセスを終了させる
        for (DWORD i=0; i < dwCount; i++) {
            if (StrCmpI(ProcessInfo[i].pProcessName, TEXT("iexplore.exe")) == 0) {
                WTSTerminateProcess(WTS_CURRENT_SERVER_HANDLE, ProcessInfo[i].ProcessId, 0);
            }
        }
        
        WTSFreeMemory(ProcessInfo);
        
        return 0;
    }



  • リモートPCのターミナルサーバー上のインターネットエクスプローラを終了させるためには、WTSOpenServer関数でターミナルサーバーのハンドルを取得する必要がある。
  • #include <windows.h>
    #include <stdio.h>
    
    #include <wtsapi32.h>
    #pragma comment(lib, "wtsapi32.lib")
    
    #include <shlwapi.h>
    #pragma comment(lib, "shlwapi.lib")
    
    int main()
    {
        HANDLE hServer;
        PWTS_PROCESS_INFO ProcessInfo;
        DWORD dwCount = 0;
        //TCHAR szNetBiosName[] = TEXT("リモートPCのNETBIOS名");//リモートPCのNETBIOS名を指定する
        TCHAR szNetBiosName[] = TEXT("");
    
        hServer = <span class="deco" style="color:#FF0000;">WTSOpenServer</span>(szNetBiosName);
        if (hServer == NULL) {
            return 1;
        }
    
        //プロセス情報を取得する
        WTSEnumerateProcesses(hServer,
            0,
            1,
            &ProcessInfo,
            &dwCount);
    
        //インターネットエクスプローラのプロセスを終了させる
        for (DWORD i=0; i < dwCount; i++) {
            if (StrCmpI(ProcessInfo[i].pProcessName, TEXT("iexplore.exe")) == 0) {
                WTSTerminateProcess(WTS_CURRENT_SERVER_HANDLE, ProcessInfo[i].ProcessId, 0);
            }
        }
    
        //クリーンアップ
        WTSFreeMemory(ProcessInfo);
        WTSCloseServer(hServer);
        
        return 0;
    }





  • 参考

  • http://msdn.microsoft.com/ja-jp/library/cc429641.aspx