Démarrage rapide : Exécuter une charge de travail avec le Kit de développement logiciel (SDK) MXC

Utilisez le SDK .NET, TypeScript ou Rust pour exécuter une commande dans un environnement d’isolation des processus Windows. Chaque exemple crée une entrée d’exemple, autorise la charge de travail à la lire et accorde un accès en écriture à un dossier de sortie distinct. Les autorisations réseau et d’interface utilisateur restent refusées.

Votre application hôte crée la stratégie et gère le résultat. La commande s’exécute à l’intérieur de MXC ; le reste de l’application hôte ne le fait pas.

Les exemples utilisent les API du SDK MXC 1.0 V1. Les kits SDK V1 utilisent le schéma stable 1.0.0 en interne. Vous ne spécifiez donc pas de version de schéma dans votre requête. Consultez Choisir un schéma compatible.

Prerequisites

Tu as besoin de:

  • Windows 11, version 24H2 ou ultérieure, avec un environnement ProcessContainer pris en charge.
  • Pour C#, le sdk .NET 8 ou version ultérieure et le Microsoft.Mxc.Sdk package NuGet.
  • Pour TypeScript, npm, le @microsoft/mxc-sdk package et Node.js 24.21.0 ou version ultérieure dans la ligne de publication Node.js 24, ou Node.js 26.8.0 ou version ultérieure.
  • Pour Rust, une chaîne d’outils Rust stable avec les outils de génération MSVC et la mxc-sdk crate. Consultez Configurer votre environnement de développement Rust sur Windows.
  • Répertoire de travail accessible en écriture et PowerShell pour les commandes d’installation.

Les instructions utilisent les packages MXC 1.0 de NuGet.org, npm et crates.io. Aucune build source MXC n’est requise.

Vérifiez la prise en charge de la plateforme avant d’exécuter l’exemple. Une version Windows prise en charge ne garantit pas que chaque fonctionnalité facultative est disponible.

Sur certains hôtes, MXC exécute l’isolation des processus dans un niveau de secours basé sur AppContainer. Ce niveau a besoin d’une préparation ponctuelle du lecteur système et du périphérique nul, et le paramètre du périphérique nul est réinitialisé à chaque redémarrage. Lorsque la préparation est manquante, la sonde hôte de MXC retourne un avertissement qui indique la sous-commande wxc-host-prep.exe à exécuter. L’exemple TypeScript imprime ces avertissements à partir de getPlatformSupport(), et vous pouvez également vérifier un hôte en exécutant wxc-exec.exe --probe. Étant donné que wxc-host-prep.exe nécessite l’approbation de l’administrateur, demandez à un administrateur d’exécuter la commande recommandée plutôt que de l’exécuter à partir de votre application. Pour plus d’informations, consultez la préparation de l’hôte.

1. Créer un projet

Créez une application console et ajoutez le package MXC à partir de NuGet.org :

dotnet new console -n MxcQuickstart
Set-Location MxcQuickstart
dotnet add package Microsoft.Mxc.Sdk

2. Définir et exécuter la charge de travail

L’isolation des processus convient à cette commande de courte durée, car elle nécessite l’accès à certains fichiers de l’hôte et n’a pas besoin de conserver un environnement. D’autres charges de travail peuvent nécessiter un type de confinement différent.

L’hôte crée workspace\input et workspace\output sous le répertoire du projet. La commande contenue lit input.txt et écrit result.txt. Il n’a pas accès en écriture à son répertoire d’entrée ni à d’autres fichiers du projet.

L’hôte fournit un petit environnement explicite au lieu d’hériter de ses propres variables. Lorsque vous fournissez un environnement pour une charge de travail ProcessContainer Windows, incluez à la fois SystemRoot et LOCALAPPDATA. MXC rejette la demande avant le lancement si l’une ou l’autre est manquante. L’exemple pointe LOCALAPPDATA, TEMP et TMP vers le répertoire de sortie autorisé afin que les fichiers temporaires et propres à chaque utilisateur restent conformes à la politique.

Remplacez par 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;
}

Exécutez l’application :

dotnet run

Chaque version imprime :

Sandbox exited with code 0
Hello from MXC!

Vous pouvez également inspecter workspace\output\result.txt.

3. Vérifier une opération refusée

Modifiez uniquement la déclaration du fichier de sortie afin que la commande tente d’écrire dans le répertoire d’entrée en lecture seule :

string outputFile = Path.Combine(inputDirectory, "blocked.txt");

Relancez l’application sans modifier la stratégie. Attendez-vous à une erreur d’accès refusée et à un code de sortie différent de zéro, sans nouveau workspace\input\blocked.txt fichier. Restaurez la déclaration de fichier de sortie d’origine et vérifiez que l’opération autorisée réussit toujours.

Si l’exécution autorisée échoue, distinguez les erreurs de configuration ou de préparation de l’hôte des refus d’accès à une ressource. Utilisez le Mode d’apprentissage pour examiner ces derniers ; n’élargissez pas automatiquement la stratégie.

4. Adaptez l’exemple

Remplacez l’exemple de commande et d’entrées par une charge de travail représentative fiable. Passez en revue les fichiers binaires requis, les bibliothèques requises, les fichiers temporaires requis et les sorties requises. Ajoutez un accès réseau ou d’interface utilisateur uniquement lorsque la tâche l’exige et que le back-end sélectionné peut appliquer les restrictions prévues.

Testez les opérations autorisées et refusées sur chaque hôte cible. Lorsque vous utilisez le mode d’apprentissage pour affiner la stratégie, passez en revue chaque observation et terminez par une exécution en application sans apprentissage ni paramètres d’audit.

Facultatif : utiliser un agent de programmation

Donnez à votre agent les plateformes cibles, le langage et la version du Kit de développement logiciel (SDK), les commandes, les ressources requises, le cycle de vie et les objectifs d’isolation. Vous pouvez adapter ce prompt :

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.

Examinez les hypothèses de l’agent et la stratégie qui en résulte. Un agent peut vous aider à intégrer la solution, mais le code hôte de confiance ou une personne doit approuver toute modification des autorisations accordées à la charge de travail.

Étapes suivantes