이 항목에서는 패키지된 데스크톱 앱(MSIX로 패키지된 Windows 앱 SDK 앱 포함)과 패키지되지 않은 Win32 애플리케이션 간에 명명된 개체를 공유하는 방법에 대해 설명합니다.
패키지된 애플리케이션의 명명된 개체
명명된 개체 는 프로세스에서 개체 핸들을 쉽게 공유할 수 있는 방법을 제공합니다. 프로세스가 명명된 개체를 만든 후 다른 프로세스는 이름을 사용하여 적절한 함수를 호출하여 개체에 대한 핸들을 열 수 있습니다. 명명된 개체는 스레드 동기화 및 프로세스 간 통신에 일반적으로 사용됩니다.
AppContainer에서 실행되는 애플리케이션(예: UWP 앱)에는 기본적으로 격리된 명명된 개체 네임스페이스가 있습니다. 이 네임스페이스는 만든 명명된 개체에만 액세스할 수 있습니다. 완전 신뢰 패키지 데스크톱 앱(Windows 앱 SDK 앱 포함)에는 이 격리가 없으며 전역 네임스페이스에 명명된 개체를 만듭니다. 자세한 내용은 Windows 앱 SDK 고려 사항을 참조하세요.
명명된 개체를 AppContainer 앱과 공유하려면 개체를 만들 때 사용 권한을 설정해야 하며 개체를 열 때 이름을 정규화해야 합니다. 이 문서의 기술은 패키징에 관계없이 모든 프로세스 간의 액세스를 제한하려는 경우에도 유용합니다.
명명된 개체 만들기
명명된 개체는 해당 Create API를 사용하여 생성됩니다.
이러한 모든 API LPSECURITY_ATTRIBUTES 는 호출자가 ACL(액세스 제어 목록) 을 지정하여 개체에 액세스할 수 있는 프로세스를 제어할 수 있는 매개 변수를 공유합니다. 명명된 개체를 패키지된 애플리케이션과 공유하려면 명명된 개체를 만들 때 ACL 내에서 권한을 부여해야 합니다.
SID(보안 식별자)는 ACL 내의 ID를 나타냅니다. 패키지된 모든 애플리케이션에는 패키지 패밀리 이름을 기반으로 하는 자체 SID가 있습니다. 패키지 패밀리 이름을 DeriveAppContainerSidFromAppContainerName에 전달하여 패키지된 애플리케이션에 대한 SID를 생성할 수 있습니다.
메모
패키지 패밀리 이름은 개발 시간 동안 Visual Studio 패키지 매니페스트 편집기, Microsoft Store 통해 게시된 애플리케이션에 대한 파트너 센터 또는 이미 설치된 애플리케이션에 대한 Get-AppxPackage PowerShell 명령을 통해 찾을 수 있습니다.
이 샘플에서는 명명된 개체에 ACL을 적용하는 데 필요한 기본 패턴을 보여 줍니다. 명명된 개체를 패키지 애플리케이션과 공유하려면 각 애플리케이션에 대해 EXPLICIT_ACCESS 구조를 만듭니다:
grfAccessMode = GRANT_ACCESS-
grfAccessPermissions =개체 및 의도한 사용량에 따라 적절한 사용 권한 grfInheritance = NO_INHERITANCETrustee.TrusteeForm = TRUSTEE_IS_SIDTrustee.TrusteeType = TRUSTEE_IS_USER-
Trustee.ptstrName =DeriveAppContainerSidFromAppContainerName에서 획득한 SID
Create 호출에서 LPSECURITY_ATTRIBUTES 매개 변수를 패키지된 애플리케이션용 EXPLICIT_ACCESS 규칙으로 채우면 해당 애플리케이션이 명명된 개체를 열 수 있도록 액세스 권한을 부여할 수 있습니다.
메모
Win32 애플리케이션은 해당 개체의 DACL이 액세스를 허용하는 경우, 개체를 열 때 해당 이름을 한정하여 AppContainer 앱에서 만든 이름이 지정된 개체에 액세스할 수 있습니다. 대부분의 명명된 개체에 대한 기본 DACL은 작성자와 관리자에게 액세스 권한을 부여합니다. 제한적인 DACL을 설정한 경우 Win32 호출자도 명시적 액세스 항목이 필요합니다.
예: ACL을 사용하여 명명된 이벤트 만들기(C++)
다음 예제에서는 명명된 이벤트를 만들고 패키지된 애플리케이션에 대한 액세스 권한을 부여하는 방법을 보여줍니다.
#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;
}
이름이 지정된 개체 열기
명명된 개체는 해당 Open API에 이름을 전달하여 열립니다.
패키지된 애플리케이션에서 만든 명명된 개체는 명명된 개체 경로라고도 하는 애플리케이션의 네임스페이스 내에 만들어집니다. 패키지된 애플리케이션에서 만든 명명된 개체를 열 때 개체 이름 앞에 애플리케이션의 명명된 개체 경로가 접두사로 지정되어야 합니다.
GetAppContainerNamedObjectPath 는 SID를 기반으로 패키지된 애플리케이션의 명명된 개체 경로를 반환합니다. 패키지 패밀리 이름을 DeriveAppContainerSidFromAppContainerName에 전달하여 패키지된 애플리케이션에 대한 SID를 생성할 수 있습니다.
메모
패키지 패밀리 이름은 개발 시간 동안 Visual Studio 패키지 매니페스트 편집기, Microsoft Store 통해 게시된 애플리케이션에 대한 파트너 센터 또는 이미 설치된 애플리케이션에 대한 Get-AppxPackage PowerShell 명령을 통해 찾을 수 있습니다.
패키지된 애플리케이션에서 만든 명명된 개체를 열 때 다음 형식 <PATH>\<NAME>을 사용합니다.
-
<PATH>를 생성한 애플리케이션의 이름이 지정된 개체 경로로 바꾸십시오. -
<NAME>를 개체 이름으로 바꾸십시오.
메모
패키지된 애플리케이션에서 <PATH> 개체를 만든 경우에만 개체 이름을 접두사로 지정해야 합니다. Win32 애플리케이션에서 만든 명명된 개체는 정규화할 필요가 없지만 개체를 만들 때 액세스 권한을 부여해야 합니다.
Windows 앱 SDK 고려 사항
MSIX로 패키지된 데스크톱 앱은 패키지 ID를 사용하여 완전 신뢰 프로세스로 실행되는 Windows 앱 SDK AppContainer에서 실행되지 않습니다. 즉, 명명된 개체는 기존 Win32 애플리케이션과 마찬가지로 기본적으로 전역 네임스페이스에 만들어집니다.
그러나 이러한 시나리오에서는 위에서 설명한 ACL 및 경로 한정 절차가 여전히 필요합니다.
-
UWP 앱과 통신 - UWP 앱은 AppContainer에서 실행되며 명명된 개체 네임스페이스를 격리합니다.
GetAppContainerNamedObjectPathACL을 통해 액세스 권한을 부여하여 UWP 앱의 명명된 개체에 연결합니다. - 액세스 제한 - 완전 신뢰 앱 간에도 명시적 ACL을 사용하여 명명된 개체를 열 수 있는 프로세스를 제한할 수 있습니다.
- 패키지되지 않은 Windows 앱 SDK 앱 - 명명된 개체는 기존 Win32 애플리케이션과 동일한 특별한 처리가 필요하지 않은 전역 네임스페이스에 있습니다.
Remarks
패키지된 애플리케이션의 명명된 개체는 기본적으로 격리되어 보안을 유지하고 일시 중단 및 종료와 같은 애플리케이션 수명 주기 이벤트를 지원합니다. 애플리케이션 간에 명명된 개체를 공유하면 엄격한 바인딩 및 버전 관리 제약 조건이 발생하며 각 애플리케이션이 다른 애플리케이션의 수명 주기에 탄력적이어야 합니다. 이러한 이유로 동일한 게시자의 애플리케이션 간에 명명된 개체만 공유하는 것이 좋습니다.
관련 콘텐츠
- 프로세스 간 통신
- 개체 이름(Win32)
- Windows 앱 SDK 개요
Windows developer