1

我正在编写一个将使用local system凭据运行的服务应用程序。如果在任何特定时间显示 Windows 登录屏幕,我将需要通过我的服务了解。有没有办法做到这一点?

PS。通过锁定工作站可以调出的屏幕:

在此处输入图像描述

或者通过尝试切换用户:

在此处输入图像描述

或者在 Ctrl+Alt+Del 之后:

在此处输入图像描述

PS。我需要它才能在 Windows XP 及更高版本上运行。

编辑:到目前为止,我想出的唯一可行的解​​决方案是查看LogonUI.exe进程是否正在运行。这种方法的问题是如何区分实际的系统登录进程和具有该图像名称的任何其他进程?

4

3 回答 3

3

如评论中所述,您试图检测交互式桌面会话中的进程是否应显示消息框。如果交互式会话不活动,那么这样做是没有意义的。

在这种情况下,我认为您提出的解决方案是错误的。相反,您应该通过调用来注册会话更改通知WTSRegisterSessionNotification。当您这样做时,您将收到WM_WTSSESSION_CHANGE允许您跟踪当前状态的消息。

请注意,您在桌面应用程序而不是服务中执行此操作。该服务仍将其消息发送到桌面应用程序。但是桌面应用程序现在知道是否值得展示它们。

更新

雷米在评论中提出了一种更好的方法:

如果正在使用单独的应用程序,则根本没有理由检测会话更改,该应用程序可以简单地检查其当前分配的工作站/桌面是否是当前交互式工作站/桌面,例如,与GetThreadDesktop()相比。OpenInputDesktop()

于 2014-04-18T06:46:42.707 回答
1

所有此类屏幕都显示在单独的桌面上。您可以尝试枚举用户的桌面并将其与当前桌面进行比较(我不确定会话 0 - Vista 及更高版本中的服务是否可以做到这一点;如果没有,请在用户会话中生成一个帮助进程)。但是,如果 UAC 桌面已启动,这可能会产生误报。另一个极端情况是无用户情况(在启动后任何用户登录之前)。

于 2014-04-18T05:47:55.823 回答
1

窗口中有几种状态。

  1. 注销状态

当 Winlogon 处于注销状态时,系统会提示用户标识自己并提供身份验证信息。如果用户提供了正确的用户帐户信息并且没有任何限制阻止它,则用户登录并在应用程序桌面中执行外壳程序(例如 Windows Explorer)。Winlogon 更改为登录状态。

  1. 登录状态

当 Winlogon 处于登录状态时,用户可以与 shell 交互、激活其他应用程序并完成他们的工作。从登录状态,用户可以停止所有工作并注销,或者锁定他们的工作站(保留所有工作)。如果用户决定注销,Winlogon 将终止与该登录会话关联的所有进程,并且工作站将可供其他用户使用。相反,如果用户决定锁定工作站,Winlogon 将更改为工作站锁定状态。

  1. 工作站锁定状态

当 Winlogon 处于工作站锁定状态时,会显示一个安全桌面,直到用户通过提供与最初登录的用户相同的标识和身份验证信息来解锁工作站,或者直到管理员强制注销为止。如果工作站已解锁,则会显示应用程序桌面,并且可以继续工作。

参考:https ://msdn.microsoft.com/ko-kr/library/windows/desktop/aa380547(v=vs.85).aspx

ps 注册安全注意序列(SAS,CTRL+ALT+Delete)包含在 Workstation-Locked 状态中

同样,Windows 上有几种桌面类型。

  1. Winlogon 桌面

  2. 应用程序桌面(=默认桌面)

  3. 屏保桌面

  4. 安全桌面

我建议您阅读以下内容: https ://msdn.microsoft.com/ko-kr/library/windows/desktop/aa375994(v=vs.85).aspx

我不知道我的答案是你想要的......但我希望它在某些方面有所帮助。

于 2016-09-08T07:29:42.537 回答