.NET、TypeScript、または Rust SDK を使用して、Windows のプロセス分離モードでコマンドを実行します。 各例では、サンプル入力を作成してワークロードによる読み取りを許可し、別の出力フォルダーへの書き込みアクセスを許可します。 ネットワークと UI のアクセス許可は拒否されたままです。
ホスト アプリがポリシーを作成し、実行結果を処理します。 コマンドは MXC 内で実行されますが、ホスト アプリのその他の部分は MXC 内では実行されません。
この例では、MXC 1.0 V1 SDK API を使用しています。 V1 SDK では、安定した 1.0.0 スキーマが内部的に使用されるため、要求でスキーマ バージョンを指定しないでください。
互換性のあるスキーマの選択を参照してください。
Prerequisites
必要なもの:
- サポートされた ProcessContainer 環境を備えた Windows 11 バージョン 24H2 以降。
- C# の場合は、.NET 8 SDK 以降と
Microsoft.Mxc.SdkNuGet パッケージ。 - TypeScript の場合は、npm、
@microsoft/mxc-sdkパッケージ、および Node.js 24 系列の 24.21.0 以降、または Node.js 26.8.0 以降。 - Rust の場合、MSVC ビルド ツール対応の安定した Rust ツールチェーンと、
mxc-sdkクレートが必要です。 「Windowsで Rust 開発環境を設定する」を参照してください。 - セットアップ コマンド用の書き込み可能な作業ディレクトリと PowerShell。
この手順では、NuGet.org、npm、および crates.io の MXC 1.0 パッケージを使用します。 MXC ソース ビルドは必要ありません。
この例を実行する前に、対応プラットフォームを確認してください。 サポートされているWindows バージョンでは、すべてのオプション機能が利用できるわけではありません。
一部のホストでは、MXC は AppContainer ベースのフォールバック 層でプロセス分離を実行します。 そのレベルでは、システム ドライブと null デバイスの 1 回限りの準備が必要であり、null デバイスの設定は再起動するたびにリセットされます。 必要な事前準備が完了していない場合、MXC のホスト プローブは、実行すべき wxc-host-prep.exe のサブコマンドを示す警告を返します。 TypeScript の例では、getPlatformSupport() からこれらの警告が出力されます。また、wxc-exec.exe --probe を実行してホストを確認することもできます。
wxc-host-prep.exe の実行には管理者の承認が必要なため、アプリから実行するのではなく、管理者に推奨コマンドの実行を依頼してください。 詳細については、「 ホストの準備」を参照してください。
1. プロジェクトを作成する
コンソール アプリを作成し、NuGet.org から MXC パッケージを追加します。
dotnet new console -n MxcQuickstart
Set-Location MxcQuickstart
dotnet add package Microsoft.Mxc.Sdk
2. ワークロードを定義して実行する
プロセスの分離は、選択したホスト ファイルが必要であり、環境が保持されていないため、この短時間しか実行されないコマンドに適しています。 ワークロードによっては、別のコンテインメントの種類が必要になる場合があります。
ホストはプロジェクト ディレクトリの下に workspace\input と workspace\output を作成します。 含まれているコマンドは、 input.txt を読み取り、 result.txtを書き込みます。 入力ディレクトリへの書き込みアクセス権や、他のプロジェクト ファイルへのアクセス権はありません。
ホストは、独自の変数を継承するのではなく、小規模で明示的な環境を提供します。 Windows ProcessContainer ワークロード用の環境を提供する場合は、SystemRootとLOCALAPPDATAの両方を含めます。 どちらか一方が欠けている場合、MXC は起動前に要求を拒否します。 この例では、許可された出力ディレクトリに LOCALAPPDATA、 TEMP、および TMP をポイントして、一時ファイルとユーザーごとのファイルがポリシー内に留まるようにします。
Program.csを次のように置き換えます。
using Microsoft.Mxc.Sdk.V1;
if (!OperatingSystem.IsWindows())
{
Console.Error.WriteLine("This example requires Windows.");
return 1;
}
try
{
var support = MxcPlatform.GetPlatformSupport();
if (!support.IsSupported ||
!support.AvailableMethods.Contains(ContainmentBackend.ProcessContainer))
{
Console.Error.WriteLine(support.Reason ?? "Windows ProcessContainer is unavailable.");
return 1;
}
string inputDirectory = Path.GetFullPath(@"workspace\input");
string outputDirectory = Path.GetFullPath(@"workspace\output");
string outputFile = Path.Combine(outputDirectory, "result.txt");
string commandInterpreter = Path.Combine(Environment.SystemDirectory, "cmd.exe");
Directory.CreateDirectory(inputDirectory);
Directory.CreateDirectory(outputDirectory);
File.WriteAllText(Path.Combine(inputDirectory, "input.txt"), "Hello from MXC!\n");
var request = new ContainerRequest(
$"\"{commandInterpreter}\" /d /c type input.txt > \"{outputFile}\"")
{
Containment = new Containment.Process(),
Filesystem = new FilesystemPolicy
{
ReadonlyPaths = { inputDirectory, commandInterpreter },
ReadwritePaths = { outputDirectory },
},
// Omitted network and UI permissions remain denied.
WorkingDirectory = inputDirectory,
Environment = new()
{
["SystemRoot"] = Environment.GetFolderPath(Environment.SpecialFolder.Windows),
["LOCALAPPDATA"] = outputDirectory,
["TEMP"] = outputDirectory,
["TMP"] = outputDirectory,
},
TimeoutMs = 30_000,
};
ExecutionResult result = await MxcContainer.RunAsync(request);
Console.Write(result.Stdout);
Console.Error.Write(result.Stderr);
foreach (string warning in result.Warnings)
{
Console.Error.WriteLine(warning);
}
if (result.TimedOut)
{
Console.Error.WriteLine("The workload exceeded its timeout.");
return 1;
}
Console.WriteLine($"Sandbox exited with code {result.ExitCode}");
if (result.ExitCode == 0)
{
Console.Write(File.ReadAllText(outputFile));
}
return result.ExitCode;
}
catch (MxcException ex)
{
Console.Error.WriteLine(ex);
if (ex.Remediation is not null)
{
Console.Error.WriteLine(ex.Remediation);
}
return 1;
}
次のようにアプリを実行します。
dotnet run
各バージョンは次の内容を出力します。
Sandbox exited with code 0
Hello from MXC!
workspace\output\result.txtを検査することもできます。
3. 拒否された操作を確認する
コマンドが読み取り専用入力ディレクトリへの書き込みを試みるように、出力ファイル宣言のみを変更します。
string outputFile = Path.Combine(inputDirectory, "blocked.txt");
ポリシーを変更せずに、アプリをもう一度実行してください。 アクセス拒否エラーと 0 以外の終了コードが想定され、新しい workspace\input\blocked.txt ファイルはありません。 元の出力ファイル宣言を復元し、許可された操作が引き続き成功することを確認します。
許可された実行が失敗した場合は、ホストのセットアップや構成のエラーと、リソースへのアクセス拒否を区別してください。 リソースへのアクセス拒否を調査するには、学習モードを使用してください。ポリシーの許可範囲が自動的に拡大されないようにしてください。
4. 例を調整する
サンプル コマンドと入力を信頼できる代表的なワークロードに置き換えてください。 必要なツールのバイナリ、ライブラリ、一時ファイル、出力ファイルを確認してください。 タスクに必要な場合にのみ、かつ選択したバックエンドが意図した制限を適用できる場合にのみ、ネットワークまたは UI へのアクセスを追加します。
すべてのターゲット ホストで許可された操作と拒否された操作をテストします。 学習モードを使用してポリシーを調整する場合は、記録されたアクセスを一つずつ確認し、最後に学習設定や監査設定を使用せず、制限を適用した状態で実行して検証してください。
任意: コーディングエージェントを使用する
ターゲット プラットフォーム、SDK の言語とバージョン、コマンド、必要なリソース、ライフサイクル、分離の目標をエージェントに指定します。 このプロンプトは、次のように調整できます。
Use the MXC Learn quickstart and the documentation for my installed SDK release.
Integrate this workload through the .NET, TypeScript, or Rust SDK used by this project.
First identify the command, target platforms, input and output paths, network
and UI requirements, and whether state must persist between commands.
Explain the containment choice and create the narrowest policy that fits.
Run both permitted and denied cases and report the effective permissions.
Do not execute the workload outside MXC to get around a failure. Ask for my
approval before expanding access, changing host settings, or using permissive
Learning Mode. Treat observed resource access as evidence, not automatic grants.
エージェントの前提条件と、それによって生じるポリシーを確認します。 エージェントは連携機能の実装を支援できますが、ワークロードに付与する権限の変更には、信頼できるホスト側のコードまたは担当者による承認が必要です。
次のステップ
- 永続的または特殊化されたバックエンドを使用する前に 、MXC アーキテクチャと包含モデル を確認します。
- MXC ポリシーを作成して検証する方法について説明します。
- MXC コンテインメント オプションとプラットフォームのサポートを比較します。
- 学習モードの完全なワークフローを確認します。
- MXC ポリシーの例を他のワークロードに合わせて調整します。
- MXC リリースで SDK パッケージとリリース ノートを確認できます。
Windows developer