.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);
}
}
}
}