.NET Framework v3.5 では System.Management 名前空間を使って
WMI プロバイダ経由でいろいろなデータの取得や設定、また操作ができます。

その中で Win32_Process クラスを使って
プロセスの起動と終了を行うサンプルを作成してみました

using System;
using System.Collections.Generic;
using System.Management;
using System.Diagnostics;

namespace EnvironmentManagement
{
    class Program
    {
        static void Main(string[] args)
        {
            // calc.exe を実行する
            int processId = InvokeProcess("calc.exe");

            Console.ReadLine();

            // 指定したプロセスIDを終了する
            TerminateProcess(processId);

            Console.ReadLine();
        }

        // 引数に指定された実行ファイルを起動する
        private static int InvokeProcess(string executeFile)
        {
            // Win32 Process を扱うWMIプロバイダ クラスを取得する
            ManagementClass processClass = new ManagementClass("Win32_Process");
           
            // Create メソッドのパラメータを準備する
            ManagementBaseObject inParams = processClass.GetMethodParameters("Create");

            // Create メソッドのパラメータとして
            inParams["CommandLine"] = executeFile;

            // Create メソッドをパラメータ付きで呼び出す
            ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);

            // メソッドの実行結果を表示する
            Console.WriteLine("メソッド実行結果: " + outParams["returnValue"]);
            Console.WriteLine("プロセスID: " + outParams["processId"]);
           
            return Int32.Parse(outParams["processId"].ToString());
        }

        // 指定したプロセスを終了させる
        private static void TerminateProcess(int processId)
        {
            ManagementScope scope = new ManagementScope(@"\\.\ROOT\CIMV2");
            scope.Connect();

            // 指定したプロセスIDを持つプロセスをクエリする
            ObjectQuery query =
                new ObjectQuery(String.Format(@"SELECT * FROM Win32_Process WHERE ProcessID = {0}", processId));

            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
            ManagementObjectCollection col = searcher.Get();

            // クエリの結果を取得する
            foreach (ManagementObject obj in col)
            {
                // プロセスを終了させる Terminate メソッドの引数を設定する
                ManagementBaseObject inParams = obj.GetMethodParameters("Terminate");
                inParams["Reason"] = 0;

                // クエリで取得したプロセス インスタンス オブジェクトの Terminate メソッドを呼び出し、プロセスを終了する
                obj.InvokeMethod("Terminate", inParams, null);
            }
        }
    }
}

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Comments are closed