Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se explica cómo compartir objetos con nombre entre aplicaciones de escritorio empaquetadas (incluidas SDK de Aplicaciones para Windows aplicaciones empaquetadas con MSIX) y aplicaciones Win32 sin empaquetar.
Objetos con nombre en aplicaciones empaquetadas
Los objetos con nombre proporcionan una manera sencilla para que los procesos compartan identificadores de objeto. Una vez que un proceso ha creado un objeto con nombre, otros procesos pueden usar el nombre para llamar a la función adecuada para abrir un identificador para el objeto. Los objetos con nombre se usan normalmente para la sincronización de subprocesos y la comunicación entre procesos.
Las aplicaciones que se ejecutan en un AppContainer (como las aplicaciones UWP) tienen de forma predeterminada un espacio de nombres aislado para objetos con nombre; solo pueden acceder a los objetos con nombre que hayan creado. Las aplicaciones de escritorio empaquetadas de plena confianza (incluidas las aplicaciones SDK de Aplicaciones para Windows) no tienen este aislamiento y crean objetos con nombre en el espacio de nombres global. Consulte SDK de Aplicaciones para Windows consideraciones para obtener más información.
Para compartir objetos con nombre con aplicaciones appContainer, los permisos deben establecerse cuando se crean objetos y los nombres deben calificarse cuando se abren los objetos. Las técnicas de este artículo también son útiles cuando se desea restringir el acceso entre cualquier proceso, independientemente del empaquetado.
Creación de objetos con nombre
Los objetos con nombre se crean con una API correspondiente Create :
Todas estas API comparten un LPSECURITY_ATTRIBUTES parámetro que permite al autor de la llamada especificar listas de control de acceso (ACL) para controlar qué procesos pueden acceder al objeto. Para compartir objetos con nombre con aplicaciones empaquetadas, se debe conceder permiso dentro de las ACL cuando se crean los objetos con nombre.
Los identificadores de seguridad (SID) representan identidades dentro de las ACL. Cada aplicación empaquetada tiene su propio SID en función de su nombre de familia de paquete. Puede generar el SID para una aplicación empaquetada pasando su nombre de familia de paquete a DeriveAppContainerSidFromAppContainerName.
Note
El nombre de familia del paquete se puede encontrar mediante el editor de manifiestos de paquetes de Visual Studio durante el desarrollo, desde Partner Center para las aplicaciones publicadas a través de Microsoft Store, o mediante el comando de PowerShell Get-AppxPackage para aplicaciones ya instaladas.
En este ejemplo se muestra el patrón básico necesario para ACL un objeto con nombre. Para compartir objetos con nombre con aplicaciones empaquetadas, cree una estructura de EXPLICIT_ACCESS para cada aplicación:
grfAccessMode = GRANT_ACCESS-
grfAccessPermissions =permisos adecuados en función del objeto y del uso previsto grfInheritance = NO_INHERITANCETrustee.TrusteeForm = TRUSTEE_IS_SIDTrustee.TrusteeType = TRUSTEE_IS_USER-
Trustee.ptstrName =el SID obtenido de DeriveAppContainerSidFromAppContainerName
Al rellenar el parámetro LPSECURITY_ATTRIBUTES en las llamadas a Create con reglas EXPLICIT_ACCESS para aplicaciones empaquetadas, puede conceder a esas aplicaciones acceso para abrir el objeto con nombre.
Note
Las aplicaciones Win32 pueden acceder a los objetos con nombre creados por las aplicaciones de AppContainer calificando los nombres de objeto al abrirlos, siempre que la DACL del objeto permita el acceso. La DACL predeterminada para la mayoría de los objetos con nombre concede acceso al creador y a los administradores. Si ha establecido una DACL restrictiva, los llamadores de Win32 también necesitan una entrada de acceso explícita.
Ejemplo: Creación de un evento con nombre con ACL (C++)
En el ejemplo siguiente se muestra cómo crear un evento con nombre y conceder acceso a una aplicación empaquetada:
#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;
}
Abrir objetos con nombre
Los objetos con nombre se abren pasando un nombre a una API correspondiente Open :
Los objetos con nombre creados por una aplicación empaquetada se crean dentro del espacio de nombres de la aplicación, lo que se conoce como ruta de acceso al objeto con nombre. Al abrir objetos con nombre creados por una aplicación empaquetada, los nombres de los objetos deben ir precedidos de la ruta de acceso de objetos con nombre de la aplicación que los crea.
GetAppContainerNamedObjectPath devuelve la ruta de acceso del objeto con nombre para una aplicación empaquetada basada en su SID. Puede generar el SID para una aplicación empaquetada pasando su nombre de familia de paquete a DeriveAppContainerSidFromAppContainerName.
Note
El nombre de familia del paquete se puede encontrar mediante el editor del manifiesto del paquete en Visual Studio durante el desarrollo, a través de Partner Center para las aplicaciones publicadas mediante Microsoft Store, o mediante el comando de PowerShell Get-AppxPackage para las aplicaciones ya instaladas.
Al abrir objetos con nombre creados por una aplicación empaquetada, use el formato <PATH>\<NAME>:
- Reemplace
<PATH>por la ruta de acceso al objeto con nombre de la aplicación de creación. - Reemplace por
<NAME>el nombre del objeto.
Note
El prefijo de nombres de objeto con <PATH> solo es necesario si una aplicación empaquetada creó el objeto . No es necesario calificar los objetos con nombre creados por las aplicaciones Win32, aunque se debe conceder acceso cuando se crean los objetos.
Consideraciones sobre windows App SDK
SDK de Aplicaciones para Windows aplicaciones de escritorio empaquetadas con MSIX se ejecutan como procesos de plena confianza con la identidad del paquete; no se ejecutan en appContainer. Esto significa que sus objetos con nombre se crean en el espacio de nombres global de forma predeterminada, al igual que las aplicaciones Win32 tradicionales.
Sin embargo, aún necesita los procedimientos de ACL y de calificación de rutas de acceso descritos anteriormente en estos escenarios:
-
Comunicarse con una aplicación UWP — las aplicaciones UWP se ejecutan en un AppContainer y tienen espacios de nombres aislados para objetos con nombre. Usa
GetAppContainerNamedObjectPathy otorga acceso mediante ACL para acceder a los objetos con nombre de una aplicación UWP. - Restringir el acceso — Incluso entre aplicaciones de confianza plena, puede que quiera usar ACL explícitas para limitar qué procesos pueden abrir los objetos con nombre.
- Aplicaciones SDK de Aplicaciones para Windows sin empaquetar: los objetos con nombre están en el espacio de nombres global sin ningún control especial necesario, idéntico a las aplicaciones Win32 tradicionales.
Remarks
Los objetos con nombre de las aplicaciones empaquetadas están aislados de forma predeterminada para conservar la seguridad y garantizar la compatibilidad con eventos del ciclo de vida de la aplicación, como la suspensión y la finalización. El uso compartido de objetos con nombre entre aplicaciones presenta restricciones de enlace y control de versiones estrictas y requiere que cada aplicación sea resistente al ciclo de vida de otros usuarios. Por estas razones, se recomienda compartir solo objetos con nombre entre aplicaciones del mismo publicador.