【问题标题】:UAC-style elevated promptUAC 风格的提升提示
【发布时间】:2011-10-18 13:12:28
【问题描述】:

我有兴趣在临时会话中启动一个窗口,例如 UAC 提示的显示方式。有几个人对这个概念感兴趣,所以我想我会在这里问。本质上,我们想要的是一个提升的窗口,例如 UAC“你确定要<...>”提示,但带有任意窗口。最终目标是防止窗口事件挂钩和密码输入过程中可能发生的各种其他问题。

我快速浏览了 UAC API 和其他一些地方,但没有什么特别有用的地方。显然,UAC 提示被提升到他们自己的桌面会话不知何故,所以必须有一种方法来以这种方式创建窗口。

【问题讨论】:

  • 我认为您不了解这其中的复杂性... Microsoft 制作了 UAC 提示,因此很难重新创建。这里的根本问题是什么?也许有人可以提出比重新创建 UAC 提示更好的建议。
  • 据我所知,他们设计它是为了让其他应用程序不会干扰 UAC 提示本身。以类似的方式(即在临时桌面会话中)显示您自己的提示并不是他们试图阻止的。
  • 在现有会话之上创建一个新的 桌面会话 非常复杂,而且可能不适合 C#(想想 Win32/C++)。相反,为什么不只在最顶层显示一个全屏、无边框、透明的表单,然后在其上方显示另一个窗口/提示?
  • 因为这并不能解决用户模式键盘挂钩的问题。创建第二个桌面会话并不困难或迟钝,它是一个文档化的 Windows API。来自 sysinternals 的 desktops 工具做得很好。诚然,我想要一个稍微不同的结果,但仍然......
  • 完成。这是新问题:stackoverflow.com/questions/7808237/…

标签: c# windows security winapi uac


【解决方案1】:

您可以使用CreateDesktop 创建桌面。您可以使用SwitchDesktop 切换到新桌面。然后你可以在你的主线程上调用SetThreadDesktop 并绘制你的窗口。要取回默认桌面的句柄,请调用 OpenDesktop 并将“默认”设置为 lpszDesktop 并将 SwitchDesktop 与此句柄一起使用。您还可以在某个桌面上运行进程。为此,您必须将STARTUPINFO 结构的lpDesktop 成员设置为应在其上运行进程的桌面的名称。使用后关闭桌面的句柄 (CloseDesktop)。

您可以通过这种方式在自己的桌面上显示自己的窗口。

UAC 和登录 UI 使用的安全桌面称为“Winlogon”。为了访问它,您需要系统权限。 Luke 在one of his answers 中提供了一个示例。

Brian R. Bondy 写了一封 blog entry on desktops and window stations,值得一读。

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多