Adlandırılmış nesneleri paylaşma

Bu konuda, adlandırılmış nesnelerin paketlenmiş masaüstü uygulamaları (MSIX ile paketlenmiş Windows Uygulama SDK'sı uygulamalar dahil) ile paketlenmemiş Win32 uygulamaları arasında nasıl paylaşıldığı açıklanmaktadır.

Paketlenmiş uygulamalarda adlandırılmış nesneler

Adlandırılmış nesneler , işlemlerin nesne tanıtıcılarını paylaşması için kolay bir yol sağlar. Bir işlem adlandırılmış nesne oluşturduktan sonra, diğer işlemler nesneye yönelik bir tanıtıcı açmak üzere uygun işlevi çağırmak için bu adı kullanabilir. Adlandırılmış nesneler genellikle iş parçacığı eşitleme ve işlemler arası iletişim için kullanılır.

AppContainer'da (UWP uygulamaları gibi) çalışan uygulamaların varsayılan olarak yalıtılmış bir adlandırılmış nesne ad alanı vardır; yalnızca oluşturdukları adlandırılmış nesnelere erişebilirler. Windows Uygulama SDK'sı uygulamaları dahil olmak üzere paketlenmiş tam güvenilir masaüstü uygulamaları bu yalıtıma sahip değildir ve global ad alanında adlandırılmış nesneler oluşturur. Ayrıntılar için bkz. Windows Uygulama SDK'sı önemli noktalar.

Adlandırılmış nesneleri AppContainer uygulamalarıyla paylaşmak için, nesneler oluşturulduğunda izinlerin ayarlanması ve nesneler açıldığında adların nitelenmiş olması gerekir. Bu makaledeki teknikler, paketlemeden bağımsız olarak herhangi bir işlem arasındaki erişimi kısıtlamak istediğinizde de yararlıdır.

Adlandırılmış nesneler oluşturma

Adlandırılmış nesneler, karşılık gelen Create bir API ile oluşturulur:

Bu API'lerin tümü, çağıranın nesneye erişebilecek işlemleri denetlemek için LPSECURITY_ATTRIBUTES belirtmesini sağlayan bir parametreyi paylaşır. Adlandırılmış nesneleri paketlenmiş uygulamalarla paylaşmak için, adlandırılmış nesneler oluşturulduğunda ACL'ler içinde izin verilmelidir.

Güvenlik tanımlayıcıları (SID), ACL'ler içindeki kimlikleri temsil eder. Paketlenmiş her uygulamanın, paket ailesi adına göre kendi SID'leri vardır. Paketlenmiş bir uygulamanın SID'sini oluşturmak için paket ailesi adını DeriveAppContainerSidFromAppContainerName öğesine geçirebilirsiniz.

Note

Paket ailesi adı, geliştirme sırasında Visual Studio paket bildirimi düzenleyicisi aracılığıyla, Microsoft Store aracılığıyla yayımlanan uygulamalar için İş Ortağı Merkezi aracılığıyla veya zaten yüklü uygulamalar için Get-AppxPackage PowerShell komutu aracılığıyla bulunabilir.

Bu örnek , adlandırılmış bir nesne ACL için gereken temel deseni gösterir. Adlandırılmış nesneleri paketlenmiş uygulamalarla paylaşmak için her uygulama için bir EXPLICIT_ACCESS yapısı oluşturun:

Create çağrılarında LPSECURITY_ATTRIBUTES parametresini paketlenmiş uygulamalara yönelik EXPLICIT_ACCESS kurallarıyla doldurarak, bu uygulamaların adlandırılmış nesneyi açmasına izin verebilirsiniz.

Note

Win32 uygulamaları, AppContainer uygulamaları tarafından oluşturulan adlandırılmış nesnelere, nesnenin DACL'si erişime izin verdiği durumlarda, bunları açarken nesne adlarını niteleyerek erişebilir. Çoğu adlandırılmış nesne için varsayılan DACL, oluşturucuya ve yöneticilere erişim verir. Kısıtlayıcı bir DACL ayarladıysanız, Win32 çağıranların da açık bir erişim girdisi olması gerekir.

Örnek: ACL ile adlandırılmış olay oluşturma (C++)

Aşağıdaki örnekte, adlandırılmış olay oluşturma ve paketlenmiş bir uygulamaya erişim verme gösterilmektedir:

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

Adlandırılmış nesneleri açma

Adlandırılmış nesneler, ilgili Open API'ye bir ad geçirilerek açılır:

Paketlenmiş bir uygulama tarafından oluşturulan adlandırılmış nesneler, uygulamanın ad alanı içinde oluşturulur ve adlandırılmış nesne yolu olarak da bilinir. Paketlenmiş bir uygulama tarafından oluşturulan adlandırılmış nesneleri açarken, nesne adları oluşturma uygulamasının adlandırılmış nesne yolu ile ön eklenmelidir.

GetAppContainerNamedObjectPath , SID'sini temel alan paketlenmiş bir uygulama için adlandırılmış nesne yolunu döndürür. Paketlenmiş bir uygulamanın SID'sini oluşturmak için paket ailesi adını DeriveAppContainerSidFromAppContainerName öğesine geçirebilirsiniz.

Note

Paket ailesi adı, geliştirme sırasında Visual Studio paket bildirimi düzenleyicisi aracılığıyla, Microsoft Store aracılığıyla yayımlanan uygulamalar için İş Ortağı Merkezi aracılığıyla veya zaten yüklü olan uygulamalar için Get-AppxPackage PowerShell komutu aracılığıyla bulunabilir.

Paketlenmiş bir uygulama tarafından oluşturulan adlandırılmış nesneleri açarken biçimini <PATH>\<NAME>kullanın:

  • <PATH> öğesini, oluşturan uygulamanın adlandırılmış nesne yolu ile değiştirin.
  • <NAME> ifadesini nesne adıyla değiştirin.

Note

Nesne adlarının başına <PATH> getirmek yalnızca nesne paketlenmiş bir uygulama tarafından oluşturulduysa gereklidir. Win32 uygulamaları tarafından oluşturulan adlandırılmış nesnelerin nitelenmiş olması gerekmez, ancak nesneler oluşturulduğunda erişim yine de verilmelidir.

Windows Uygulama SDK'sı ile ilgili dikkat edilmesi gerekenler

MSIX ile paketlenmiş Windows Uygulama SDK'sı masaüstü uygulamaları, paket kimliğiyle tam güven işlemleriolarak çalışır; AppContainer'da çalışmaz. Bu, adlandırılmış nesnelerinin geleneksel Win32 uygulamaları gibi varsayılan olarak genel ad alanında oluşturulduğu anlamına gelir.

Ancak, aşağıdaki senaryolarda yukarıda açıklanan ACL ve yol nitelendirme prosedürleri yine de gereklidir:

  • UWP uygulamasıyla iletişim kurma — UWP uygulamaları bir AppContainer'da çalışır ve adlandırılmış nesne ad alanlarına sahiptir. Bir UWP uygulamasının adlandırılmış nesnelerine erişmek için GetAppContainerNamedObjectPath kullanın ve ACL'ler aracılığıyla erişim verin.
  • Erişimi kısıtlama — Tam güven uygulamaları arasında bile, adlandırılmış nesnelerinizi açabilecek işlemleri sınırlamak için açık ACL'ler kullanmak isteyebilirsiniz.
  • Paketlenmemiş Windows Uygulama SDK'sı uygulamaları — Adlandırılmış nesneler, geleneksel Win32 uygulamalarıyla aynı özel işleme gerektirmeyen genel ad alanında yer alır.

Remarks

Paketlenmiş uygulamalarda adlandırılmış nesneler, güvenliği korumak ve askıya alma ve sonlandırma gibi uygulama yaşam döngüsü olayları için destek sağlamak için varsayılan olarak yalıtılır. Adlandırılmış nesnelerin uygulamalar arasında paylaşılması sıkı bağlama ve sürüm oluşturma kısıtlamalarına neden olur ve her uygulamanın başkalarının yaşam döngüsüne dayanıklı olmasını gerektirir. Bu nedenlerden dolayı, aynı yayımcıdaki uygulamalar arasında yalnızca adlandırılmış nesneleri paylaşmanızı öneririz.