Elnevezett objektumok megosztása

Ez a témakör bemutatja, hogyan oszthat meg elnevezett objektumokat a csomagolt asztali alkalmazások (beleértve az MSIX-sel csomagolt Windows App SDK alkalmazásokat) és a csomagolatlan Win32-alkalmazások között.

Elnevezett objektumok a csomagolt alkalmazásokban

Az elnevezett objektumok megkönnyítik a folyamatok számára az objektumfogópontok megosztását. Miután egy folyamat létrehozott egy elnevezett objektumot, más folyamatok a nevet használva meghívhatják a megfelelő függvényt egy leíró megnyitásához az objektum számára. A névvel ellátott objektumokat gyakran használják a szálszinkronizáláshoz és a folyamatközi kommunikációhoz.

Az AppContainerben (például UWP-alkalmazásokban) futó alkalmazások alapértelmezés szerint izolált névtérrel rendelkeznek – csak az általuk létrehozott elnevezett objektumokhoz férhetnek hozzá. A teljes megbízhatóságú csomagolt asztali alkalmazások (beleértve a Windows App SDK-alkalmazásokat is) nem rendelkeznek ezzel az elkülönítéssel, és elnevezett objektumokat hoznak létre a globális névtérben. Lásd: Windows App SDK – megfontolások.

Ha elnevezett objektumokat szeretne megosztani az AppContainer-alkalmazásokkal, az engedélyeket meg kell adni az objektumok létrehozásakor, és az objektumok megnyitásakor a neveket minősíteni kell. A cikkben szereplő technikák akkor is hasznosak, ha a csomagolástól függetlenül korlátozni szeretné a hozzáférést a folyamatok között.

Elnevezett objektumok létrehozása

Az elnevezett objektumok egy megfelelő Create API-val jönnek létre:

Ezek az API-k egy olyan paramétert LPSECURITY_ATTRIBUTES osztanak meg, amely lehetővé teszi a hívó számára , hogy hozzáférés-vezérlési listákat (ACL-eket) adjon meg, amelyekkel szabályozható, hogy mely folyamatok férhetnek hozzá az objektumhoz. Ahhoz, hogy az elnevezett objektumokat csomagolt alkalmazásokkal lehessen megosztani, engedélyt kell adni az ACL-ben a névvel ellátott objektumok létrehozásakor.

A biztonsági azonosítók (SID-k) az ACL-ek identitásait jelölik. Minden csomagolt alkalmazás saját BIZTONSÁGI azonosítóval rendelkezik a csomagcsalád neve alapján. A csomagolt alkalmazások biztonsági azonosítóját úgy hozhatja létre, hogy átadja a csomagcsalád nevét a DeriveAppContainerSidFromAppContainerName névnek.

Note

A csomagcsalád neve a Visual Studio csomagjegyzék-szerkesztőjében található a fejlesztési idő alatt, a Partnerközponton keresztül a Microsoft Store közzétett alkalmazásokhoz, vagy a Get-AppxPackage PowerShell parancson keresztül a már telepített alkalmazásokhoz.

Ez a minta bemutatja a névvel ellátott objektum ACL-hez szükséges alapvető mintát. Ha elnevezett objektumokat szeretne megosztani csomagolt alkalmazásokkal, hozzon létre egy EXPLICIT_ACCESS struktúrát az egyes alkalmazásokhoz:

Ha a Create hívásokban a LPSECURITY_ATTRIBUTES paramétert a csomagolt alkalmazásokra vonatkozó EXPLICIT_ACCESS szabályokkal tölti ki, hozzáférést adhat ezeknek az alkalmazásoknak az elnevezett objektum megnyitásához.

Note

A Win32-alkalmazások hozzáférhetnek az AppContainer-alkalmazások által létrehozott elnevezett objektumokhoz, ha az objektumok megnyitásakor minősített névvel hivatkoznak rájuk, feltéve, hogy az objektum DACL-je engedélyezi a hozzáférést. A legtöbb elnevezett objektum alapértelmezett DACL-je hozzáférést biztosít a létrehozónak és a rendszergazdáknak. Ha korlátozó DACL-t állított be, a Win32-hívóknak explicit hozzáférési bejegyzésre is szükségük van.

Példa: Névvel ellátott esemény létrehozása ACL-vel (C++)

Az alábbi példa bemutatja, hogyan hozhat létre elnevezett eseményt, és hogyan adhat hozzáférést egy csomagolt alkalmazáshoz:

#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;
}

Elnevezett objektumok megnyitása

Az elnevezett objektumok úgy nyílnak meg, hogy egy nevet átadnak egy megfelelő Open API-nak:

A csomagolt alkalmazás által létrehozott elnevezett objektumok az alkalmazás névterében, más néven a nevesített objektum elérési útján jönnek létre. Egy csomagolt alkalmazás által létrehozott elnevezett objektumok megnyitásakor az objektumnevek elé a létrehozó alkalmazás elnevezettobjektum-útvonalát kell illeszteni.

A GetAppContainerNamedObjectPath egy csomagolt alkalmazás elnevezett objektumútvonalát adja vissza a SID alapján. A csomagolt alkalmazások biztonsági azonosítóját úgy hozhatja létre, hogy átadja a csomagcsalád nevét a DeriveAppContainerSidFromAppContainerName névnek.

Note

A csomagcsalád neve a Visual Studio csomagjegyzék-szerkesztőjében található a fejlesztési idő alatt, a Partnerközponton keresztül a Microsoft Store közzétett alkalmazásokhoz, vagy a Get-AppxPackage PowerShell parancson keresztül a már telepített alkalmazásokhoz.

Egy csomagolt alkalmazás által létrehozott elnevezett objektumok megnyitásakor használja a következő formátumot <PATH>\<NAME>:

  • Cserélje le a(z) <PATH> elemet a létrehozó alkalmazás elnevezett objektumútvonalára.
  • Cserélje le <NAME> az objektum nevét.

Note

Az objektumnevek <PATH> előtagolása csak akkor szükséges, ha egy csomagolt alkalmazás hozta létre az objektumot. A Win32-alkalmazások által létrehozott elnevezett objektumokat nem kell minősíteni, de az objektumok létrehozásakor a hozzáférést továbbra is biztosítani kell.

A Windows App SDK szempontjai

Windows App SDK MSIX-sel csomagolt asztali alkalmazások teljes megbízhatósági folyamatként futnak csomagadentitással – nem AppContainerben futnak. Ez azt jelenti, hogy a névvel ellátott objektumok alapértelmezés szerint a globális névtérben jönnek létre, csakúgy, mint a hagyományos Win32-alkalmazások.

Az alábbi forgatókönyvekben ismertetett ACL- és elérésiút-minősítési eljárásokra azonban továbbra is szükség van:

  • Kommunikáció UWP-alkalmazásokkal – Az UWP-alkalmazások egy AppContainerben futnak, és izolált, elnevezett objektum névterekkel rendelkeznek. Használja a(z) GetAppContainerNamedObjectPath elemet, és ACL-ek használatával adjon hozzáférést az UWP-alkalmazás elnevezett objektumaihoz.
  • Hozzáférés korlátozása – Még a teljes megbízhatóságú alkalmazások között is érdemes explicit ACL-ekkel korlátozni, hogy mely folyamatok nyithatják meg az elnevezett objektumokat.
  • Csomagolatlan Windows App SDK-alkalmazások – Az elnevezett objektumok a globális névtérben találhatók, speciális kezelés nélkül, a hagyományos Win32-alkalmazásokhoz hasonló módon.

Remarks

A csomagolt alkalmazások nevesített objektumai alapértelmezés szerint elkülönítve vannak, hogy megőrizzék a biztonságot, és támogatást biztosítsanak az alkalmazás életciklus-eseményeihez, például a felfüggesztéshez és a leállításhoz. Az elnevezett objektumok alkalmazások közötti megosztása szigorú kötési és verziószámozási korlátozásokat vezet be, és megköveteli, hogy minden alkalmazás rugalmas legyen mások életciklusával szemben. Ezért javasoljuk, hogy csak az azonos közzétevőtől származó alkalmazások között ossza meg az elnevezett objektumokat.