Condivisione di oggetti nominati

Questo argomento illustra come condividere oggetti denominati tra app desktop in pacchetto (incluse SDK per app di Windows app in pacchetto con MSIX) e applicazioni Win32 non in pacchetto.

Oggetti denominati nelle applicazioni in pacchetto

Gli oggetti denominati offrono un modo semplice per i processi per condividere gli handle degli oggetti. Dopo che un processo ha creato un oggetto denominato, altri processi possono usare il nome per chiamare la funzione appropriata per aprire un handle all'oggetto. Gli oggetti denominati vengono comunemente usati per la sincronizzazione dei thread e la comunicazione interprocesso.

Le applicazioni eseguite in un AppContainer (ad esempio le app UWP) dispongono per impostazione predefinita di uno spazio dei nomi isolato per gli oggetti denominati — possono accedere solo agli oggetti denominati che hanno creato. Le app desktop con attendibilità completa (incluse le app SDK per app di Windows) non hanno questo isolamento e creano oggetti denominati nello spazio dei nomi globale. Per informazioni dettagliate, vedere SDK per app di Windows considerazioni.

Per condividere oggetti denominati con app AppContainer, le autorizzazioni devono essere impostate quando vengono creati gli oggetti e i nomi devono essere qualificati quando vengono aperti gli oggetti. Le tecniche descritte in questo articolo sono utili anche quando si desidera limitare l'accesso tra processi, indipendentemente dalla pacchettizzazione.

Creazione di oggetti denominati

Gli oggetti denominati vengono creati con un'API corrispondente Create :

Tutte queste API condividono un LPSECURITY_ATTRIBUTES parametro che consente al chiamante di specificare elenchi di controllo di accesso (ACL) per controllare quali processi possono accedere all'oggetto. Per condividere oggetti denominati con applicazioni in pacchetto, è necessario concedere l'autorizzazione all'interno degli elenchi di controllo di accesso quando vengono creati gli oggetti denominati.

Gli identificatori di sicurezza (SID) rappresentano le identità all'interno degli elenchi di controllo di accesso. Ogni applicazione in pacchetto ha il proprio SID in base al nome della famiglia di pacchetti. È possibile generare il SID per un'applicazione in pacchetto passando il nome della famiglia di pacchetti a DeriveAppContainerSidFromAppContainerName.

Note

Il nome della famiglia di pacchetti è disponibile tramite l'editor del manifesto del pacchetto in Visual Studio durante lo sviluppo, tramite il Centro per i partner per le applicazioni pubblicate tramite il Microsoft Store o tramite il comando PowerShell Get-AppxPackage per le applicazioni già installate.

In questo esempio viene illustrato il modello di base necessario per l'ACL di un oggetto denominato. Per condividere oggetti denominati con applicazioni in pacchetto, compilare una struttura EXPLICIT_ACCESS per ogni applicazione:

Specificando il parametro LPSECURITY_ATTRIBUTES nelle chiamate Create con regole EXPLICIT_ACCESS per le applicazioni pacchettizzate, è possibile concedere a tali applicazioni l'accesso ad aprire l'oggetto denominato.

Note

Le applicazioni Win32 possono accedere agli oggetti denominati creati dalle app AppContainer qualificando i nomi degli oggetti durante l'apertura, purché il DACL dell'oggetto consenta l'accesso. Il DACL predefinito per la maggior parte degli oggetti denominati concede l'accesso all'autore e agli amministratori. Se hai impostato un DACL restrittivo, anche i chiamanti Win32 necessitano di una voce di accesso esplicita.

Esempio: Creazione di un evento denominato con ACL (C++)

L'esempio seguente illustra come creare un evento denominato e concedere l'accesso a un'applicazione in pacchetto:

#include <windows.h>
#include <sddl.h>
#include <aclapi.h>
#include <userenv.h>

HANDLE CreateSharedEvent(PCWSTR eventName, PCWSTR packageFamilyName)
{
    // Derive the SID for the target packaged application
    PSID appContainerSid = nullptr;
    HRESULT hr = DeriveAppContainerSidFromAppContainerName(
        packageFamilyName, &appContainerSid);
    if (FAILED(hr)) return nullptr;

    // Build an EXPLICIT_ACCESS entry granting synchronization and signal rights
    EXPLICIT_ACCESS_W explicitAccess = {};
    explicitAccess.grfAccessPermissions = SYNCHRONIZE | EVENT_MODIFY_STATE;
    explicitAccess.grfAccessMode = GRANT_ACCESS;
    explicitAccess.grfInheritance = NO_INHERITANCE;
    explicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
    explicitAccess.Trustee.TrusteeType = TRUSTEE_IS_USER;
    explicitAccess.Trustee.ptstrName = reinterpret_cast<LPWSTR>(appContainerSid);

    // Create the ACL
    PACL acl = nullptr;
    DWORD result = SetEntriesInAclW(1, &explicitAccess, nullptr, &acl);
    if (result != ERROR_SUCCESS)
    {
        FreeSid(appContainerSid);
        return nullptr;
    }

    // Create the security descriptor
    SECURITY_DESCRIPTOR sd = {};
    if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) ||
        !SetSecurityDescriptorDacl(&sd, TRUE, acl, FALSE))
    {
        LocalFree(acl);
        FreeSid(appContainerSid);
        return nullptr;
    }

    SECURITY_ATTRIBUTES sa = {};
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = &sd;
    sa.bInheritHandle = FALSE;

    // Create the named event with only the rights the creator needs
    HANDLE hEvent = CreateEventExW(&sa, eventName, 0,
        SYNCHRONIZE | EVENT_MODIFY_STATE);

    // Cleanup
    LocalFree(acl);
    FreeSid(appContainerSid);

    return hEvent;
}

Apertura di oggetti con nome

Gli oggetti denominati vengono aperti passando un nome a un'API corrispondente Open :

Gli oggetti denominati creati da un'applicazione in pacchetto vengono creati all'interno dello spazio dei nomi dell'applicazione, altrimenti noto come percorso dell'oggetto denominato. Quando si aprono oggetti denominati creati da un'applicazione in pacchetto, i nomi degli oggetti devono essere preceduti dal percorso dell'oggetto denominato dell'applicazione di creazione.

GetAppContainerNamedObjectPath restituisce il percorso dell'oggetto denominato per un'applicazione in pacchetto in base al relativo SID. È possibile generare il SID per un'applicazione in pacchetto passando il nome della famiglia di pacchetti a DeriveAppContainerSidFromAppContainerName.

Note

Il nome della famiglia di pacchetti è disponibile tramite l'editor del manifesto del pacchetto in Visual Studio durante lo sviluppo, tramite il Centro per i partner per le applicazioni pubblicate tramite il Microsoft Store o tramite il comando PowerShell Get-AppxPackage per le applicazioni già installate.

Quando si aprono oggetti denominati creati da un'applicazione in pacchetto, usare il formato <PATH>\<NAME>:

  • Sostituire <PATH> con il percorso dell'oggetto denominato dell'applicazione di creazione.
  • Sostituire <NAME> con il nome dell'oggetto.

Note

Il prefisso dei nomi degli oggetti con <PATH> è obbligatorio solo se un'applicazione in pacchetto ha creato l'oggetto . Gli oggetti denominati creati dalle applicazioni Win32 non devono essere qualificati, anche se l'accesso deve comunque essere concesso quando vengono creati gli oggetti.

Considerazioni su SDK per app di Windows

Le app desktop di SDK per app di Windows pacchettizzate con MSIX vengono eseguite come processi a attendibilità totale con identità del pacchetto: non vengono eseguite in un AppContainer. Ciò significa che gli oggetti denominati vengono creati nello spazio dei nomi globale per impostazione predefinita, proprio come le applicazioni Win32 tradizionali.

Tuttavia, sono ancora necessarie le procedure ACL e path-qualification descritte in precedenza in questi scenari:

  • Comunicare con un'app UWP — le app UWP vengono eseguite in un AppContainer e dispongono di spazi dei nomi degli oggetti denominati isolati. Usare GetAppContainerNamedObjectPath e concedere l'accesso tramite ACL per raggiungere gli oggetti denominati di un'app UWP.
  • Limitazione dell'accesso : anche tra app con attendibilità totale, è possibile usare elenchi di controllo di accesso espliciti per limitare i processi che possono aprire gli oggetti denominati.
  • App di SDK per app di Windows senza pacchetti: gli oggetti denominati si trovano nello spazio dei nomi globale senza alcuna gestione speciale necessaria, identica alle applicazioni Win32 tradizionali.

Remarks

Gli oggetti denominati nelle applicazioni in pacchetto sono isolati per impostazione predefinita per mantenere la sicurezza e garantire il supporto per gli eventi del ciclo di vita dell'applicazione, ad esempio sospensione e terminazione. La condivisione di oggetti denominati tra applicazioni introduce vincoli di binding e controllo delle versioni rigorosi e richiede che ogni applicazione sia resiliente al ciclo di vita di altri. Per questi motivi, è consigliabile condividere solo oggetti denominati tra applicazioni dello stesso server di pubblicazione.