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

时间:2012-05-27 01:04:03

标签: windows api winapi authentication createprocessasuser

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

我已经对此进行了长时间的研究并尝试了不同的方法,但不幸的是到目前为止并没有完全成功。我设法在当前登录用户的锁定屏幕上运行应用程序 - 这首先看着我,因为它是我基本上试图实现的。但是,我意识到每个用户都有不同的登录屏幕和一般用户(独立于用户)。

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

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

1 个答案:

答案 0 :(得分:1)

唯一支持的方法是根据RRUZ的评论实施凭据提供程序。

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

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