繁体   English   中英

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

[英]How to launch a non-interactive process from an interactive session

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

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

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

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

可以在此处找到 UserInteractive 的参考代码。 当且仅当进程的窗口站没有设置WSF_VISIBLE标志时,它才将该属性设置为 false。 因此,您的实用程序应该创建一个新的窗口站和桌面(请参阅CreateWindowStationCreateDesktop )并在那里启动子进程。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM