【问题标题】:Scheduling a command line to call a vbscript using Powershell调度命令行以使用 Powershell 调用 vbscript
【发布时间】:2023-07-31 01:42:01
【问题描述】:

我可能把这弄得太复杂了。有人写了一个PowerShell脚本来重新配置和激活W2K8服务器上的KMS,它是由SCCM部署的。他剧本的关键是:

cmd /c $env:systemroot\Sysnative\cscript.exe //Nologo .\slmgr.vbs /skms <newIPAddress> | Out-Host

它在一堆系统上都不起作用,我的任务是清理。

首先,注意事项。由于网络安全限制,我不能远程调用服务器上的可执行文件,所以我不能使用 Invoke-Command 或类似的东西。此外,服务器是 W2K8,但它们只有 PS 2.0。

所以我有了编写脚本来创建计划任务来运行命令的想法。由于 2.0 的限制,我创建了一个 COM 对象 Schedule.Service,其中一个参数是 Action,这是我放置可执行文件、开关和参数的位置,所有这些都将加载到 Actions 选项卡中计划任务。

这就是我卡住的地方。我已经尝试了很多引号中的封闭部分的组合,使用显式路径代替环境变量(尽管这意味着如果路径不同,它有时会失败)等等。

如果我看对了,我需要“操作”选项卡来执行以下操作: 1. 启动 PowerShell 2. 让 PowerShell 打开命令行 3.让命令行启动cscript 4. 让 cscript 使用适当的参数运行 slmgr.vbs

不知何故,在玩弄所有这些球时,有些东西掉了下来。我能想到的最接近的是:

powershell.exe -nologo & 'cmd $env:systemroot\Sysnative\cscript.exe //Nologo .\slmgr.vbs /skms <newIPAddress>'

当我在操作选项卡中手动创建计划任务,然后运行它时,powershell 启动,屏幕上闪烁红色,然后在我阅读之前关闭,并且任务报告“操作成功完成” .只是为了测试,我也试过:

powershell.exe & 'cmd' "cscript slmgr.vbs"

这会启动 PowerShell,它会打开一个 DOS shell,因为此时它不会接受 PS 命令,但不会发生其他任何事情,并且任务报告“任务当前正在运行”

我错过了什么?

【问题讨论】:

    标签: powershell cmd scheduled-tasks wsh


    【解决方案1】:

    嗯,我回答了我自己的问题,是的,我把它弄得太复杂了。

    首先,忘记在 PowerShell 中混合。我是用PS来创建定时任务的,但是没必要用它来调用cscript来启动slmgr.vbs。所以这是一个可以放下的杂耍球。

    最后,使用Schedule.Service创建任务时,关键是Action,相关的属性设置如下:

    $TaskService = New-Object -ComObject Schedule.Service
    $TaskService.Connect($server,$user,$domain,$password)
    $NewTask = $TaskService.NewTask(0)
    $Action = $NewTask.Actions.Create(0)
    $Action.Path = 'cmd'
    $Action.Arguments = '/c cscript.exe .\slmgr.vbs /<new IP Address>'
    $Action.WorkingDirectory = "%WINDIR%\System32"
    

    您需要配置 $Settings、$Triggers 和 $Principal 的属性,但这些更简单。

    【讨论】: