2013-01-24 8 views
5

내가 만들고있는 명명 된 파이프에 대해 모든 사용자에게 액세스 권한을 부여해야합니다. NULL/빈 DACL을 만들고이를 CreateNamedPipe으로 전달하는 방법을 알고 있습니다.NULL/빈 DACL은 어떻게 만듭니 까?

어떻게 NULL DACL을 만들 수 있습니까? LPSECURITY_ATTRIBUTES에 대해 NULL 포인터를 전달하는 것과 같지 않다고 들었습니다. 이처럼

답변

9

는 :

SECURITY_DESCRIPTOR SD; 
InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION); 
SetSecurityDescriptorDacl(&SD, TRUE, NULL, FALSE); 

나는 간결하게하기 위해 오류 검사를 생략. 너는 그렇게하지 않을 것이다. 전화 할 때

그런 CreateNamedPipe 당신은 보안이 같은 기록을 속성을 설정할 수 있습니다

SA.nLength = sizeof(SA); 
SA.lpSecurityDescriptor = &SD; 
SA.bInheritHandle = TRUE; 

SetSecurityDescriptorDacl 상태에 대한 문서 :

pDacl 매개 변수가 DACL 가리 키지 않는

및 bDaclPresent 플래그가 TRUE이면 NULL DACL이 지정됩니다. 모든 액세스가 허용됩니다. 모든 사용자가 DACL 및 보안 설명 자의 소유자를 변경할 수 있으므로 개체에 NULL DACL을 사용하면 안됩니다. 이것은 객체의 사용을 방해합니다.

위의 내용은 수행 방법이지만 설명서에서는 그렇게해서는 안됩니다.

+0

흠에 대한 액세스 매핑을 생성, 소유권 변경에 대한 부분은 놀라운 일이었다. 하지만 내 경우에는 문제가되지 않는다. 실행중인 사용자에 관계없이 내 exe에서 연결할 수 있어야하고, 파이프에 연결하면 Windows 서비스 나 다른 것을 해킹 할 수 없다. 하지만 여전히 흥미 롭습니다. 소유권을 변경하지 않고도 모든 사람에게 접속 권한을 부여 할 수 있습니까? – sashoalm

+0

예, 그렇다면 실제 DACL을 사용해야합니다. 이전 질문에 대한 내 의견의 코드는 어떻게 수행하는지 설명합니다. –

4

가 여기에 우리가 우리의 프로젝트 중 하나에서 사용하는 코드입니다 :

SECURITY_DESCRIPTOR pSD; 
SECURITY_ATTRIBUTES SA; 

if(!InitializeSecurityDescriptor(&pSD, SECURITY_DESCRIPTOR_REVISION)) 
    throw error; 
if(!SetSecurityDescriptorDacl(&pSD, true, NULL, false)) 
    throw error; 
SA.nLength = sizeof(SA); 
SA.lpSecurityDescriptor = &pSD; 
SA.bInheritHandle = true; 
pSA = &SA; 
... 
FMapping = CreateFileMapping(INVALID_HANDLE_VALUE, pSA, PAGE_READWRITE, 0, 4096, p); 

이 코드는 모든

+0

포인터 변수 ('pSA')를 쓰는 이유는 무엇입니까? – Ajay