안녕하세요. 까막입니다.

UAC 관련하여 최근 작업을 진행하면서 찾은 자료를 공유해보고자 올려봅니다.


문제 : UAC 상에서 관리자 권한으로 상승 시킨 어플리케이션과 탐색기 간의 Drag & Drop 가 동작하지 않는 문제

해법 : ChangeWindowMessageFilter 를 이용하여 WM_DROPFILES 관련 메시지를 필터에 걸리지 않도록 수정


용어 1 : UIPI (User Interface Privilege Isolation) 사용자 인터페이스 권한 격리

용어 2 : ChangeWindowMessageFilter 함수


참조 1 : Helge Klein 사이트

참조 2 : 띠깜의 하얀세상


ChangeWindowMessageFilter  함수는 낮은 무결성 수준의 발신자(어플리케이션)로 부터 수신되는 메시지를  

UIPI 의 메시지 필터 기능에 일부 혹은 전부를 추가하거나 삭제하는 기능을 가지고 있습니다.


제가 진행한 작업처럼 관리자 기능을 가진 어플리케이션에, 일반 유저 권한으로 수행된 탐색기의 WM_DROPFILES 메시지가 날라오면

보안 수준이 다르기 때문에 자동으로 필터하여 프로세스의 안전을 보장합니다.


드래그 & 드롭에 관한 메시지는 다음과 같은 메시지 일부를 필터에 추가하여 줌으로써, 기능이 동작하도록 설정할 수 있습니다.

(MSDN 의 Remark 에 따르면 안전한 프로세스 관리를 위하여, 필요한 메시지만 필터하도록 권고 하므로 

 기능이 잘 안된다고 루프를 돌려서 모든 메시지를 추가하는 일이 없도록 주의 하십시오.)

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);

ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);

ChangeWindowMessageFilter (0x0049, MSGFLT_ADD); 


위 코드를 프로그램의 초기화 코드 위치나 다이알로그의 WM_INITDIALOG 핸들러 위치에 삽입하시면 됩니다.

아래는 샘플 코드...


BOOL CK4iRestoreDlg::OnInitDialog()

{

CDialog::OnInitDialog();


ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);

ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);

ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);


      // bla bla bla ...
}

테스트는 아래의 OS 상에서 기능이 테스트 되었습니다.
Windows 2003 Server x64/x86 kor/eng
Windows 2008 Server x64 kor/eng
Windows 2012 Server x64 eng/jp

Windows 7 x64 jp


+ Recent posts