Share via


CreatePrivateObjectSecurityWithMultipleInheritance 함수(securitybaseapi.h)

CreatePrivateObjectSecurityWithMultipleInheritance 함수는 이 함수를 호출하는 리소스 관리자가 만든 새 프라이빗 개체에 대한 자체 상대 보안 설명자를 할당하고 초기화합니다. 이 함수는 여러 개체 형식 또는 클래스로 구성된 프라이빗 개체(예: 보조 클래스가 연결된 Directory Service 개체)를 지원합니다.

구문

BOOL CreatePrivateObjectSecurityWithMultipleInheritance(
  [in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
  [in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
  [out]          PSECURITY_DESCRIPTOR *NewDescriptor,
  [in, optional] GUID                 **ObjectTypes,
  [in]           ULONG                GuidCount,
  [in]           BOOL                 IsContainerObject,
  [in]           ULONG                AutoInheritFlags,
  [in, optional] HANDLE               Token,
  [in]           PGENERIC_MAPPING     GenericMapping
);

매개 변수

[in, optional] ParentDescriptor

개체의 부모 컨테이너에 대한 보안 설명자에 대한 포인터입니다. 부모 컨테이너가 없는 경우 이 매개 변수는 NULL입니다.

[in, optional] CreatorDescriptor

개체의 작성자가 제공하는 보안 설명자에 대한 포인터입니다. 개체의 작성자가 새 개체에 대한 보안 정보를 명시적으로 전달하지 않는 경우 이 매개 변수는 NULL일 수 있습니다. 또는 이 매개 변수가 기본 보안 설명자를 가리킬 수 있습니다.

[out] NewDescriptor

새로 할당된 자체 상대 보안 설명자에 대한 포인터를 받을 변수에 대한 포인터입니다. 보안 설명자 사용을 마쳤으면 다음을 호출하여 해제합니다.
DestroyPrivateObjectSecurity 함수입니다.

[in, optional] ObjectTypes

NewDescriptor와 연결된 개체의 개체 형식 또는 클래스를 식별하는 GUID 구조체에 대한 포인터 배열입니다. Active Directory 개체의 경우 이 배열에는 개체 구조 클래스의 클래스 GUID 및 연결된 모든 보조 클래스에 대한 포인터가 포함됩니다. 개체에 GUID가 없는 경우 ObjectTypesNULL 로 설정합니다.

[in] GuidCount

ObjectTypes 매개 변수에 있는 GUID의 수입니다.

[in] IsContainerObject

새 개체에 다른 개체를 포함할 수 있는지 여부를 지정합니다. TRUE 값은 새 개체가 컨테이너임을 나타냅니다. FALSE 값은 새 개체가 컨테이너가 아님을 나타냅니다.

[in] AutoInheritFlags

ACE( 액세스 제어 항목 )가 ParentDescriptor에서 상속되는 방법을 제어하는 비트 플래그 집합입니다. 이 매개 변수는 다음 값의 조합일 수 있습니다.

의미
SEF_DACL_AUTO_INHERIT
0x01
새 DACL( 임의 액세스 제어 목록 )에는 ParentDescriptor의 DACL에서 상속된 ACE와 CreatorDescriptor의 DACL에 지정된 명시적 ACE가 포함됩니다. 이 플래그가 설정되지 않은 경우 새 DACL은 ACE를 상속하지 않습니다.
SEF_SACL_AUTO_INHERIT
0x02
새 SACL( 시스템 액세스 제어 목록 )에는 ParentDescriptor의 SACL에서 상속된 ACE와 CreatorDescriptor의 SACL에 지정된 명시적 ACE가 포함됩니다. 이 플래그가 설정되지 않은 경우 새 SACL은 ACE를 상속하지 않습니다.
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
CreatorDescriptorObjectTypes에 지정된 개체 형식의 기본 설명자입니다. 따라서 ParentDescriptorObjectTypes 매개 변수로 지정된 개체 형식에 대한 개체별 ACE가 있으면 CreatorDescriptor가 무시됩니다. 이러한 ACE가 상속되지 않으면 CreatorDescriptor 는 이 플래그가 지정되지 않은 것처럼 처리됩니다.
SEF_AVOID_PRIVILEGE_CHECK
0x08
함수는 권한 검사를 수행하지 않습니다. SEF_AVOID_OWNER_CHECK 플래그도 설정된 경우 토큰 매개 변수는 NULL일 수 있습니다. 이 플래그는 업데이트된 각 자식에 대한 권한을 확인하지 않도록 자동 상속을 구현하는 동안 유용합니다.
SEF_AVOID_OWNER_CHECK
0x10
함수는 설명 섹션에 설명된 대로 결과 NewDescriptor에서 소유자의 유효성을 검사 않습니다. SEF_AVOID_PRIVILEGE_CHECK 플래그도 설정된 경우 토큰 매개 변수는 NULL일 수 있습니다.
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
NewDescriptor의 소유자는 기본적으로 ParentDescriptor의 소유자로 설정됩니다. 설정하지 않으면 NewDescriptor 의 소유자가 토큰 매개 변수 로 지정된 토큰의 소유자로 기본 설정됩니다. 토큰의 소유자는 토큰 자체에 지정됩니다. 두 경우 모두 CreatorDescriptor 매개 변수가 NULL이 아니면 NewDescriptor 소유자가 CreatorDescriptor의 소유자로 설정됩니다.
SEF_DEFAULT_GROUP_FROM_PARENT
0x40
NewDescriptor 그룹은 기본적으로 ParentDescriptor의 그룹으로 설정됩니다. 설정하지 않으면 NewDescriptor 그룹은 기본적으로 토큰 매개 변수로 지정된 토큰 그룹으로 설정됩니다. 토큰의 그룹은 토큰 자체에 지정됩니다. 두 경우 모두 CreatorDescriptor 매개 변수가 NULL이 아니면 NewDescriptor 그룹이 CreatorDescriptor의 그룹으로 설정됩니다.
SEF_MACL_NO_WRITE_UP
0x100
필수 수준이 개체보다 낮은 보안 주체는 개체에 쓸 수 없습니다.
SEF_MACL_NO_READ_UP
0x200
필수 수준이 개체보다 낮은 보안 주체는 개체를 읽을 수 없습니다.
SEF_MACL_NO_EXECUTE_UP
0x400
필수 수준이 개체보다 낮은 보안 주체는 개체를 실행할 수 없습니다.
SEF_AVOID_OWNER_RESTRICTION
0x1000
CreatorDescriptor에서 DACL을 지정하는 호출자의 기능을 제한하는 ParentDescriptor 매개 변수로 지정된 제한 사항은 무시됩니다.

[in, optional] Token

개체를 대신 만드는 클라이언트 프로세스에 대한 액세스 토큰에 대한 핸들입니다. 가장 토큰인 경우 SecurityIdentification 수준 이상이어야 합니다. SecurityIdentification 가장 수준에 대한 전체 설명은 SECURITY_IMPERSONATION_LEVEL 열거형 형식을 참조하세요.

클라이언트 토큰에는 기본 소유자, 기본 그룹 및 DACL과 같은 기본 보안 정보가 포함됩니다. 이 함수는 정보가 입력 보안 설명자에 없는 경우 이러한 기본값을 사용합니다. TOKEN_QUERY 액세스를 위해 토큰을 열어야 합니다.

다음 조건이 모두 true이면 TOKEN_QUERY 액세스 외에 TOKEN_DUPLICATE 액세스를 위해 핸들을 열어 야 합니다.

  • 토큰 핸들은 기본 토큰을 참조합니다.
  • 토큰의 보안 설명자에는 OwnerRights SID가 있는 하나 이상의 ACE가 포함되어 있습니다.
  • CreatorDescriptor 매개 변수에 대한 보안 설명자가 지정됩니다.
  • 이 함수의 호출자는 AutoInheritFlags 매개 변수에서 SEF_AVOID_OWNER_RESTRICTION 플래그를 설정하지 않습니다.

[in] GenericMapping

개체에 대한 각 제네릭 권한에서 특정 권한으로의 매핑을 지정하는 GENERIC_MAPPING 구조체에 대한 포인터입니다.

반환 값

함수가 성공하면 함수는 0이 아닌 값을 반환합니다.

함수가 실패하면 0을 반환합니다. 확장된 오류 정보는 GetLastError 를 호출합니다. 일부 확장 오류 코드 및 해당 의미는 다음 표에 나와 있습니다.

반환 코드 설명
ERROR_INVALID_PRIMARY_GROUP
함수는 새 보안 설명자에 대한 기본 그룹을 검색할 수 없습니다.
ERROR_INVALID_OWNER
함수는 새 보안 설명자에 대한 소유자를 검색할 수 없거나 SID( 보안 식별자 )를 소유자로 할당할 수 없습니다. 이는 전달된 토큰에 대해 소유자 SID의 유효성을 검사할 때 발생합니다.
ERROR_NO_TOKEN
함수는 소유자 유효성 검사 또는 권한 검사를 위한 토큰 대신 NULL을 수신했습니다.
ERROR_PRIVILEGE_NOT_HELD
SACL이 설정되고 SEF_AVOID_PRIVILEGE_CHECK 전달되지 않았으며 전달된 토큰이 SE_SECURITY_NAME 사용하도록 설정되지 않았습니다.

설명

CreatePrivateObjectSecurityEx 함수는 ObjectTypes에서 단일 GUID를 사용하여 CreatePrivateObjectSecurityWithMultipleInheritance 함수를 호출하는 것과 동일합니다.

AutoInheritFlagsSECURITY_DESCRIPTOR 구조체의 Control 멤버에서 비슷하게 명명된 비트와 다릅니다. 컨트롤 비트에 대한 설명은 SECURITY_DESCRIPTOR_CONTROL 참조하세요.

AutoInheritFlags가 SEF_DACL_AUTO_INHERIT 비트를 지정하는 경우 함수는 새 보안 설명자의 DACL에 다음 규칙을 적용합니다.

  • SE_DACL_AUTO_INHERITED 플래그는 새 보안 설명자의 Control 멤버에 설정됩니다.
  • 새 보안 설명자의 DACL은 CreatorDescriptor 가 기본 보안 설명자인지 또는 작성자가 명시적으로 지정했는지 여부에 관계없이 ParentDescriptor에서 AES 를 상속합니다. 새 DACL은 상속 규칙에 정의된 부모 및 작성자 DACL의 조합입니다. 특히 모든 자식 개체 또는 ObjectTypes에 나열된 개체 클래스에 상속할 수 있는 ParentDescriptor의 모든 ACE가 새 DACL에 적용됩니다.
  • 상속된 AES는 INHERITED_ACE 표시됩니다.
AutoInheritFlags가 SEF_SACL_AUTO_INHERIT 비트를 지정하는 경우 함수는 새 SACL에 유사한 규칙을 적용합니다.

DACL과 SACL 모두에 대해 ParentDescriptor 및 CreatorDescriptor 의 특정 유형의 ACE 가 조작되고 NewDescriptor에서 두 개의 ACE로 대체될 수 있습니다. 특히 다음 mappable 요소 중 하나 이상을 포함하는 상속 가능한 ACE는 출력 보안 설명자에 두 개의 API를 생성할 수 있습니다. Mappable 요소는 다음과 같습니다.

  • ACCESS_MASK 일반 액세스 권한
  • ACE 주체 식별자로 작성자 소유자 SID 또는 작성자 그룹 SID
이러한 mappable 요소가 있는 ACE는 NewDescriptor에서 다음 두 개의 A ACE를 생성합니다.
  • 원래의 복사본이지만 INHERIT_ONLY 플래그가 설정된 ACE입니다. 그러나 다음 두 조건 중 하나가 있는 경우 이 ACE는 만들어지지 않습니다.
    • IsContainerObject 매개 변수는 FALSE입니다. 상속 가능한 AES는 비컨테이너 개체에서 의미가 없습니다.
    • 원래 ACE에는 NO_PROPAGATE_INHERIT 플래그가 포함되어 있습니다. 원래 ACE는 자식에 대한 효과적인 ACE로 상속되지만 해당 자식 아래에는 상속할 수 없습니다.
  • INHERITED_ACE 비트가 켜져 있고 제네릭 요소가 특정 요소에 매핑되는 효과적인 ACE입니다.
    • 제네릭 액세스 권한은 입력 GenericMapping에 표시된 해당 표준 및 특정 액세스 권한으로 대체됩니다.
    • 작성자 소유자 SID가 결과 NewDescriptor의 소유자로 대체됨
    • 작성자 그룹 SID가 결과 NewDescriptor의 그룹으로 바뀝니다.
AutoInheritFlags에서 SEF_AVOID_OWNER_CHECK 비트를 지정하지 않으면 다음 규칙에 따라 소유자 유효성 검사가 수행됩니다. 결과 NewDescriptor 의 소유자는 합법적으로 구성된 SID여야 하며 토큰의 TokenUser와 일치해야 하거나 토큰 의 TokenGroups 에 있는 그룹과 일치해야 합니다. 그룹의 특성:
  • SE_GROUP_OWNER 포함해야 합니다.
  • SE_GROUP_USE_FOR_DENY_ONLY 포함하지 않아야 합니다.
궁극적으로 소유자를 설정할 클라이언트의 토큰에 액세스할 수 없는 호출자는 소유자 유효성 검사를 건너뛰도록 선택할 수 있습니다.

새 개체에 대한 보안 설명자를 만들려면 ParentDescriptor가 부모 컨테이너의 보안 설명자로 설정된 CreatePrivateObjectSecurityWithMultipleInheritance를 호출하고 CreatorDescriptor를 개체의 작성자가 제안한 보안 설명자로 설정합니다.

개체에서 현재 보안 설명자를 확인하려면 ParentDescriptor가 부모 컨테이너의 보안 설명자로 설정된 CreatePrivateObjectSecurityWithMultipleInheritance를 호출하고 CreatorDescriptor를 개체의 현재 보안 설명자로 설정합니다. 이 호출은 AES가 부모에서 자식 보안 설명자로 적절하게 상속되도록 합니다.

CreatorDescriptor 보안 설명자에 SACL이 포함된 경우 토큰은 SE_SECURITY_NAME 권한을 사용하도록 설정해야 합니다. 그렇지 않으면 호출자는 AutoInheritFlags에서 SEF_AVOID_PRIVILEGE_CHECK 플래그를 지정해야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 securitybaseapi.h(Windows.h 포함)
라이브러리 Advapi32.lib
DLL Advapi32.dll

추가 정보

CreatePrivateObjectSecurityEx

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL