gpt4 book ai didi

windows-vista - OpenInputDesktop() 确定安全/登录桌面

转载 作者:行者123 更新时间:2023-12-04 05:47:50 26 4
gpt4 key购买 nike

视觉 C++ 2008

如何确定当前交互用户在注销期间是否处于锁定桌面(Windows 键 L)或关机屏幕(Vista 或 7)等待程序关闭。

HDESK hd = OpenInputDesktop(0, false, READ_CONTROL);

这适用于默认桌面上的用户应用程序,但在锁定或关闭桌面时失败并出现错误代码 5,据我了解,用户无权打开安全桌面对象。

从 SYSTEM 帐户下运行的服务调用它会返回错误 1(无效函数)。我相信服务在任何情况下都处于错误的 session ( session 0)中,并且无法确定任何其他 session 的交互式桌面。

我有一个在当前交互式用户下运行的应用程序,并且系统服务正在运行,所以可以从其中一个执行代码。

我是否应该尝试枚举所有 session 、窗口站和桌面?

即使那样,如果我只能从 session 0 中的 SYSTEM 服务调用 OpenInputDesktop,我如何确定当前的交互式桌面?

最佳答案

我认为您可以尝试以下方法:


  • 从当前交互式用户中运行的进程:
    使用WTSRegisterSessionNotification注册 session 更改通知。注册后,交互过程将获得登录/注销通知。更多信息可以在这里找到:
    http://msdn.microsoft.com/en-us/library/aa383841.aspx
    http://blogs.msdn.com/b/oldnewthing/archive/2006/01/04/509194.aspx

  • 从服务(在 session 0 中运行):
  • 使用GetProcessWindowStation获取服务的当前站句柄,并保存以备后用。
  • 使用WTSGetActiveConsoleSessionId获取当前交互 session 的 session ID。
  • 使用 WTSQuerySessionInformation 获取当前 session id 对应的站名与 WTSWinStationName信息类。
  • 使用 OpenWindowStation 打开此站.使用 SetProcessWindowStation 将此站设置为您的服务进程.
  • 现在,您可以使用 OpenInputDesktop检查用户是否已登录。
  • 通过调用 CloseWindowStation 关闭打开的交互式窗口站.调用SetProcessWindowStation重置原来的窗口站服务与之前保存的站句柄。


  • PS:目前, "WinSta0"是 Windows 中唯一的交互式站。所以,你可以跳过 WTSGetActiveConsoleSessionIdWTSQuerySessionInformation来电。

    关于windows-vista - OpenInputDesktop() 确定安全/登录桌面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4260878/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com