如何从交互式会话启动非交互式进程
How to launch a non-interactive process from an interactive session
目标是能够以非交互方式测试 运行 PowerShell 脚本,并尽可能减少仪式。
它故意 运行 在 CI 服务器上与我 运行 交互时不同,我想调试它。理想情况下,我无需设置计划任务即可对此进行测试。命令行实用程序会很棒。
CI 服务器(TFS 构建,非交互式)和我的机器(运行ning 交互式)之间的不同之处在于 [Environment]::UserInteractive
的值。当我在命令行键入 powershell -c [Environment]::UserInteractive
时,我得到了预期的 True
。目标是能够键入 someutility powershell -c [Environment]::UserInteractive
并让它打印 False
,就像在 TFS 构建下打印 运行ning 一样。
如果有人能概述其工作原理,我愿意用 C++ 编写 someutility
。我正在研究,但一个小时没有产生任何结果。每个人都已经 运行 宁非互动或想要启动互动,而我处于完全相反的情况。似乎应该有一种方法可以从非管理员命令行执行此操作,因为启动的进程应该具有相同的用户权限但仅限于非交互式。
到目前为止,我可以使用计划任务并选择 "Run whether user is logged on or not." 来获得所需的 [Environment]::UserInteractive
= false 行为,但这很痛苦,而且我看不到非交互式标准输出知道是可能的,因为 TFS build 显示它是实时的。此外,计划任务不会在 运行 非交互时结束,因此很难判断它何时完成。
The reference code for UserInteractive can be found here. It sets the property to false if and only if the window station for the process does not have the WSF_VISIBLE
flag set. So your utility should create a new window station and desktop (see CreateWindowStation and CreateDesktop) 并在那里启动子进程。
(只有任何给定会话的默认 window 站是交互式的,因此大概手动创建的 window 站将不会默认设置 WSF_VISIBLE
。如果这没有结果在这种情况下,您应该能够使用 SetUserObjectInformation 来切换标志。)
要为子进程选择 window 工作站和桌面,请在调用 CreateProcess 的 STARTUPINFO
结构的 lpDesktop
成员中指定它。
目标是能够以非交互方式测试 运行 PowerShell 脚本,并尽可能减少仪式。 它故意 运行 在 CI 服务器上与我 运行 交互时不同,我想调试它。理想情况下,我无需设置计划任务即可对此进行测试。命令行实用程序会很棒。
CI 服务器(TFS 构建,非交互式)和我的机器(运行ning 交互式)之间的不同之处在于 [Environment]::UserInteractive
的值。当我在命令行键入 powershell -c [Environment]::UserInteractive
时,我得到了预期的 True
。目标是能够键入 someutility powershell -c [Environment]::UserInteractive
并让它打印 False
,就像在 TFS 构建下打印 运行ning 一样。
如果有人能概述其工作原理,我愿意用 C++ 编写 someutility
。我正在研究,但一个小时没有产生任何结果。每个人都已经 运行 宁非互动或想要启动互动,而我处于完全相反的情况。似乎应该有一种方法可以从非管理员命令行执行此操作,因为启动的进程应该具有相同的用户权限但仅限于非交互式。
到目前为止,我可以使用计划任务并选择 "Run whether user is logged on or not." 来获得所需的 [Environment]::UserInteractive
= false 行为,但这很痛苦,而且我看不到非交互式标准输出知道是可能的,因为 TFS build 显示它是实时的。此外,计划任务不会在 运行 非交互时结束,因此很难判断它何时完成。
The reference code for UserInteractive can be found here. It sets the property to false if and only if the window station for the process does not have the WSF_VISIBLE
flag set. So your utility should create a new window station and desktop (see CreateWindowStation and CreateDesktop) 并在那里启动子进程。
(只有任何给定会话的默认 window 站是交互式的,因此大概手动创建的 window 站将不会默认设置 WSF_VISIBLE
。如果这没有结果在这种情况下,您应该能够使用 SetUserObjectInformation 来切换标志。)
要为子进程选择 window 工作站和桌面,请在调用 CreateProcess 的 STARTUPINFO
结构的 lpDesktop
成员中指定它。