2012-04-28 2 views
3

내장 된 Users 그룹에 대한 쓰기 권한을 제거하기 위해 디렉토리 (및 해당 하위 디렉토리)에서 기존 ACL을 수정하려고합니다. 디렉토리는 상위 디렉토리에서이 특정 권한을 상속합니다. AtlSetDacl()을 사용하여 새 ACL을 설정하려고했지만 상속 된 쓰기 권한이 삭제되지 않습니다. 조각 :ACL에서 상속 된 ACE 제거/수정 (Windows)

ATL::CDacl dacl; 
ATL::AtlGetDacl(directoryName.c_str(), SE_FILE_OBJECT, &dacl); 
UINT aceCount = dacl.GetAceCount(); 
ATL::CDacl newDacl; 
for (UINT i = 0; i < aceCount; ++i) 
{ 
    ATL::CSid sid; 
    ACCESS_MASK mask = 0; 
    BYTE flags = 0; 
    dacl.GetAclEntry(i, 
        &sid, 
        &mask, 
        (BYTE*) 0, 
        &flags); 
    if (sid != Sids::Users()) 
     newDacl.AddAllowedAce(sid, mask, flags); 
} 
newDacl.AddAllowedAce(Sids::Users(),FILE_LIST_DIRECTORY | FILE_READ_EA | FILE_EXECUTE | FILE_READ_ATTRIBUTES, CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE); 
AtlSetDacl(directoryName.c_str(), SE_FILE_OBJECT, newDacl); 

는 또한 기존의 ACL을 지우고 새로 만들 SetNamedSecurityInfo가() 및 관련 API를 시도했지만 여기에 행운 중 하나를했습니다. 이렇게 열심히 노력해야하는 것 같지 않습니다. cacls.exe를 사용하면 이것은 케이크 조각입니다 (불행히도 나를위한 옵션은 아닙니다). 이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

+0

실제 코드입니까? 생략 된 ACE를 사용하여 newDacl을 구성한 다음 디렉토리에 (이전) dacl을 다시 설정하기 때문입니다. – dave

+0

그 점을 지적 해 주셔서 감사합니다, dave. 너무 많은 버전으로 작업하고 잘못된 버전을 붙여 넣었습니다. 코드 블록이 수정되었습니다. 이것은 내가 예상 한대로하지 않는 코드입니다. – mrnutz

답변

5

상속 된 ACE를 제거하려면 SetNamedSecurityInfo을 호출하고 SecurityInfo 매개 변수에 DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION을 전달하십시오.

PROTECTED_DACL_SECURITY_INFORMATION 플래그는 상속 가능한 ACE가 상위 ACL에 추가되지 않도록합니다.

다른 상속 된 권한을 복사 할 필요는 없지만 사용할 특정 ACL 만 지정하면 간단 해집니다. 상속 된 다른 사용 권한을 복사해야하는 경우 기존 코드에 read-compare-add 루프를 유지해야하지만 명시 적 권한이므로 INHERITED_ACE 플래그도 지워야합니다.