키워드 [Programming][VC++][File][Security]
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=7537&ref=7537

MSSQL2005는 참.. 쓰기가 까다롭군요. (드럽다는 표현이.. -_-);
DB를 다루다 보면 DB파일을 여러가지 이유 때문에 Attach or Detach 할경우가 많이 있습니다.
근디, 2005 이놈이 파일을 Detach하면 보안 속성을 어드민 전용, 혹은 심할 경우 시스템 전용으로
보안 속성을 싹 바까버립니다.
 

사람이 손까락으로 할 경우는 눈으로 확인하고, 이것 저것 건드려서 보안 속성을 풀면 되지만
어플리케이션에서 할 경우는 돌아버립니다. --^;
Detach한 파일에 대한 접근이 차단되어 버리기 때문에 다시 Attach할 수도 혹은 복사도 불가능해지죠.
 
그래서, 어플리케이션에서 파일의 보안 속성을 필요한 형태로 변경할 수 있도록 구성해 봤습니다.
삽질하시는데 도움이 되시기를...
 
#include <windows.h>
#include <aclapi.h>
 
BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege = TRUE)
{
    HANDLE hToken;
    if(!::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
        return FALSE;

    TOKEN_PRIVILEGES tp;
    LUID luid;   

    if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid ))
        return FALSE;

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;
   
    if ( !AdjustTokenPrivileges(hToken, FALSE,  &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) )
        return FALSE;

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
        return FALSE;

    return TRUE;
}

BOOL AddToACL(PACL pACL, const char* AccountName)
{
    BYTE SidBuffer[100] = {0};
    PSID ptr_sid;
    DWORD SidBufSz;
    char DomainNameBuf[256] = {0};
    DWORD DomainNameBufSz;
    SID_NAME_USE SNU;

    ptr_sid = SidBuffer;
    SidBufSz = 100;
    DomainNameBufSz = 256;
 
    if(!LookupAccountName(NULL, AccountName, ptr_sid, &SidBufSz, DomainNameBuf, &DomainNameBufSz, &SNU))
        return FALSE;   

    return AddAccessAllowedAce(pACL, ACL_REVISION,
        GENERIC_ALL+GENERIC_READ+GENERIC_WRITE+GENERIC_EXECUTE,
        ptr_sid);
}

BOOL ChangeFileSecurity(const char* path)
{
    // 권한이 없을 경우는 생성해야 한다.
    // 보통은 어드민이므로 생략 가능하다.
    // SetPrivilege("SeSecurityPrivilege");
 
    SECURITY_DESCRIPTOR SD;
    SECURITY_ATTRIBUTES SA;
    BYTE AclBuf[100] = {0};
    PACL pACL;   

    if(!InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION))
        return FALSE;
 
    pACL = (PACL)AclBuf;
    if(!InitializeAcl(pACL, 100, ACL_REVISION))
        return FALSE;

     AddToACL(pACL, "Everyone");
    AddToACL(pACL, "Administrator");
    AddToACL(pACL, "SYSTEM");   

    if(!SetSecurityDescriptorDacl(&SD, TRUE, pACL, FALSE))
        return FALSE;

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

    LocalFree(pACL);
    return SetFileSecurity(path, DACL_SECURITY_INFORMATION, &SD);
}


 

+ Recent posts