【问题标题】:ShowWindow Function Doesn't Work When Target Application Is Run As Administrator当目标应用程序以管理员身份运行时,ShowWindow 功能不起作用
【发布时间】:2023-03-12 18:35:01
【问题描述】:

我正在编写一个显示/隐藏某个目标应用程序窗口的程序。我之前正在测试它,并注意到一些奇怪的东西。如果我以管理员身份运行目标应用程序(右键单击 -> 属性,“兼容性”选项卡,“以管理员身份运行此程序”)它不起作用。

为了演示,我编写了一个名为“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 中您能够更改兼容模式的任何目标应用程序上对其进行测试。

附:我不确定它是否会有所不同,但我正在运行 Windows 8 Pro。 64 位。

【问题讨论】:

    标签: c# windows-8 administrator showwindow


    【解决方案1】:

    如果您不介意窗口就像您将其最小化到任务栏一样;通常,您可以通过使用 SC_RESTORE 或 SC_MINIMIZE 的 wParam 发布 WM_SYSCOMMAND 来显示和隐藏提升进程的窗口。

    【讨论】:

      【解决方案2】:

      这是设计使然。它是 UAC 鲜为人知的双胞胎,称为 UIPI 或用户界面特权隔离。未提升的程序不能征用提升的程序。鉴于 UI 自动化的功能,这是阻止程序劫持提升进程功能的明显对策。称为shatter attack 的安全违规。

      解决方法是为存储在 c:\windows 或 c:\program 文件中并提供证书的程序提供 uiAccess = true 的清单。并为目标程序调用 ChangeWindowMessageFilter 以允许发送某些消息。在你的情况下应该是 WM_SHOWWINDOW。

      【讨论】:

      • 哇非常好的信息。我不明白的一件事是我有另一个我没有编写的程序做同样的事情并且它有效。我可以使用另一种方法来显示/隐藏不需要此解决方法的窗口吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2010-12-19
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多