2012-11-20 5 views
4

일부 대상 응용 프로그램의 창을 표시하거나 숨기는 프로그램을 작성하고 있습니다. 나는 그것을 일찍 테스트하고 이상한 것을 알아 차렸다. 대상 응용 프로그램을 관리자 (마우스 오른쪽 버튼 클릭 -> 속성, "호환성"탭, "관리자 권한으로이 프로그램 실행")로 실행하면 작동하지 않습니다. 나는 "targetApplication 요소"라는 간단한 GUI 응용 프로그램을 작성하고 설명하기 위해대상 응용 프로그램이 관리자 권한으로 실행되면 ShowWindow 함수가 작동하지 않습니다.

는 내가 표시/숨기기이 응용 프로그램을 테스트하려면 다음 코드를 작성 :

class Program 
{ 
    static void Main(string[] args) 
    { 
    IntPtr windowPtr = FindWindow(null, "TargetApplication"); 
    ShowWindow(windowPtr, 0); // 0 = Hide    
    Console.WriteLine("The window is now hidden. Press Enter to restore"); 
    Console.ReadLine(); 
    ShowWindow(windowPtr, 9); // 9 = Restore 
    Console.WriteLine("The window is now restored. Press Enter to exit.");    
    Console.ReadLine(); 
    } 

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

    [DllImport("user32.dll")] 
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
} 

나는 '아무튼 관리자 권한없이 윈도우 응용 프로그램을 시작하는 경우 일하지 마라.

아무도 나에게 이것을 테스트해도 되겠습니까? 여기 두 응용 프로그램의 .EXE 년대를 업로드 한 :

TestShowWindow Download

당신이 그들을 다운로드 한 다음 TestShowWindow.exe을 실행 TestApplication.exe을 실행하기 만하면됩니다. 관리자로 실행되도록 TestApplication.exe를 변경하면 ShowWindow가 더 이상 작동하지 않습니다.

물론 내 물건을 다운로드하는 것을 신뢰하지 않는다면 Windows의 모든 대상 응용 프로그램에서 항상 내 코드를 컴파일하고 테스트하여 호환성 모드를 변경할 수 있습니다.

P. 차이가 있는지는 잘 모르지만 Windows 8 Pro를 실행 중입니다. 64 비트.

답변

7

이것은 의도적으로 설계된 것입니다. UAC의 덜 알려져있는 트윈 인 UIPI 또는 사용자 인터페이스 권한 격리라고합니다. 고소되지 않은 프로그램은 높아진 프로그램을 명령 할 수 없습니다. UI 자동화의 기능을 감안할 때, 이는 프로그램이 상승 된 프로세스의 기능을 가로 챌 수 없도록하는 확실한 대응책입니다. shatter attack이라는 보안 위반.

해결 방법은 c : \ windows 또는 c : \ program 파일에 저장된 프로그램에 대해 uiAccess = true와 함께 매니페스트를 제공하고 인증서가 제공되어야합니다. 또한 대상 프로그램이 ChangeWindowMessageFilter를 호출하여 특정 메시지를 보낼 수 있도록합니다. WM_SHOWWINDOW가되어야하는 귀하의 경우.

+0

와우 아주 좋은 정보입니다. 내가 이해하지 못하는 한가지는 내가 쓰지 않은 다른 프로그램을 가지고 똑같은 일을한다는 것입니다. 이 해결 방법이 필요하지 않은 창을 표시하거나 숨길 때 사용할 수있는 다른 방법이 있습니까? –

0

작업 창이 최소화되어있는 것처럼 작동하는 창에 신경 쓰지 않는다면, 일반적으로 SC_RESTORE 또는 SC_MINIMIZE의 wParam을 사용하여 WM_SYSCOMMAND를 게시하여 상승 된 프로세스에서 창을 표시하거나 숨길 수 있습니다.