SetPrivateObjectSecurityEx 함수(securitybaseapi.h)

SetPrivateObjectSecurityEx 함수는 이 함수를 호출하는 리소스 관리자가 유지 관리하는 프라이빗 개체의 보안 설명자를 수정합니다. SetPrivateObjectSecurityEx 함수에는 리소스 관리자가 ACE(액세스 제어 항목)의 자동 상속을 지원하는지 여부를 지정하는 flags 매개 변수가 있습니다.

구문

BOOL SetPrivateObjectSecurityEx(
  [in]           SECURITY_INFORMATION SecurityInformation,
  [in]           PSECURITY_DESCRIPTOR ModificationDescriptor,
  [in, out]      PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
  [in]           ULONG                AutoInheritFlags,
  [in]           PGENERIC_MAPPING     GenericMapping,
  [in, optional] HANDLE               Token
);

매개 변수

[in] SecurityInformation

설정할 보안 설명자의 부분입니다. 이 값은 SECURITY_INFORMATION 비트 플래그의 조합일 수 있습니다.

[in] ModificationDescriptor

SECURITY_DESCRIPTOR 구조체에 대한 포인터입니다. SecurityInformation 매개 변수로 표시된 이 보안 설명자의 부분은 ObjectsSecurityDescriptor 보안 설명자에 적용됩니다.

[in, out] ObjectsSecurityDescriptor

SECURITY_DESCRIPTOR 구조체에 대한 포인터입니다. 이 보안 설명자는 자체 상대 형식이어야 합니다. 보안 설명자에 대한 메모리는 HeapAlloc 함수를 사용하여 프로세스 힙(GetProcessHeap)에서 할당되어야 합니다.

입력 시 프라이빗 개체의 현재 보안 설명자입니다. 함수는 이를 수정하여 새 보안 설명자를 생성합니다. 필요한 경우 SetPrivateObjectSecurityEx 함수는 추가 메모리를 할당하여 더 큰 보안 설명자를 생성합니다.

[in] AutoInheritFlags

ACE의 자동 상속을 지정합니다. 보호된 서버가 자동 상속을 구현하지 않는 경우 0을 지정해야 합니다. 그렇지 않으면 Winnt.h에 정의된 다음 값의 조합을 지정할 수 있습니다.

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

[in] GenericMapping

각 일반 액세스 권한에 해당하는 특정 및 표준 액세스 권한을 지정하는 GENERIC_MAPPING 구조체에 대한 포인터입니다.

[in, optional] Token

프라이빗 개체의 보안이 수정되는 클라이언트에 대한 액세스 토큰 을 식별합니다. 이 매개 변수는 클라이언트가 새 SID(소유자 보안 식별자 )에 대해 합법적인 값을 제공했는지 확인하는 데 필요합니다. 토큰은 TOKEN_QUERY 액세스를 위해 열려 있어야 합니다.

반환 값

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

함수가 실패하면 0을 반환합니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

설명

AutoInheritFlags 매개 변수가 0이면 SetPrivateObjectSecurityExSetPrivateObjectSecurity 함수와 동일합니다.

이 함수는 리소스 관리자만 사용하기 위한 것입니다. 보안 설명자를 업데이트하기 위한 표준 Windows 액세스 제어 의미 체계를 구현하려면 리소스 관리자는 SetPrivateObjectSecurityEx를 호출하기 전에 다음 조건이 충족되는지 확인해야 합니다.

  • 개체의 소유자가 설정되는 경우 호출 프로세스 에는 WRITE_OWNER 권한이 있거나 개체의 소유자여야 합니다.
  • 개체의 DACL이 설정되는 경우 호출 프로세스에는 WRITE_DAC 권한이 있거나 개체의 소유자여야 합니다.
  • 개체의 SACL이 설정되는 경우 호출 프로세스에 대해 SE_SECURITY_NAME 권한을 사용하도록 설정해야 합니다.
위의 조건이 충족되지 않으면 이 함수에 대한 호출이 실패하지 않지만 표준 Windows 액세스 정책은 적용되지 않습니다.

클라이언트에는 일반적으로 기본 토큰 작업에 필요한 적절한 권한이 없기 때문에 이 함수를 호출하는 프로세스는 클라이언트를 가장하지 않아야 합니다.

AutoInheritFlags가 SEF_DACL_AUTO_INHERIT 비트를 지정하는 경우 함수는 DACL에 다음 규칙을 적용하여 현재 설명자에서 새 보안 설명자를 만듭니다.

  • SE_DACL_PROTECTED 플래그가 현재 보안 설명자 또는 ModificationDescriptor의 제어 비트에 설정되지 않은 경우 함수는 현재 보안 설명자 및 수정 설명자의 상속된 AES에서 출력 보안 설명 자를 생성합니다. 즉, 개체의 ACL( 액세스 제어 목록 )을 변경하여 상속된 ACE를 변경할 수 없습니다. 이 동작은 상속된 ACL이 부모 컨테이너에서 상속된 대로 유지됩니다.

    ACL 편집기에서는 상속된 AES를 수정할 수 없도록 해야 합니다.

  • SE_DACL_PROTECTED ModificationDescriptor에서 설정된 경우 현재 보안 설명자는 무시됩니다. 출력 보안 설명자는 INHERITED_ACE 비트가 꺼진 ModificationDescriptor 의 복사본으로 빌드됩니다.

    이상적으로 ACL 편집기는 개체의 부모에서 상속된 AES가 개체에 명시적으로 설정되고 있음을 호출자에게 나타내는 INHERITED_ACE 비트를 해제해야 합니다.

  • SE_DACL_PROTECTED 수정 설명자가 아닌 현재 보안 설명 자에 설정된 경우 현재 보안 설명자는 무시됩니다. 출력 보안 설명자는 ModificationDescriptor의 복사본으로 빌드됩니다. 올바른 AES에 INHERITED_ACE 비트가 켜져 있는지 확인하는 것은 호출자의 책임입니다.
AutoInheritFlags가 SEF_SACL_AUTO_INHERIT 비트를 지정하는 경우 함수는 새 SACL에 유사한 규칙을 적용합니다.

DACL 및 SACL 모두에 대해 Input ObjectsSecurityDescriptor 및 ModificationDescriptor의 특정 유형의 ACE가 Output ObjectsSecurityDescriptor의 두 ACE로 대체됩니다. 특히 다음 mappable 요소 중 하나 이상을 포함하는 상속 가능한 ACE는 Output ObjectsSecurityDescriptor에 두 개의 API를 생성합니다. Mappable 요소는 다음과 같습니다.

  • ACCESS_MASK 구조의 일반 액세스 권한
  • ACE 주체 식별자로 작성자 소유자 SID 또는 작성자 그룹 SID
이러한 mappable 요소가 있는 AES는 Output ObjectsSecurityDescriptor에 다음 두 개의 ACE를 생성합니다.
  • 원본의 복사본이지만 INHERIT_ONLY 플래그가 설정된 ACE
  • INHERITED_ACE 비트가 켜져 있고 제네릭 요소가 특정 요소에 매핑되는 ACE입니다.
    • 제네릭 액세스 권한은 입력 GenericMapping에 표시된 해당 표준 및 특정 액세스 권한으로 대체됩니다.
    • 작성자 소유자 SID가 출력 SecurityDescriptor의 소유자로 대체됨
    • 작성자 그룹 SID가 출력 SecurityDescriptor의 그룹으로 바뀝니다.
AutoInheritFlags에서 SEF_AVOID_PRIVILEGE_CHECK 비트를 지정하지 않으면 다음 규칙에 따라 소유자 유효성 검사가 수행됩니다. ModificationDescriptor의 소유자:
  • 합법적으로 구성된 SID여야 합니다.
  • 토큰의 TokenUser와 일치해야 합니다.
또는
  • 그룹의 특성이 있는 토큰의 TokenGroups에 있는 그룹과 일치해야 합니다.
    • SE_GROUP_OWNER 포함
    • 포함 SE_GROUP_USE_FOR_DENY_ONLY
개체의 하위 트리에서 소유자를 설정하는 리소스 관리자는 중복 소유자 유효성 검사 오버헤드를 방지할 수 있습니다. 이 함수에 대한 반복 호출에 대해 ModificationDescriptorToken 의 소유자가 동일하게 유지되는 경우 소유자 유효성 검사가 수행되는 초기 호출 이후의 호출에 대해 SEF_AVOID_PRIVILEGE_CHECK 비트가 AutoInheritFlags 에 설정될 수 있습니다. 궁극적으로 소유자를 설정할 클라이언트의 토큰에 액세스할 수 없는 호출자는 소유자 유효성 검사 검사를 건너뛰도록 선택해야 합니다.
참고SetPrivateObjectSecurityEx 함수에 사용되는 SEF_AVOID_PRIVILEGE_CHECK 비트는 CreatePrivateObjectSecurityEx 함수에 사용되는 SEF_AVOID_OWNER_CHECK 비트와 동일합니다.
 

요구 사항

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

추가 정보

ACCESS_MASK

클라이언트/서버 Access Control 함수

클라이언트/서버 Access Control 개요

CreatePrivateObjectSecurityEx

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GetPrivateObjectSecurity

SECURITY_DESCRIPTOR

SECURITY_INFORMATION

SetFileSecurity

SetKernelObjectSecurity

SetPrivateObjectSecurity

SetUserObjectSecurity