目标是能够以尽可能少的仪式以非交互方式测试运行PowerShell脚本。它在CI服务器上的运行方式与我以交互方式运行它时的运行方式不同,我希望对其进行调试。理想情况下,我可以在不设置计划任务的情况下对其进行测试。一个命令行实用工具将是非常棒的。
CI服务器(TFS构建,非交互式)和我的机器(交互式运行)之间的区别在于[Environment]::UserInteractive的价值。当我在命令行中输入powershell -c [Environment]::UserInteractive时,我得到了预期的True。我们的目标是能够输入someutility powershell -c [Environment]::UserInteractive并让它打印False,就像在TFS构建下打印一样。
如果有人能概述一下它是如何工作的,我愿意用C++编写someutility。我正在研究,但一个小时还没有结果。每个人都已经在运行非交互式或想要启动交互式,而我的情况正好相反。似乎应该有一种方法可以从非管理员命令行执行此操作,因为启动的进程应该具有相同的用户权限,但应限制为非交互式的。
到目前为止,我可以使用计划任务并选择“无论用户是否登录都运行”来获得所需的[Environment]::UserInteractive = false行为。但这很痛苦,而且我看不到非交互式的标准输出,我知道这是可能的,因为TFS构建会实时显示它。此外,计划任务在非交互运行时不会结束,因此很难判断它何时完成。
发布于 2017-02-01 06:27:14
当且仅当进程的窗口工作站未设置WSF_VISIBLE标志时,The reference code for UserInteractive can be found here.才会将该属性设置为false。因此,您的实用程序应该创建一个新的窗口工作站和桌面(请参见CreateWindowStation和CreateDesktop并在那里启动子进程。
(对于任何给定的会话,只有默认的窗口工作站是交互式的,因此可能手动创建的窗口工作站在默认情况下不会设置WSF_VISIBLE。如果事实并非如此,您应该能够使用SetUserObjectInformation
若要为子进程选择窗口工作站和桌面,请在调用CreateProcess的STARTUPINFO结构的lpDesktop成员中指定它。
https://stackoverflow.com/questions/41966617
复制相似问题