윈도우2000에서 서비스로 등록하여 돌아가는 프로그램과 일반 유저들이 로그온시에 그 유저권한으로 돌아가는 프로세스와의 통신을 할 필요가 있어서 IPC를 사용하던중에 문제가 발생했었다.
서비스로 등록된 프로그램에서 IPC를 이용하기 위해 메모리에 파일을 생성하였고, 일반 유저들이 로그온하여 실행시킨 프로세스가 서비스로 등록된 프로세스와 통신을 시도할때, access deny가 일어났다. (시스템영역의 프로세스와 일반유저영역의 프로세스간의 파일 억세스 권한이 달라서)
즉 억세스 권한이 거부되었기 때문에 억세스할수 있는 권한으로 파일을 생성해 주는 코드가 바로 아래 코드이다.
예) 아래 함수의 리턴값을 가져와서 파라미터로 넘겨준다.
SECURITY_ATTRIBUTES sa *psa;
sa = set_access_attributes();
psa = &sa;
CreateMailslot(MAILSLOT_NAME, 0, MAILSLOT_WAIT_FOREVER,psa);
SECURITY_ATTRIBUTES set_access_attributes()
{
PSID pEveryoneSID = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SECURITY_ATTRIBUTES sa;
EXPLICIT_ACCESS ea;
DWORD dwRes;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pACL = NULL;
AllocateAndInitializeSid( &SIDAuthWorld, 1,
SECURITY_WORLD_RID,0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID) ;
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = 0x001FFFFF;
ea.grfAccessMode = SET_ACCESS;
ea.grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea.Trustee.ptstrName = (LPTSTR) pEveryoneSID;
//셋팅
dwRes = SetEntriesInAcl(10, &ea, NULL, &pACL);
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = pSD;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
return sa;
}