关于通过PowerShell脚本实现服务器定时自动重启的技术咨询
关于通过PowerShell脚本实现服务器定时自动重启的技术咨询
嘿,我来帮你搞定这个每隔周六晚上11点自动重启服务器的需求!既然SCHTasks不被客户接受,用PowerShell脚本创建计划任务是完美的替代方案,而且完全可以通过你的RMM工具推送部署。下面是具体的实现步骤和脚本示例:
核心思路
我们会用PowerShell的ScheduledTask模块(Windows 8/Server 2012及以上系统默认支持)来创建一个具备以下特性的计划任务:
- 触发条件:每隔一周的周六23:00
- 执行操作:重启服务器
- 运行权限:必须以管理员权限执行(重启服务器需要高权限)
完整PowerShell脚本示例
# 1. 定义任务触发规则:每隔一周的周六晚上11点 $trigger = New-ScheduledTaskTrigger -Weekly ` -DaysOfWeek Saturday ` -WeeksInterval 2 ` -At "23:00" # 2. 定义任务执行的操作:重启服务器(这里用Restart-Computer,也可以用shutdown.exe /r /t 0) $action = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-Command ""Restart-Computer -Force""" # 3. 设置任务的运行权限和配置:最高权限运行,不管用户是否登录 $settings = New-ScheduledTaskSettingsSet -RunOnlyIfNetworkAvailable $false ` -AllowStartIfOnBatteries $true ` -DontStopIfGoingOnBatteries $true ` -StartWhenAvailable $true $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" ` -LogonType ServiceAccount ` -RunLevel Highest # 4. 注册计划任务(任务名称可以自定义) Register-ScheduledTask -TaskName "BiWeeklyServerReboot" ` -Trigger $trigger ` -Action $action ` -Principal $principal ` -Settings $settings ` -Description "Automatically reboots the server every other Saturday at 11 PM"
关键细节说明
- 触发规则:
-WeeksInterval 2确保任务每隔一周执行,-DaysOfWeek Saturday指定周六,-At "23:00"是晚上11点。 - 执行操作:用
Restart-Computer -Force可以强制重启(即使有未保存的进程),如果需要温和一点可以去掉-Force,但服务器重启通常需要强制确保完成。 - 权限设置:用
SYSTEM账户运行任务,并且设置-RunLevel Highest,保证任务拥有足够权限执行重启操作,而且不受用户登录状态影响。 - 任务配置:
-AllowStartIfOnBatteries是针对可能的笔记本/移动服务器,如果你是固定机架服务器,可以设为$false。
测试与部署注意事项
- 测试脚本:在目标服务器上以管理员身份运行脚本,然后打开「任务计划程序」,找到名为
BiWeeklyServerReboot的任务,检查触发条件和操作是否正确,也可以右键选择「运行」来测试重启功能(注意保存所有工作!)。 - RMM推送:确保你的RMM工具推送脚本时是以管理员权限执行的,因为注册计划任务需要管理员权限。
替代方案(如果客户连计划任务都不想用?)
如果客户有特殊要求不想用计划任务,也可以写一个长驻的PowerShell脚本(用Start-Sleep循环检查时间),但这种方案不如计划任务可靠,因为脚本一旦意外终止就会失效,所以优先推荐计划任务的方式。
备注:内容来源于stack exchange,提问作者Ankur Srivastava




