키워드 [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);
}