Freigeben über


AppContainer für Legacy-Apps

Die AppContainer-Umgebung ist eine restriktive Prozessausführungsumgebung, die für Legacy-Apps verwendet werden kann, um Ressourcensicherheit bereitzustellen. Der Prozess einer AppContainer-App und seine untergeordneten Prozesse werden in einem einfachen App-Container ausgeführt, in dem sie nur auf die Ressourcen zugreifen können, die ihnen speziell gewährt werden. Und sie sind isoliert mit Dateisystem- und Registrierungsvirtualisierung. Daher können in einem AppContainer implementierte Apps nicht gehackt werden, um schädliche Aktionen außerhalb der eingeschränkten zugewiesenen Ressourcen zuzulassen.

Für verpackte und entpackte Apps stellt AppContainer eine gute, sichere Technik dar.

Trinkgeld

AppContainer wurde ursprünglich LowBox (vor der Veröffentlichung von Windows 8) benannt. Dieser Legacyname kann in API-Namen wie NtCreateLowBoxTokenangezeigt werden.

Verpackte Apps

Sie können eine App verwenden, die mit MSIX verpackt ist, und sie ganz einfach so konfigurieren, dass sie in der AppContainer-Umgebung ausgeführt wird. UWP-Apps (Universelle Windows-Plattform) sind automatisch AppContainer-Apps. Sie können Aber auch Ihre Desktop-App konfigurieren, die mit MSIX verpackt ist, um eine AppContainer-App zu sein. Die Verwendung von AppContainer ist besonders einfach, wenn Sie MSIX verwenden. Weitere Informationen, Szenarien und Konfigurationsbeispiele finden Sie unter MSIX AppContainer-Apps.

Entpackte Apps

Eine entpackte App kann auch in einem App-Container ausgeführt werden. Zum Erstellen eines Prozesses in einem App-Container benötigen Sie eine AppContainer-Definition (oder ein Profil). Aus diesem Grund ist die Verwendung von AppContainer mit einer verpackten App einfacher. Wenn Sie ein Paket für einen Benutzer registrieren, ruft der Bereitstellungsstapel bestimmte Win32-APIs für Sie auf, um das erforderliche AppContainer-Profil zu erstellen (z. B. CreateAppContainerProfile). Und wenn Sie die Registrierung eines Pakets für einen Benutzer aufheben, führt der Bereitstellungsstapel die Arbeit aus, um das AppContainer-Profil zu entfernen (DeleteAppContainerProfile). Wenn Sie Ihre App nicht verpacken, müssen Sie dieselben Aktionen ausführen, indem Sie diese Win32-APIs selbst aufrufen. aber es kann kompliziert sein.

Die meisten entpackten Apps, die die niedrige Integrationsebene verwendet haben, verwenden jetzt AppContainer als bessere Möglichkeit, eine eingeschränkte Ausführungsumgebung bereitzustellen.

Wenn ein entpackter Prozess, der in einem App-Container ausgeführt wird, CreateProcessaufruft, erbt der untergeordnete Prozess in der Regel das Token des übergeordneten Elements. Dieses Token enthält die Integritätsstufe (IL) und App-Containerinformationen. Es ist am besten, nicht an eine einzelne Achse mit den Werten mit erhöhten/mittleren/mittleren/niedrigen/appContainer-Werten zu denken. Stattdessen ist das Sein oder nicht in einem App-Container eine zweite und orthogonale Eigenschaft. Wenn Sie in einem App-Container, ist die Integritätsstufe (IL) immer niedrig.

Vorteile der Verwendung einer AppContainer-Umgebung

Ein wichtiges Ziel der AppContainer-Umgebung besteht darin, den App-Zustand so weit wie möglich vom Systemzustand zu trennen und gleichzeitig die Kompatibilität mit anderen Apps aufrechtzuerhalten. Windows erreicht dies, indem bestimmte Änderungen erkannt und umgeleitet werden, die es zur Laufzeit am Dateisystem und in der Registrierung vorgibt (auch als Virtualisierungbezeichnet). Eine AppContainer-App schreibt in einen eigenen virtuellen Registrierungs- und Anwendungsdatenordner, und diese Daten werden gelöscht, wenn die App deinstalliert oder zurückgesetzt wird. Andere Apps haben keinen Zugriff auf die virtuelle Registrierung oder das virtuelle Dateisystem einer AppContainer-App.

Daher bietet die AppContainer-Umgebung sichere Sandboxing von Apps. Isolieren der App vom Zugriff auf Hardware, Dateien, Registrierung, andere Apps, Netzwerkkonnektivität und Netzwerkressourcen ohne bestimmte Berechtigung. Einzelne Ressourcen können gezielt werden, ohne andere Ressourcen verfügbar zu geben. Darüber hinaus wird die Benutzeridentität durch die Verwendung einer eindeutigen Identität geschützt, die eine Verkettung des Benutzers und der App ist; und Ressourcen werden mit einem Modell mit geringsten Rechten gewährt. Das schützt außerdem vor einer App, die den Benutzer als Identität des Benutzers angibt, um Zugriff auf andere Ressourcen zu erhalten.

Beispielcode zum Testen der Ausführung in einem App-Container

In einem C#- oder C++-Projekt können Sie anhand der entsprechenden Codebeispiele ermitteln, ob ein Prozess innerhalb eines App-Containers ausgeführt wird. Wenn der Wert von isAppContainer für jedes Beispiel nicht null (oder true) ist, wird der Prozess innerhalb eines App-Containers ausgeführt.

C# (P/Invoke)

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool OpenProcessToken(
    IntPtr ProcessHandle,
    UInt32 DesiredAccess,
    out IntPtr TokenHandle);

[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetTokenInformation(
    IntPtr TokenHandle,
    uint TokenInformationClass,
    out uint TokenInformation,
    uint TokenInformationLength,
    out uint ReturnLength);

UInt32 TOKEN_QUERY = 0x0008;
IntPtr tokenHandle;

if (!OpenProcessToken(
    GetCurrentProcess(),
    TOKEN_QUERY,
    out tokenHandle))
{
    // Handle the error.
}

uint isAppContainer;
uint TokenIsAppContainer = 29;
uint tokenInformationLength = sizeof(uint);

if (!GetTokenInformation(
    tokenHandle,
    TokenIsAppContainer,
    out isAppContainer,
    tokenInformationLength,
    out tokenInformationLength))
{
    // Handle the error.
}

C++ (WIL)

In diesem Beispiel werden die Windows-Implementierungsbibliotheken (WIL)) verwendet. Eine bequeme Möglichkeit zum Installieren von WIL besteht darin, zu Visual Studio zu wechseln, auf Project>NuGet-Pakete verwalten...>Durchsuchen, eingeben oder einfügen Microsoft.Windows.ImplementationLibrary im Suchfeld, wählen Sie das Element in den Suchergebnissen aus, und klicken Sie dann auf Installieren, um das Paket für dieses Projekt zu installieren.

#include <wil\token_helpers.h>
...
bool isAppContainer = wil::get_token_is_app_container();

Die Funktionen wil::get_token_is_app_container_nothrow und wil::get_token_is_app_container_failfast bieten alternative Fehlerbehandlungsstrategien. Weitere Informationen finden Sie unter wil\token_helpers.h.

C++ (kanonisch)

#include <windows.h>
...
HANDLE tokenHandle{};
DWORD isAppContainer{};
DWORD tokenInformationLength{ sizeof(DWORD) };

if (!::OpenProcessToken(
    GetCurrentProcess(),
    TOKEN_QUERY,
    &tokenHandle))
{
    // Handle the error.
}

if (!::GetTokenInformation(
    tokenHandle,
    TOKEN_INFORMATION_CLASS::TokenIsAppContainer,
    &isAppContainer,
    tokenInformationLength,
    &tokenInformationLength
))
{
    // Handle the error.
}

In diesem Abschnitt

Weitere Informationen zur Verwendung von AppContainer für Legacy-Apps finden Sie in den folgenden Themen.

Thema Beschreibung
AppContainer-Isolation Isolation ist das primäre Ziel einer AppContainer-Ausführungsumgebung. Durch das Isolieren einer App aus nicht benötigten Ressourcen und anderen Apps werden Möglichkeiten für böswillige Manipulationen minimiert. Die Gewährung des Zugriffs auf der Grundlage der geringsten Rechte verhindert, dass Apps und Benutzer über ihre Rechte hinaus auf Ressourcen zugreifen. Die Steuerung des Zugriffs auf Ressourcen schützt den Prozess, das Gerät und das Netzwerk.
Implementieren eines AppContainer- Ein AppContainer wird implementiert, indem dem Prozesstoken neue Informationen hinzugefügt, SeAccessCheck() geändert werden, sodass alle legacy-, nichtmodifizierten Zugriffssteuerungslistenobjekte standardmäßig Zugriffsanforderungen von AppContainer-Prozessen blockieren und erneut ACL-Objekte, die für AppContainers verfügbar sein sollten, blockieren.