2012-11-20 23 views
4

我正在編寫一個程序來顯示/隱藏某個目標應用程序的窗口。我之前正在測試它,發現了一些奇怪的東西。如果我以管理員身份運行目標應用程序(右鍵單擊 - >屬性,「兼容性」選項卡,「以管理員身份運行此程序」),則不起作用。當目標應用程序以管理員身份運行時,ShowWindow函數不起作用

爲了證明我編寫了一個名爲「TargetApplication」一個簡單的GUI應用程序,然後我寫了下面的代碼來測試顯示/隱藏這個應用程序:

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

所有你需要做的就是將它們下載並運行TestApplication.exe然後運行TestShowWindow.exe。您會發現通過將TestApplication.exe更改爲以管理員身份運行會導致ShowWindow不再起作用。

當然,如果你不相信下載我的東西,你可以隨時編譯我的代碼,並在Windows中的任何目標應用程序上測試它,你可以改變它的兼容模式。

P.S.我不確定它是否有所作爲,但我正在運行Windows 8 Pro。 64位。

回答

7

這是設計。它是鮮爲人知的雙UAC,稱爲UIPI或用戶界面特權隔離。一個未升級的程序無法征服升級的程序。鑑於UI自動化的功能,這是阻止程序劫持高級進程功能的明顯對策。一項安全違規稱爲shatter attack

解決方法是爲c:\ windows或c:\ program files中存儲並提供證書的程序提供uiAccess = true的清單。目標程序調用ChangeWindowMessageFilter來允許發送特定的消息。在你的情況下,應該是WM_SHOWWINDOW。

+0

哇,非常好的信息。我不明白的一件事是我有另一個程序,我沒有寫,它做了同樣的事情,它的工作原理。是否有另一種方法可以用來顯示/隱藏不需要此解決方法的窗口? –

0

如果您不介意窗口像您一樣將其最小化到任務欄;通常,您可以通過使用wParam的SC_RESTORE或SC_MINIMIZE發佈WM_SYSCOMMAND來顯示和隱藏高級進程中的窗口。

相關問題