Windows/Windows Programming

파일/디렉토리 접근 권한 (FILE_READ_DATA, FILE_WRITE_DATA ......)

MOLOKINI 2016. 2. 27. 12:37

파일/디렉토리 접근 권한에 대해 알아보겠습니다.

+ 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

 

요 권한들을 적재 적소에 잘 혼합해서 쓰시면 된다는 말씀!

'Windows > Windows Programming' 카테고리의 다른 글

자식 프로세스  (0) 2016.04.09
프로세스의 종료  (0) 2016.04.02
프로세스의 생성 2 - CreateProcess()  (2) 2016.02.13
프로세스의 생성 1 - CreateProcess()  (0) 2016.02.09
프로세스간 커널 오브젝트 공유  (0) 2016.01.02