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

+ 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
Posted by 긍정왕오킹