【问题标题】:How to launch a non-interactive process from an interactive session如何从交互式会话中启动非交互式进程
【发布时间】:2017-06-17 10:09:15
【问题描述】:

目标是能够以尽可能少的仪式以非交互方式测试运行 PowerShell 脚本。 它故意在 CI 服务器上的运行方式与我交互式运行它时的运行方式不同,并且我想对其进行调试。理想情况下,我无需设置计划任务即可对此进行测试。命令行实用程序会很棒。

CI 服务器(TFS 构建,非交互式)和我的机器(交互式运行)之间的不同之处在于 [Environment]::UserInteractive 的值。当我在命令行输入powershell -c [Environment]::UserInteractive 时,我得到True 的预期。目标是能够键入 someutility powershell -c [Environment]::UserInteractive 并让它打印 False,就像它会在 TFS 构建下打印运行一样。

如果有人可以概述其工作原理,我愿意用 C++ 编写 someutility。我正在研究,但一个小时没有产生任何结果。每个人都已经在运行非交互式或想要启动交互式,而我正处于完全相反的情况。似乎应该有一种方法可以从非管理员命令行执行此操作,因为启动的进程应该具有相同的用户权限,但仅限于非交互式。

到目前为止,我可以使用计划任务并选择“无论用户是否登录都运行”来获得这种所需的[Environment]::UserInteractive = false 行为。但这很痛苦,我看不到非交互式标准输出,我知道这是可能的,因为 TFS 构建显示它是实时的。此外,计划任务在非交互式运行时不会结束,因此很难判断它何时完成。

【问题讨论】:

    标签: windows interactive


    【解决方案1】:

    The reference code for UserInteractive can be found here. 当且仅当进程的窗口站没有设置WSF_VISIBLE 标志时,它才会将该属性设置为 false。所以你的实用程序应该创建一个新的窗口站和桌面(参见CreateWindowStationCreateDesktop)并在那里启动子进程。

    (只有任何给定会话的默认窗口站是交互式的,所以可能手动创建的窗口站默认不会设置WSF_VISIBLE。如果事实并非如此,您应该可以使用@ 987654324@ 切换标志。)

    要为子进程选择窗口站和桌面,请在调用CreateProcessSTARTUPINFO 结构的lpDesktop 成员中指定它。

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 2016-03-28
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多