我有一个 Powershell 脚本,它使用以下命令导出本地计算机上所有服务的列表:
Get-CimInstance win32_service | Export-Csv $PSScriptRoot\Local\services.csv
当我从 powershell 提示符下在本地管理员帐户下运行它时,它工作正常。我尝试将其作为计划任务运行,使用相同的本地管理员帐户运行计划任务,但没有任何内容输出到 .csv 文件。
我知道计划任务本身运行正常,因为还有其他输出文件正在更新,正如我所料。将此脚本作为计划任务运行有什么不同,会破坏它吗?
更新:我在后台运行 ProcMon 的情况下以两种方式运行了脚本。我注意到的一个区别是计划任务的进程的会话 ID 为 0,而直接运行脚本的会话 ID 为 4。
答案1
我认为问题在于我已将任务标记为:
(o)无论用户是否登录都运行
据微软称,
您可以指定任务应运行,即使触发任务时计划运行任务的帐户未登录。为此,请选中标有无论用户是否登录都运行。如果选中此单选按钮,任务将不会以交互方式运行。要使任务以交互方式运行,请选择仅在用户登录时运行单选按钮。
其中关键的是这句话:
要使任务以交互方式运行,请选择仅在用户登录时运行单选按钮。
我猜想 powershell 需要以交互方式运行,以便 cmdletGet-CimInstance
正常运行。我将任务更改为仅在用户登录时运行现在一切似乎都正常了。
答案2
我在使用 Win32_Process 时也遇到了同样的问题。我试图监视某个 .exe 的使用情况,但当以“无论用户是否登录都运行”的计划任务运行时,这行代码没有任何返回结果:
$Procs = Get-CimInstance Win32_Process -Computer $ComputerName -Filter "Name = '$MonProcName'"
我的组织不允许一直保持登录状态,因此我回到了之前使用 Get-WmiObject 开始的草稿,并且它可以在注销后工作!:
$Procs = Get-WmiObject -Computer $ComputerName -Class Win32_Process -Filter "Name = '$MonProcName'"
我改用 Get-CimInstance 的唯一原因是它的 .CreationDate 日期时间格式更好。重新格式化 Get-WmiObject .CreationDate 是值得的,这样我就可以运行这个注销程序了。