PowerShell创建计划任务无法重启Tssdis服务问题排查
计划任务无法触发Tssdis服务重启的问题排查与解决
问题分析
你在虚拟机上创建的计划任务注册成功,但停止Tssdis服务后未触发重启,核心问题集中在命令语法错误、触发器配置不完整、用户身份格式不正确这三点。
解决方案
1. 修正计划任务的命令语法
原命令中双引号嵌套导致PowerShell解析失败,需调整引号使用方式,同时建议添加-NoProfile避免加载用户配置文件干扰执行:
# 正确的Action写法(转义内部双引号) $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -Command ""Get-Service -Name 'Tssdis' | Where-Object {`$_.Status -eq 'Stopped'} | Restart-Service""" # 或者用Here-String更易读 $command = @" Get-Service -Name 'Tssdis' | Where-Object `$_.Status -eq 'Stopped' | Restart-Service "@ $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -Command $command"
2. 完善触发器配置
原触发器未设置重复持续时长,导致任务仅执行一次后停止。需添加无限重复的配置:
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) ` -RepetitionInterval (New-TimeSpan -Minutes 3) ` -RepetitionDuration ([TimeSpan]::MaxValue) # 设置为无限重复
3. 修正用户身份格式
- 本地管理员:需使用
.admin格式,而非直接写admin - 域用户:使用
DOMAIN\admin格式,查看当前机器所属域名可执行:# 方法1:查看机器域名 Get-WmiObject Win32_ComputerSystem | Select-Object -ExpandProperty Domain # 方法2:查看当前用户的域/本地标识 whoami - 使用
NT AUTHORITY\SYSTEM身份时,默认有权限重启服务,若仍失败,可检查Tssdis服务的安全设置:
打开服务管理器 → 找到Tssdis服务 → 右键「属性」→「安全」标签,确认SYSTEM账户拥有「启动、停止和暂停」权限。
4. 调试排查技巧
- 添加执行日志:修改命令记录执行情况,方便定位问题:
$command = @" Get-Service -Name 'Tssdis' | Where-Object `$_.Status -eq 'Stopped' | ForEach-Object { Restart-Service `$_ Write-Output "$(Get-Date): 重启Tssdis服务成功" >> C:\tssdis_restart.log } "@ - 查看任务历史:打开「任务计划程序」,找到
tssdis-restart任务,查看「历史记录」选项卡,检查是否有执行错误(如权限不足、命令语法错误)。 - 手动测试任务:右键任务选择「运行」,立即触发执行,观察服务是否重启,同时查看日志确认执行结果。
完整修正代码
# 创建触发器(无限重复,每3分钟执行一次) $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) ` -RepetitionInterval (New-TimeSpan -Minutes 3) ` -RepetitionDuration ([TimeSpan]::MaxValue) # 创建执行动作(带日志输出) $command = @" Get-Service -Name 'Tssdis' | Where-Object `$_.Status -eq 'Stopped' | ForEach-Object { Restart-Service `$_ Write-Output "$(Get-Date): 重启Tssdis服务成功" >> C:\tssdis_restart.log } "@ $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -Command $command" # 注册任务(使用本地管理员身份) $taskParams = @{ Action = $action Trigger = $trigger User = ".\admin" TaskName = 'tssdis-restart' Description = 'Respawn tssdis process in event of failure' RunLevel = 'Highest' } Register-ScheduledTask @taskParams -Force # 添加-Force覆盖原有任务 # 验证任务是否注册成功 Get-ScheduledTask | Where-Object {$_.TaskPath -eq "\\" -and $_.TaskName -eq 'tssdis-restart'}
内容的提问来源于stack exchange,提问作者houba
相关产品推荐
相关产品推荐

