C++에서 자식 개체 만들기 제어

컨테이너 개체의 DACL을 사용하여 컨테이너 내에서 자식 개체를 만들 수 있는 사용자를 제어할 수 있습니다. 이는 개체의 작성자가 일반적으로 개체의 소유자로 할당되고 개체 소유자가 개체에 대한 액세스를 제어할 수 있기 때문에 중요할 수 있습니다.

다양한 유형의 컨테이너 개체에는 자식 개체를 만드는 기능을 제어하는 특정 액세스 권한이 있습니다. 예를 들어 스레드는 키 아래에 하위 키를 만들려면 레지스트리 키에 대한 KEY_CREATE_SUB_KEY 액세스 권한이 있어야 합니다. 레지스트리 키의 DACL에는 이 액세스 권한을 허용하거나 거부하는 API가 포함될 수 있습니다. 마찬가지로 NTFS는 디렉터리에서 파일 또는 디렉터리를 만드는 기능을 제어하기 위한 FILE_ADD_FILE 및 FILE_ADD_SUBDIRECTORY 액세스 권한을 지원합니다.

ADS_RIGHT_DS_CREATE_CHILD 액세스 권한은 DS(디렉터리 서비스) 개체에서 자식 개체 만들기를 제어합니다. 그러나 DS 개체는 다양한 유형의 개체를 포함할 수 있으므로 시스템은 보다 세분화된 제어를 지원합니다. 개체별 AES를 사용하여 지정된 형식의 자식 개체를 만들 수 있는 권한을 허용하거나 거부할 수 있습니다. 사용자가 다른 유형의 자식 개체를 만들지 못하게 하면서 한 형식의 자식 개체를 만들도록 허용할 수 있습니다.

다음 예제에서는 SetEntriesInAcl 함수를 사용하여 개체별 ACE를 ACL에 추가합니다. ACE는 지정된 유형의 자식 개체를 만들 수 있는 권한을 부여합니다. EXPLICIT_ACCESS 구조체의 grfAccessPermissions 멤버는 ACE가 자식 개체 생성을 제어함을 나타내기 위해 ADS_RIGHT_DS_CREATE_CHILD 설정됩니다. OBJECTS_AND_SID 구조체의 ObjectsPresent 멤버는 ObjectTypeGuid 멤버에 유효한 GUID가 포함되어 있음을 나타내기 위해 ACE_OBJECT_TYPE_PRESENT 로 설정됩니다. GUID는 생성이 제어되는 자식 개체의 형식을 식별합니다.

다음 예제에서 pOldDACL은 기존 ACL 구조체에 대한 유효한 포인터여야 합니다. 개체에 대한 ACL 구조를 만드는 방법에 대한 자세한 내용은 C++에서 새 개체에 대한 보안 설명자 만들기를 참조하세요.

DWORD dwRes;
PACL pOldDACL = NULL;
PACL pNewDACL = NULL;
GUID guidChildObjectType = GUID_NULL;   // GUID of object to control creation of
PSID pTrusteeSID = NULL;           // trustee for new ACE
EXPLICIT_ACCESS ea;
OBJECTS_AND_SID ObjectsAndSID;

// pOldDACL must be a valid pointer to an existing ACL structure.

// guidChildObjectType must be the GUID of an object type 
// that is a possible child of the object associated with pOldDACL.
 
// Initialize an OBJECTS_AND_SID structure with object type GUIDs and 
// the SID of the trustee for the new ACE. 

ZeroMemory(&ObjectsAndSID, sizeof(OBJECTS_AND_SID));
ObjectsAndSID.ObjectsPresent = ACE_OBJECT_TYPE_PRESENT;
ObjectsAndSID.ObjectTypeGuid = guidChildObjectType;
ObjectsAndSID.InheritedObjectTypeGuid  = GUID_NULL;
ObjectsAndSID.pSid = (SID *)pTrusteeSID;

// Initialize an EXPLICIT_ACCESS structure for the new ACE. 

ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = ADS_RIGHT_DS_CREATE_CHILD;
ea.grfAccessMode = GRANT_ACCESS;
ea.grfInheritance= NO_INHERITANCE;
ea.Trustee.TrusteeForm = TRUSTEE_IS_OBJECTS_AND_SID;
ea.Trustee.ptstrName = (LPTSTR) &ObjectsAndSID;

// Create a new ACL that merges the new ACE
// into the existing DACL.

dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);