Windows 在Win7登录屏幕上运行应用程序

Windows 在Win7登录屏幕上运行应用程序,windows,api,winapi,authentication,createprocessasuser,Windows,Api,Winapi,Authentication,Createprocessasuser,我想在Windows 7的登录屏幕上从服务运行应用程序 我已经对此做了很长时间的研究,并尝试了不同的方法,但不幸的是,到目前为止还没有完全成功。我设法在当前登录用户的锁定屏幕上运行该应用程序,这在我看来是我基本上试图实现的。然而,我随后意识到,每个用户都有不同的登录屏幕,并且有一个通用屏幕(独立于用户) 我的猜测是,此独立于用户的登录屏幕(当多个帐户可用或在锁定屏幕上单击“切换用户”时,启动后直接出现)在会话0中运行,而用户1在会话1中运行,用户2在会话2中运行,依此类推。问题是,如果我在会话0

我想在Windows 7的登录屏幕上从服务运行应用程序

我已经对此做了很长时间的研究,并尝试了不同的方法,但不幸的是,到目前为止还没有完全成功。我设法在当前登录用户的锁定屏幕上运行该应用程序,这在我看来是我基本上试图实现的。然而,我随后意识到,每个用户都有不同的登录屏幕,并且有一个通用屏幕(独立于用户)

我的猜测是,此独立于用户的登录屏幕(当多个帐户可用或在锁定屏幕上单击“切换用户”时,启动后直接出现)在会话0中运行,而用户1在会话1中运行,用户2在会话2中运行,依此类推。问题是,如果我在会话0中运行应用程序(使用“winsta0\winlogon”),它将不可见;在会话1中运行可以正常工作,但没有多大帮助,因为用户必须已经登录才能运行


那么,如何在独立于用户的登录/欢迎屏幕上运行应用程序呢?用于此目的的正确参数和功能是什么?有没有人有一个有效的示范例子?(首选Delphi,但实际上任何其他语言也可以!)

按照RRUZ的评论,唯一支持的方法是实现凭证提供程序

如果您不介意违反规则,作为本地系统运行的服务应该能够在您选择的会话中启动子进程。用于获取安全令牌的句柄,将其与复制,用于更改令牌会话标识符,然后调用以启动子进程。(最初,使用单独的可执行文件是最简单的,但一旦解决了bug,就可以将服务和子流程滚动到单个可执行文件中,例如使用命令行参数或环境变量来区分这两种情况。)


该函数将告诉您当前连接到物理控制台的会话。

您是否尝试使用和接口?问题是WTSGetActiveConsoleSessionId似乎仅适用于登录的用户。我根本无法访问“切换用户”屏幕,因为这个屏幕不属于任何用户。我可以在“锁定”屏幕上放置一些内容,但不能在“切换用户”屏幕上放置。另外:您所说的“违反规则”是什么意思?我相信在新重新启动的系统上,登录屏幕将在会话1中运行。无论如何,您都可以检查:在目标系统上远程运行tasklist,并查找包含winlogon进程的会话。因此,您可以尝试在本课程中启动一个流程,作为概念证明。一旦你把它整理好了,你就可以担心如何在一般情况下找出要使用的会话了。当然,进程必须将自身连接到正确的桌面和/或窗口站;这应该与您在锁定桌面上显示内容的操作非常相似。我所说的“违反规则”就是这个意思。除非实现凭证提供程序,否则不应在登录屏幕上显示内容。几乎可以肯定的是,这样做是可能的,但不能保证相同的代码在未来版本的操作系统中继续工作。即使安装未来的修补程序也可能使其停止工作,尽管这种可能性较小。