我想从服务在Windows 7的登录屏幕上运行一个应用程序。
我已经对此进行了长时间的研究并尝试了不同的方法,但不幸的是到目前为止并没有完全成功。我设法在当前登录用户的锁定屏幕上运行应用程序 - 这首先看着我,因为它是我基本上试图实现的。但是,我意识到每个用户都有不同的登录屏幕和一般用户(独立于用户)。
我的猜测是这个用户独立登录屏幕(在多个帐户可用时或在锁定屏幕上点击“切换用户”时直接启动)在会话0中运行,而用户1在会话1中运行,用户会议2中的2,依此类推。问题是如果我在会话0中运行一个应用程序(使用“winsta0 \ winlogon”)它是不可见的;在会话1中运行工作正常,但没有多大帮助,因为用户必须已经登录。
那么如何在用户独立登录/欢迎屏幕上运行应用程序?为此目的,有哪些正确的参数和功能?有没有人有示范的实例? (Delphi是首选,但实际上任何其他语言都可以!)
答案 0 :(得分:1)
唯一支持的方法是根据RRUZ的评论实施凭据提供程序。
如果您不介意违反规则,作为本地系统运行的服务应该能够在您选择的会话中启动子进程。使用OpenProcessToken
获取安全令牌的句柄,使用DuplicateTokenEx
复制它,使用SetTokenInformation
更改令牌会话标识符,然后调用CreateProcessAsUser
启动子进程。 (最初,使用单独的可执行文件是最简单的,但是一旦你解决了这些错误,就可以将服务和子进程转换为单个可执行文件,例如通过使用命令行参数或环境变量来区分这两个案例。)
WTSGetActiveConsoleSessionId
函数将告诉您当前哪个会话连接到物理控制台。