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에 정의된 다음 값의 조합을 지정할 수 있습니다.
값 | 의미 |
---|---|
|
새 DACL( 임의 액세스 제어 목록 )에는 개체의 부모 DACL에서 상속된 ACE와 ModificationDescriptor의 DACL에 지정된 명시적 AES가 포함됩니다. 이 플래그가 설정되지 않은 경우 새 DACL은 API를 상속하지 않습니다. |
|
새 SACL( 시스템 액세스 제어 목록 )에는 개체의 부모와 연결된 보안 설명자의 SACL에서 상속된 ACE와 ModificationDescriptor의 SACL에 지정된 명시적 ACE가 포함됩니다. 이 플래그가 설정되지 않은 경우 새 SACL은 ACE를 상속하지 않습니다. |
|
함수는 권한 검사를 수행하지 않습니다. SEF_AVOID_OWNER_CHECK 플래그도 설정된 경우 토큰 매개 변수는 NULL일 수 있습니다. 업데이트된 각 자식에 대한 권한을 확인하지 않도록 자동 상속을 구현할 때 이 플래그를 사용합니다. |
|
함수는 설명에 설명된 대로 결과 ObjectsSecurityDescriptor에서 소유자의 유효성을 검사 않습니다. SEF_AVOID_PRIVILEGE_CHECK 플래그도 설정된 경우 토큰 매개 변수는 NULL일 수 있습니다. |
|
ObjectsSecurityDescriptor의 소유자는 기본적으로 개체의 부모 소유자로 설정됩니다. 이 플래그가 설정되지 않은 경우 ObjectsSecurityDescriptor 의 소유자는 기본적으로 토큰 매개 변수로 지정된 토큰의 소유자로 설정됩니다. 토큰의 소유자는 토큰 자체에 지정됩니다. 두 경우 모두 ModificationDescriptor 매개 변수가 NULL이 아니면 ObjectsSecurityDescriptor 소유자가 ModificationDescriptor의 소유자로 설정됩니다. |
|
ObjectsSecurityDescriptor 그룹은 기본적으로 개체의 부모 소유자로부터 그룹으로 설정됩니다. 이 플래그가 설정되지 않은 경우 ObjectsSecurityDescriptor 그룹은 기본적으로 토큰 매개 변수로 지정된 토큰 그룹으로 설정됩니다. 토큰의 그룹은 토큰 자체에 지정됩니다. 두 경우 모두 ModificationDescriptor 매개 변수가 NULL이 아니면 ObjectsSecurityDescriptor 그룹이 ModificationDescriptor의 그룹으로 설정됩니다. |
|
필수 수준이 개체보다 낮은 보안 주체는 개체에 쓸 수 없습니다. |
|
필수 수준이 개체보다 낮은 보안 주체는 개체를 읽을 수 없습니다. |
|
필수 수준이 개체보다 낮은 보안 주체는 개체를 실행할 수 없습니다. |
|
ObjectSecurityDescriptor에서 호출자의 DACL 지정 기능을 제한하는 개체의 부모 소유자가 지정한 제한 사항은 무시됩니다. |
[in] GenericMapping
각 일반 액세스 권한에 해당하는 특정 및 표준 액세스 권한을 지정하는 GENERIC_MAPPING 구조체에 대한 포인터입니다.
[in, optional] Token
프라이빗 개체의 보안이 수정되는 클라이언트에 대한 액세스 토큰 을 식별합니다. 이 매개 변수는 클라이언트가 새 SID(소유자 보안 식별자 )에 대해 합법적인 값을 제공했는지 확인하는 데 필요합니다. 토큰은 TOKEN_QUERY 액세스를 위해 열려 있어야 합니다.
반환 값
함수가 성공하면 함수는 0이 아닌 값을 반환합니다.
함수가 실패하면 0을 반환합니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
설명
AutoInheritFlags 매개 변수가 0이면 SetPrivateObjectSecurityEx는 SetPrivateObjectSecurity 함수와 동일합니다.
이 함수는 리소스 관리자만 사용하기 위한 것입니다. 보안 설명자를 업데이트하기 위한 표준 Windows 액세스 제어 의미 체계를 구현하려면 리소스 관리자는 SetPrivateObjectSecurityEx를 호출하기 전에 다음 조건이 충족되는지 확인해야 합니다.
- 개체의 소유자가 설정되는 경우 호출 프로세스 에는 WRITE_OWNER 권한이 있거나 개체의 소유자여야 합니다.
- 개체의 DACL이 설정되는 경우 호출 프로세스에는 WRITE_DAC 권한이 있거나 개체의 소유자여야 합니다.
- 개체의 SACL이 설정되는 경우 호출 프로세스에 대해 SE_SECURITY_NAME 권한을 사용하도록 설정해야 합니다.
클라이언트에는 일반적으로 기본 토큰 작업에 필요한 적절한 권한이 없기 때문에 이 함수를 호출하는 프로세스는 클라이언트를 가장하지 않아야 합니다.
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 비트가 켜져 있는지 확인하는 것은 호출자의 책임입니다.
DACL 및 SACL 모두에 대해 Input ObjectsSecurityDescriptor 및 ModificationDescriptor의 특정 유형의 ACE가 Output ObjectsSecurityDescriptor의 두 ACE로 대체됩니다. 특히 다음 mappable 요소 중 하나 이상을 포함하는 상속 가능한 ACE는 Output ObjectsSecurityDescriptor에 두 개의 API를 생성합니다. Mappable 요소는 다음과 같습니다.
- ACCESS_MASK 구조의 일반 액세스 권한
- ACE 주체 식별자로 작성자 소유자 SID 또는 작성자 그룹 SID
- 원본의 복사본이지만 INHERIT_ONLY 플래그가 설정된 ACE
- INHERITED_ACE 비트가 켜져 있고 제네릭 요소가 특정 요소에 매핑되는 ACE입니다.
- 제네릭 액세스 권한은 입력 GenericMapping에 표시된 해당 표준 및 특정 액세스 권한으로 대체됩니다.
- 작성자 소유자 SID가 출력 SecurityDescriptor의 소유자로 대체됨
- 작성자 그룹 SID가 출력 SecurityDescriptor의 그룹으로 바뀝니다.
- 합법적으로 구성된 SID여야 합니다.
- 토큰의 TokenUser와 일치해야 합니다.
- 그룹의 특성이 있는 토큰의 TokenGroups에 있는 그룹과 일치해야 합니다.
- SE_GROUP_OWNER 포함
- 포함 SE_GROUP_USE_FOR_DENY_ONLY
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | securitybaseapi.h(Windows.h 포함) |
라이브러리 | Advapi32.lib |
DLL | Advapi32.dll |