UAC风格的提升提示

3

我感兴趣的是启动一个临时会话中的窗口,就像UAC提示一样。有一些人对这个概念很感兴趣,所以我想在这里问问。本质上,我们想要的是一个类似于UAC“您确定要<...>”提示的提升窗口,但具有任意窗口。最终目标是防止窗口事件钩子和所有可能在输入密码期间发生的其他问题。

我已经快速查看了UAC API和其他一些地方,但没有什么特别有用的信息。显然,UAC提示会被提升到它们自己的桌面会话某种方式,因此必须有一种创建窗口的方法。


因为这并不能解决用户模式键盘钩子的问题。而创建第二个桌面会话并不困难或晦涩,它是一个有文档记录的Windows API。Sysinternals的desktops工具可以很好地实现它。尽管我要达到略微不同的结果,但仍然... - Polynomial
那么...你到底担心什么?键盘记录器?你还是缺乏细节。为什么不使用不同形式的身份验证(如Windows/AD身份验证),而不是试图保护单个窗口(当我确信更多敏感数据没有以这种方式得到保护)。这似乎有些过度了。 - qJake
那可能是明智的建议。除非有明确说明,我总是假设某人实际上正在开发一个应用程序。;) 更加强大的是,我喜欢这样的假设性问题,我只是假设你在软件公司工作或者需要以某种方式“保护”你的应用程序。但是,很可能是可能的,只是非常非常困难。我还会将问题重新标记为Win32 / C ++,因为我认为使用托管代码(C#)是不可能的。虽然我可能错了。 - qJake
2
完成。这是新的问题:https://dev59.com/dVzUa4cB1Zd3GeqP2Fbh - Polynomial
顺便说一句,与UAC对话框进行交互是完全可能的。您需要在安全桌面上运行一个进程,并从那里安装一个监视各种事件(例如UAC提示创建)的钩子。我制作了一个概念验证,自动点击了“确定”按钮。当然,您首先需要管理员权限来运行您的进程。 - Luke
显示剩余6条评论
1个回答

6

您可以使用 CreateDesktop 创建一个桌面。您可以使用 SwitchDesktop 切换到新的桌面。然后,您可以在主线程上调用 SetThreadDesktop 并绘制窗口。要通过调用具有"Default"作为 lpszDesktop 的参数的 OpenDesktop 来获取默认桌面的句柄,并使用此句柄进行 SwitchDesktop。您还可以在特定桌面上运行进程。为了做到这一点,您必须将 STARTUPINFO 结构的 lpDesktop 成员设置为应该在其上运行进程的桌面名称。在使用完毕后关闭桌面句柄 (CloseDesktop)。

你可以通过这种方式在自己的桌面上显示自己的窗口。
UAC和登录界面使用的安全桌面被称为“Winlogon”。要访问它,您需要系统权限。Luke在他的一个回答中提供了一个示例。
Brian R. Bondy写了一篇关于桌面和窗口站的博客文章,值得一读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接