UAC Drag & Drop
안녕하세요. 까막입니다.
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);
Windows 7 x64 jp