目标是能够以尽可能少的仪式非交互式地测试运行PowerShell脚本。 它故意在CI服务器上以不同的方式运行,而不是以交互方式运行它并且我想调试它。理想情况下,我可以测试它,而无需设置计划任务。命令行实用程序太棒了。
CI服务器(TFS构建,非交互式)和我的机器(交互式运行)之间的区别是[Environment]::UserInteractive
的值。当我在命令行输入powershell -c [Environment]::UserInteractive
时,我按预期得到True
。目标是能够键入someutility powershell -c [Environment]::UserInteractive
并打印False
,就像在TFS构建下打印一样。
我愿意在C ++中编写someutility
,如果有人可以概述它是如何工作的。我正在研究,但一小时没有产生任何结果。每个人都已经在运行非交互式或想要启动互动,而我正处于完全相反的情况。似乎应该有一种方法可以从非管理员命令行执行此操作,因为启动的进程应具有相同的用户权限,但仅限于非交互式。
到目前为止,我可以使用计划任务获取此期望的[Environment]::UserInteractive
= false行为并选择"运行用户是否已登录。"但这很痛苦,我无法看到我知道的非交互式标准输出,因为TFS构建显示它是实时的。此外,计划任务在非交互式运行时不会结束,因此很难判断它何时完成。
答案 0 :(得分:1)
The reference code for UserInteractive can be found here.当且仅当进程的窗口站没有设置WSF_VISIBLE
标志时,它才将属性设置为false。因此,您的实用程序应创建一个新的窗口工作站和桌面(请参阅CreateWindowStation和CreateDesktop)并在那里启动子进程。
(只有任何给定会话的默认窗口工作站是交互式的,因此可能手动创建的窗口工作站默认情况下不会设置WSF_VISIBLE
。如果情况不是这样,您应该能够使用SetUserObjectInformation来切换标记。)
要为子流程选择窗口工作站和桌面,请在CreateProcess调用中lpDesktop
结构的STARTUPINFO
成员中指定。