파일/디렉토리 접근 권한 (FILE_READ_DATA, FILE_WRITE_DATA ......)
파일/디렉토리 접근 권한에 대해 알아보겠습니다.
+ Access Mask라고도 합니다.
요 접근 권한은 말 그대로 파일이나 디렉토리에 해당 프로세스가 어떠한 동작을 수행할 수 있는지를 나타내기도 합니다.
그림판에서 그림파일을 Open하는 동작을 예로들어보면..
1. wonjayk.png 라는 그림 파일을 열기 위해서 CreateFile 호출
2. 접근 권한을 Generic Read 로 wonjayk.png 오픈
요러한 동작을 수행하게 되는데요
CreateFile 함수를 다시 살펴보면..
- 윈도우 핸들 : http://wonjayk.tistory.com/270
CreateFile 함수를 호출하게 되면 lpFileName으로 호출된 파일의 핸들을 얻어오게 됩니다.
여기서 두 번째 인자를 통해서 파일에 대한 접근 권한을 설정해줄 수 있게 됩니다.
이 접근 권한은 비트마스크(BitMask)로 이루어져 있습니다.
위에서 언급한 그림판으로 그림파일을 Open하는 동작을 예로 들어보면..
LPCTSTR lpszFileName = TEXT("C:\Users\......\Desktop\wonjayk.png");
HANDLE hOpenPicture = CreateFile ( lpszFileName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
0,
0,
NULL);
이런 형태로 CreateFile이 호출되었다고 볼 수 있습니다. (물론 어디까지나 예제입니다..)
그럼 그림판 프로세스에서 호출한 CreateFile의 두 번째 인자인 GENERIC_READ, 바로 이놈이 파일에 대한 접근 권한을 설정해주는 플래그가 되시겠습니다.
아래는 파일과 디렉토리에 설정할 수 있는 접근 권한들입니다.
+ BitMask니까 OR로 묶어서 여러개 사용하실 수 있습니다.
+ Define이 다르고 BitMask가 같은 경우가 있는데 디렉토리 접근시에는 디렉토리용 접근 Define이 사용됩니다.
+ 예 : 디렉토리 접근을 시도하는데 FILE_READ_DATA 를 사용하면 FILE_LIST_DIRECTORY로 동작
접근 권한 | 내용 |
FILE_READ_DATA (0x1) |
(파일) 파일의 데이터를 읽을 수 있는 권한 |
FILE_LIST_DIRECTORY (0x1) | (디렉토리) 디렉토리 내의 파일 리스트를 읽을 수 있는 권한 |
FILE_WRITE_DATA (0x2) |
(파일) 파일에 데이터를 기록할 수 있는 권한 |
FILE_ADD_FILE (0x2) |
(디렉토리) 디렉토리 내 파일을 생성할 수 있는 권한 |
FILE_APPEND_DATA (0x4) |
(파일/디렉토리) 파일 뒤(?)에 내용을 추가할 수 있는 권한, 디렉토리라면 하위 디렉토리를 생성할 수 있는 권한 |
FILE_ADD_SUBDIRECTORY (0x4) |
(파일/디렉토리) 파일 뒤(?)에 내용을 추가할 수 있는 권한, 디렉토리라면 하위 디렉토리를 생성할 수 있는 권한 |
FILE_READ_EA (0x8) |
(파일) 확장 파일 속성을 읽을 수 있는 권한 |
FILE_WRITE_EA (0x10) |
(파일) 확장 파일 속성을 기록할 수 있는 권한 |
FILE_EXECUTE (0x20) |
(파일) 파일을 실행시킬 수 있는 권한 |
FILE_TRAVERSE (0x20) |
(디렉토리) 디렉토리를 검색할 수 있는 권한 |
FILE_DELETE_CHILD (0x40) |
(파일/디렉토리) 현재, 그리고 연결되어있는 모든 자식 디렉토리/파일들을 삭제할 수 있는 권한으로 읽기전용이라도 삭제가 가능 |
FILE_READ_ATTRIBUTES (0x80) |
(파일) 파일 속성을 읽을 수 있는 권한 (파일 우클릭 -> 속성) |
FILE_WRITE_ATTRIBUTES (0x100) |
(파일) 파일 속성을 기록할 수 있는 권한 (파일 우클릭 -> 속성) |
DELETE (0x10000) |
(파일/디렉토리) 파일/디렉토리를 삭제할 수 있는 권한 |
READ_CONTROL (0x20000) |
(파일/디렉토리) 보안 디스크립터를 읽을 수 있는 권한 (SACL 제외) |
WRITE_DAC (0x40000) |
(파일/디렉토리) 보안 디스크립터(DACL)을 편집할 수 있는 권한 |
WRITE_OWNER (0x80000) |
(파일/디렉토리) 보안 디스크립터(DACL/SACL)을 편집할 수 있는 권한 |
SYCHRONIZE (0x100000) |
(파일) 동기화를 수행할 수 있는 권한 |
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa822867(v=vs.85).aspx
이런 권한들을 부여해줄 수 있습니다.
그런데 위에서 설정했던 GENERIC_READ 는 없네요?
이 GENERIC_READ는 일반 접근 권한(Generic Access Rights, 직역하면... 포괄적 접근 권한(?)정도?)으로 위 속성들 몇개를 짬뽕(?)시켜놓은 속성입니다.
아래는 그 짬뽕의 내용물들입니다.
일반 접근 권한 종류 | 접근 권한 |
GENERIC_READ | FILE_READ_ATTRIBUTE FILE_READ_DATA FILE_READ_EA STANDARD_RIGHTS_READ SYNCHRONIZE |
GENERIC_WRITE | FILE_APPEND_DATA FILE_WRITE_ATTRIBUTE FILE_WRITE_DATA STANDARD_RIGHTS_WRITE SYNCHRONIZE |
GENERIC_EXECUTE | FILE_EXECUTE FILE_READ_ATTRIBUTES STANDARD_RIGHTS_EXECUTE SYNCHRONIZE |
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa364399(v=vs.85).aspx
요렇게 되시겠습니다.
또 보시면 접근 권한에서는 언급되지 않았었던 표준 접근 권한(Standard Access Rights, STANDARD_RIGHTS_......)이 보이는데요
이 표준 접근 권한은 위의 접근 권한 중 5개만을 가지고 짬뽕을 만듭니다.
+ DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, SYNCHRONIZE
+ 보안 디스크립터 설정들과 관계가 있는 권한들의 집합입니다.
아래는 표준 접근 권한의 종류입니다.
표준 접근 권한 종류 | 접근 권한 |
STANDARD_RIGHTS_ALL | DELETE READ_CONTROL WRITE_DAC WRITE_OWNER SYNCHRONIZE |
STANDARD_RIGHTS_EXECUTE | READ_CONTROL |
STANDARD_RIGHTS_READ | READ_CONTROL |
STANDARD_RIGHTS_REQUIRED | DELETE READ_CONTROL WRITE_DAC WRITE_OWNER |
STANDARD_RIGHTS_WRITE | READ_CONTROL |
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa379607(v=vs.85).aspx
요 권한들을 적재 적소에 잘 혼합해서 쓰시면 된다는 말씀!