windows server 无内置按工作时间启停服务功能,需用任务计划程序配合powershell脚本实现:先查准服务name,再编写含状态判断的启停脚本,以system权限创建定时任务,并避开关键系统服务。
windows server 中没有内置的“按工作时间自动启停服务”功能,但可以通过任务计划程序 + powershell 或批处理脚本组合实现精准控制。核心思路是:用计划任务在指定时间触发脚本,执行 net stop 或 sc stop(停止)以及 net start 或 sc start(启动)命令。
确认目标服务名称和状态
服务的实际名称(非显示名称)必须准确,否则命令会失败。例如,“Windows Update”对应的服务名是 wuauserv,“SQL Server (MSSQLSERVER)”对应的是 MSSQLSERVER。
- 打开命令提示符(管理员),运行:
sc queryex type= service state= all | findstr "SERVICE_NAME\|DISPLAY_NAME"
或使用 PowerShell:Get-Service | Select-Object Name,DisplayName,Status - 记下目标服务的 Name(如
W32Time、Spooler) - 建议先手动测试启停命令是否有效,例如:
net stop W32Time和net start W32Time
编写启停脚本(推荐 PowerShell)
PowerShell 脚本更稳定、可加判断逻辑,避免重复操作或报错。保存为 Stop-MyService.ps1 和 Start-MyService.ps1:
-
停止脚本示例:
$svc = Get-Service -Name "W32Time" -ErrorAction SilentlyContinue<br>if ($svc -and $svc.Status -eq "Running") {<br> $svc.Stop()<br> Write-Host "已停止服务: $($svc.Name)"<br>} -
启动脚本示例:
$svc = Get-Service -Name "W32Time" -ErrorAction SilentlyContinue<br>if ($svc -and $svc.Status -ne "Running") {<br> $svc.Start()<br> Write-Host "已启动服务: $($svc.Name)"<br>} - 注意:首次运行需解除 PowerShell 执行策略限制(管理员运行):
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
创建定时计划任务
使用“任务计划程序”图形界面或 schtasks 命令配置,确保以 SYSTEM 或具有服务控制权限的账户运行(推荐 SYSTEM):
- 打开任务计划程序 → 创建基本任务 → 设置触发器(如每天 18:00)→ 操作选择“启动程序”
- 程序/脚本填:
powershell.exe
参数填:-ExecutionPolicy Bypass -File "C:\Scripts\Stop-MyService.ps1"
起始于填:C:\Scripts\ - 在“常规”选项卡中勾选:“使用最高权限运行”** 和 **“不管用户是否登录都要运行”**(后者需配置“无密码”或使用“仅当用户登录时运行”,取决于需求)
- 如需非工作日(如周末)也生效,可在触发器中设置“每周”,并勾选周六、周日
注意事项与安全提醒
不是所有服务都适合随意启停,错误操作可能导致系统功能异常或身份验证失败:
-
避免关闭关键系统服务:如
LSASS、SamSs、Netlogon、W32Time(域环境时间同步依赖它)、DNS、DHCP等。禁用前务必确认其作用 -
SQL Server 类服务需考虑依赖关系:例如停止
MSSQLSERVER前,应先停止SQLSERVERAGENT;启动时顺序相反 -
日志与验证很重要:脚本中可加入
Out-File记录操作时间与结果;也可用Get-Service输出状态到日志,便于排错 - 若服务被配置为“自动(延迟启动)”,计划任务启动后可能短暂延迟生效,属正常现象











