在Win7login屏幕上运行应用程序

我想通过服务在Windows 7的login屏幕上运行应用程序。

我已经在这方面做了很长时间的研究,尝试了不同的方法,但不幸的是到目前为止还没有完全成功。 我设法在当前login的用户的locking屏幕上运行应用程序 – 起初我以为这是我基本上试图实现的。 但是,然后我意识到,每个用户和一个普通用户都有不同的login屏幕(独立于用户)。

我的猜测是,这个用户独立的login屏幕(当多个帐户可用时,或者当在locking屏幕上单击“切换用户”时直接出现)在会话0中运行,而用户1在会话1中运行,用户2在会话中运行2等等。 问题是,如果我运行应用程序在会话0(与“winsta0 \ winlogon”)它不可见; 在会话1中运行正常,但没有什么帮助,因为用户必须已经login。

那么如何在用户独立的login/欢迎界面上运行一个应用程序呢? 什么是这个目的的正确参数和function? 有没有人有示范工作的例子? (delphi是首选,但实际上任何其他语言也会这样做!)

根据RRUZ的评论,唯一支持的方式是实施凭证提供者。

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

WTSGetActiveConsoleSessionId函数将告诉您哪个会话当前连接到物理控制台。