SendMessage / PostMessage를 사용하여 다른 응용 프로그램에 메시지를 보내고 싶지만 다른 응용 프로그램이 관리자로 실행 중일 때 메시지를 수신하지 않습니다. 관리자로 "보내기"앱을 실행하지 않고 어떻게이 문제를 해결할 수 있습니까?
편집 : Remi의 답변, 수신기 앱 코드
Const dummyValue = WM_USER + 71423;
Application.HookMainWindow(AppClass.AppHookFunc);
ChangeWindowMessageFilter(dummyValue, MSGFLT_ADD);
Type TAppClass = class
function AppHookFunc(var Message : TMessage): Boolean;
end;
Var AppClass: TAppClass;
function TAppClass.AppHookFunc(var Message : TMessage): Boolean;
begin
Result := False;
Case Message.Msg of
dummyValue: begin
// do stuff
//
Result := True;
end;
end;
end;
UIPI ( 사용자 인터페이스 권한 격리 )는 낮은 무결성 프로세스가 높은 무결성 프로세스로 창 메시지를 보내는 것을 방지합니다. 소프트웨어 관점에서이 제한을 처리 할 수있는 유일한 방법은 다음 중 하나입니다.
대상 프로세스와 일치하도록 더 높은 무결성 수준 (즉, 상승 된 권한으로 실행)에서 보내는 앱을 실행합니다.
수신 앱의 소스 코드를 변경할 수있는 권한이있는 경우 ChangeWindowMessageFilter()
또는 ChangeWindowMessageFilterEx()
자체적 으로 호출하여 낮은 무결성 프로세스에서 특정 창 메시지를 수신하도록 옵트 인하십시오 .
애플리케이션 매니페스트 요소 uiaccess=true
에서 요청하여 보내는 앱이 UIPI를 우회하도록 <requestedExecutionLevel>
합니다. 그러나 여기에는 추가 요구 사항이 있습니다.
앱은 기기에 설치된 루트 인증서로 확인할 수있는 인증서로 디지털 서명되어야합니다.
앱은 파일 시스템 1 (표준 사용자가 쓸 수없는 폴더 ) %ProgramFiles%
의 하위 및 하위 디렉터리 또는 하위 %WinDir%
및 하위 디렉터리 (표준 사용자가 쓰기 권한이있는 일부 하위 디렉터리 제외 ) 의 "보안"폴더에 설치되어야합니다. .
1 :이 요구 사항은 시스템 정책을 통해 구성 할 수 있습니다 .
소프트웨어 제어 외에 사용 가능한 유일한 다른 옵션은 시스템 수준에서 UAC (사용자 계정 제어) 및 / 또는 UIPI를 모두 비활성화하도록 시스템 정책을 변경해야합니다. 하지 말아야 할 것.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다