如何在Windows 7登录界面上显示UI

7
我希望在预登录界面上展示一个与用户交互的UI(通常是用户输入用户名/密码的界面)。我了解到Winlogon包的架构已经发生了变化,在Windows 7上已经不再适用。有人建议我使用WTS函数,但我仍然不清楚如何使用这些函数或者选择哪个函数。
我已经创建了一个服务,它会打开记事本.exe(暂时只是为了测试),但我需要在用户处于预登录界面时触发该服务。我不确定该如何实现。

似乎相关:http://stackoverflow.com/questions/4524789/is-it-possible-to-call-win-form-rather-than-windows-login-window,显然自从Vista以来GINA已经不起作用了。 - Jodrell
我认为登录屏幕出现在.NET框架加载之前,因此在C#中这是不可能的。然而,在C++中,使用GINA应该很容易实现。这里有一个工作流程,说明了如何完成此操作,但没有实际的代码示例。Windows SDK应该有一些相关内容。 - Icemanind
@icemanind,从Vista开始,GINA不再可用。 - SeanC
@SeanCheshire - 没有意识到这一点。你下面的回答可能是最好的解决方案。 - Icemanind
我仍然不确定如何在预登录时显示UI。有什么建议吗? - user1683517
4个回答

3
你试图使用的是Windows交互式登录架构
Windows Vista示例此处(凭据提供程序) Windows 7 TechNet文章。

感谢您的回复。我已经查看了凭据提供程序,但不确定它们是否允许用户与我所需UI进行交互。我的UI需要旋转屏幕。我可以将该功能放在凭据提供程序内部吗? - user1683517
似乎登录UI负责呈现屏幕,凭证提供程序负责处理有效的登录信息。 - SeanC
似乎凭据提供程序不允许用户与系统相关进行交互。我的用户界面需要旋转屏幕。除了凭据提供程序之外,我还有哪些选项可以在预登录屏幕上弹出用户界面? - user1683517
http://msdn.microsoft.com/en-us/magazine/cc163489.aspx有完整的描述,以及一些示例代码。 - SeanC

0

根据我对你的需求的理解,你想在凭据提供程序层级显示自定义用户界面。你可以通过以下一种方法来实现:

(1)编写一个自定义的CP,在凭据的SetSelected方法中将你的UI作为模态对话框:这种方法允许你自定义任何UI。一旦模态窗口被关闭,实际的密码CP就会被构建(假设你包装了默认的密码CP)。

(2)从Windows服务启动应用程序:这种方法不会阻止提供程序的初始化。基本上,Windows服务用于在Winsta0\Winlogon桌面上启动进程。你可以使用Alt+TAB访问启动的进程。以下是你需要使用的基本步骤:

  1. 使用WTSGetActiveConsoleSessionId获取活动会话ID
  2. 使用WTSQueryUserToken()获取winlogon的pid
  3. 使用DuplicateTokenEx复制令牌
  4. 调用AdjustTokenPrivileges调整令牌权限
  5. 使用lpDesktop参数为Winsta0\Winlogon调用CreateProcessAsUser

我曾经使用过这两种方法。第一种方法用于引入更安全的登录方式。第二种方法用于启动远程访问工具、命令提示符等。


1
你的第二个选项在没有交互式用户登录到工作站的情况下并不起作用,即WTSQueryUserToken将以错误代码ERROR_NO_TOKEN失败。那么你是如何解决这个问题的呢? - c00000fd

0

这种事情之所以难做,是有原因的。程序是用户的奴仆。在登录前,通常没有用户可以作为奴仆。这是出于安全考虑。

只需在用户登录时启动您的服务即可。


0

让UI在没有任何人登录的情况下显示出来的一种方法是使用登录屏幕保护程序。您的代码(可以是.NET)将在超时后运行,直到您退出或有人按下Ctrl-Alt-Del。

作为登录屏幕保护程序,您所能做的有限,但这可能适合您。


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