3

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

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

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

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

4

1 回答 1

1

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

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

WTSGetActiveConsoleSessionId功能将告诉您当前连接到物理控制台的会话。

于 2012-05-28T02:48:52.747 回答