如何从交互式会话中启动非交互式进程

时间:2017-01-31 20:10:05

标签: windows interactive

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

(只有任何给定会话的默认窗口工作站是交互式的,因此可能手动创建的窗口工作站默认情况下不会设置WSF_VISIBLE。如果情况不是这样,您应该能够使用SetUserObjectInformation来切换标记。)

要为子流程选择窗口工作站和桌面,请在CreateProcess调用中lpDesktop结构的STARTUPINFO成员中指定。