// AddToACL
// 주어진 ACL (Access Control List )에 해당 유저를 추가하고, 권한을 설정한다.
BOOL AddToACL(PACL& pACL, const char* AccountName, DWORD AccessOption)
{
CHAR sid[MAX_PATH] = {0};
DWORD sidlen = MAX_PATH;
CHAR dn[MAX_PATH] = {0};
DWORD dnlen = MAX_PATH;
SID_NAME_USE SNU;
PACL temp = NULL;
// 주어진 유저의 이름을 토대로 필요한 SID 를 구한다.
if(!LookupAccountName(NULL, AccountName, (PSID)sid, &sidlen, dn, &dnlen, &SNU))
return FALSE;
// 특정한 사용자의 accesss control 에 대한 정보를 가공하는데 사용되는 구조.
EXPLICIT_ACCESS ea = {0};
ea.grfAccessPermissions = AccessOption;
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) (PSID)sid;
// 새로운 ACL 을 생성한다. 만약 기존에 주어진게 있으면 거기에 머지하여 생성한다.
if(SetEntriesInAcl(1, &ea, pACL, &temp) != ERROR_SUCCESS)
return FALSE;
// 기존 ACL 을 지워주고, 새로 생성한걸로 대치한다.
LocalFree(pACL);
pACL = temp;
return TRUE;
}
BOOL ChangeFileSecurity(const char* path)
{
BYTE SDBuffer[4096] = {0};
DWORD SDLength = 4096, RC;
SECURITY_DESCRIPTOR* SD = (SECURITY_DESCRIPTOR*)SDBuffer;
// 해당 구조를 초기화 한다
if(!InitializeSecurityDescriptor(SD, SECURITY_DESCRIPTOR_REVISION))
return FALSE;
// 빈 ACL 을 하나 생성한다.
// SetEntriesInAcl 에 넣고, 지우고 해야하기 때문에 해당 구조에서
// 맞도록 LocalAlloc 을 사용한다. SetEntriesInAcl 에서 생성하면
// LocalFree 를 사용하도록 권고하므로, 거기에 맞춘다.
PACL pACL = (PACL)LocalAlloc(LMEM_FIXED, sizeof(ACL));
// 그냥 기본 초기화
if(!InitializeAcl(pACL, MAX_PATH, ACL_REVISION))
{
LocalFree(pACL);
return FALSE;
}
// 권한을 줄 때 어떤것을 줄것인지 옵션을 지정한다.
DWORD AccessOption = GENERIC_ALL | GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE;
// 추가 하고픈 사용자와 권한을 적어준다.
AddToACL(pACL, "Everyone", AccessOption);
AddToACL(pACL, "Administrator", AccessOption);
AddToACL(pACL, "SYSTEM", AccessOption);
// 보안 속성을 지정한 구조에, 생성한 ACL 정보를 설정해준다.
if(!SetSecurityDescriptorDacl(SD, TRUE, pACL, TRUE))
{
LocalFree(pACL);
return FALSE;
}
// 해당 파일이나, 폴더에 권한을 적용시킨다.
RC = SetFileSecurity(path, DACL_SECURITY_INFORMATION, SD);
LocalFree(pACL);
return RC;
}
댓글을 달아 주세요