如何在PowerShell中向SCHTASKS传递变量以远程控制打印队列?
实现带参数的打印队列暂停/恢复计划任务(避免高权限)
背景
我们需要让已认证域用户远程暂停/恢复Windows打印服务器的打印队列,但不想授予权限过高的「管理打印机」角色。当前已通过客户端计划任务实现基础功能,但计划任务中的打印服务器名和打印机名是硬编码的,需实现从客户端触发时动态传递这两个参数。
解决步骤
1. 修改计划任务以支持参数接收
打开任务计划程序,找到已创建的「Pause Printer」任务,按以下步骤修改:
- 切换到「操作」选项卡,编辑现有的PowerShell脚本操作
- 将脚本内容替换为支持参数的版本:
param( [Parameter(Mandatory=$true)] [string]$SrvName, [Parameter(Mandatory=$true)] [string]$PrName ) Invoke-Command -ComputerName $SrvName -ScriptBlock {(Get-WmiObject Win32_Printer -Filter "Name='$using:PrName'").Pause()}
- 在「添加参数(可选)」输入框中填写
$(Arg0) $(Arg1),让计划任务能够接收外部传入的两个参数(分别对应服务器名和打印机名)
2. 客户端触发命令传递参数
在客户端执行以下命令,动态传递打印服务器名和打印机名到计划任务:
# 定义目标参数 $targetServer = "PrintSrv01" $targetPrinter = "OfficeMainPrinter" # 触发计划任务并传入参数 Start-Process -FilePath "schtasks" -ArgumentList "/run /TN:`"Pause Printer`" /TR `"powershell.exe -Command ""param(`$SrvName,`$PrName); Invoke-Command -ComputerName `$SrvName -ScriptBlock {(Get-WmiObject Win32_Printer -Filter 'Name=`'`$using:PrName`'').Pause()}"" $targetServer $targetPrinter`"" -Wait -PassThru
注:WS2016环境下需确保计划任务权限设置正确,允许已认证用户查看并执行该任务。
3. 扩展实现恢复打印队列功能
如果需要恢复队列,可创建「Resume Printer」计划任务,脚本替换为:
param( [Parameter(Mandatory=$true)] [string]$SrvName, [Parameter(Mandatory=$true)] [string]$PrName ) Invoke-Command -ComputerName $SrvName -ScriptBlock {(Get-WmiObject Win32_Printer -Filter "Name='$using:PrName'").Resume()}
触发命令只需将计划任务名称改为「Resume Printer」即可。
内容的提问来源于stack exchange,提问作者MMAX
相关产品推荐
相关产品推荐

