Win10 小主机散热救星:远程桌面自动切换节能模式

适用场景:散热不佳的 Win10 迷你主机 / 低功耗服务器 / 长期挂机设备
主要目的:有人用时性能全开,无人用时自动节能降温

一、需求背景
在家庭或小型办公环境中,使用 Windows 10 迷你主机(如 N100)作为轻量服务器时,常面临以下矛盾:
  • ❗ 散热瓶颈:被动散热或风扇较小,高负载下积热严重。
  • ❗ 资源浪费:大部分时间处于空闲状态,无需高性能模式。
  • ❗ 会话残留:远程断开后,会话未注销导致后台程序持续占用资源。

但这类设备通常存在:

  • ❗ 散热较差
  • ❗ 长时间运行发热明显
  • ❗ 大多数时间处于空闲状态

🎯 优化目标
  1. 智能切换电源:RDP 登录瞬间切至【平衡模式】,断开延迟后自动切至【节能模式】。
  2. 自动清理会话:远程断开超过 1 小时,强制断开会话,释放资源或切至【节能模式】。
场景 行为
通过 RDP 登录 自动切换为【平衡模式】,断开10分钟后自动切至【节能模式】
自动清理会话 远程RDP断开超过 1 小时,强制断开会话,切至【节能模式】

 

 二、实现思路

采用 “事件触发 + 定时轮询 + 组策略限制” 三位一体方案:

机制 作用 响应速度
事件触发 监听 RDP 登录事件 (Event ID 1149),立即切换电源模式 ⚡ 秒级响应
定时轮询 每5分钟检测会话状态,若断开超过设定时间(如10分钟),切换为节能模式 ⏱ 延迟执行
组策略 限制非活动会话时长,防止“假断开”导致的资源占用 🛡️ 系统级兜底

 

 三、核心脚本
1. 定时检测脚本

路径:

# 作用:每5分钟运行,检测是否有人连接。若断开超过 10 分钟,切换到“节能模式”。
C:\Scripts\power_auto.bat
将第5行  Administrator 修改成自己的实际用户名
@echo off
setlocal enabledelayedexpansion

:: ===== CONFIG =====
set USERNAME_TARGET=Administrator
set BALANCED=381b4222-f694-41f0-9685-ff5bb260df2e
set SAVER=a1841308-3541-4fab-bc81-f71556f20b4a
set TIMEOUT_MIN=10

set STATE_FILE=C:\Scripts\last_active.txt
set LOG_FILE=C:\Scripts\power.log

:: ===== TIME =====
for /f %%a in ('powershell -command "[int][double]::Parse((Get-Date -UFormat %%s))"') do set NOW=%%a

:: ===== CHECK RDP =====
set ACTIVE=0

for /f "skip=1 tokens=1,2,3,4" %%a in ('query session') do (
    echo %%a %%b %%c %%d | findstr /i "rdp-tcp" >nul
    if not errorlevel 1 (
        echo %%a %%b %%c %%d | findstr /i "%USERNAME_TARGET%" >nul
        if not errorlevel 1 (
            set ACTIVE=1
        )
    )
)

:: ===== CURRENT MODE =====
for /f "tokens=3" %%i in ('powercfg /getactivescheme') do set CURRENT=%%i

:: ===== ACTIVE → BALANCED =====
if "!ACTIVE!"=="1" (
    echo %NOW% > "%STATE_FILE%"

    if /i not "!CURRENT!"=="%BALANCED%" (
        powercfg /setactive %BALANCED%
        echo [%date% %time%] ACTIVE -> BALANCED >> "%LOG_FILE%"
    )
    exit /b 0
)

:: ===== IDLE CHECK =====
if not exist "%STATE_FILE%" (
    echo %NOW% > "%STATE_FILE%"
    exit /b 0
)

set /p LAST=<"%STATE_FILE%"
set /a DIFF=(NOW-LAST)/60

if %DIFF% GEQ %TIMEOUT_MIN% (
    if /i not "!CURRENT!"=="%SAVER%" (
        powercfg /setactive %SAVER%
        echo [%date% %time%] IDLE %TIMEOUT_MIN% min -> POWER SAVER >> "%LOG_FILE%"
    )
)

exit /b 0
 2. 登录触发脚本

路径:

# 作用:检测到远程登录时,立即切换到“平衡模式”。
C:\Scripts\power_on_login.bat
@echo off
powercfg /setactive 381b4222-f694-41f0-9685-ff5bb260df2e
echo [%date% %time%] RDP LOGIN -> BALANCED >> C:\Scripts\power.log

四、任务计划配置
 1. 创建脚本目录
mkdir C:\Scripts
 2. 定时任务(每5分钟执行)
schtasks /create ^
/tn "PowerAutoCheck" ^
/tr "C:\Scripts\power_auto.bat" ^
/sc minute /mo 5 ^
/ru SYSTEM ^
/f
 3. RDP 登录触发任务
schtasks /create ^
/tn "PowerOnRDPLogin" ^
/tr "C:\Scripts\power_on_login.bat" ^
/sc onevent ^
/ec Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational ^
/mo "*[System[(EventID=1149)]]" ^
/ru SYSTEM ^
/f
⚠️ 如果事件不生效,执行:
wevtutil sl Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational /e:true

 4. RDP 配置组策略(会话超时限制)
目的:防止用户连接后长时间不操作(挂机),导致系统无法进入深度节能状态。

依次展开,路径:

本地组策略编辑器
→ 计算机配置
  → 管理模板
    → Windows 组件
      → 远程桌面服务
        → 远程桌面会话主机
          → 会话时间限制
“设置活动的远程桌面服务会话的时间限制”,选择 “已启用”,选择 “1 小时”

💡 实际运行逻辑
  1. 空闲检测:无论 RDP 是否连接,只要检测到用户 1 小时内无任何操作(鼠标/键盘),系统将强制断开桌面连接
  2. 会话保留:此时仅断开图形界面,用户会话并未注销,后台程序继续运行(内存仍被占用)。
  3. 脚本接力
    • 断开5分钟后, power_auto.bat 脚本会检测到“无活动会话”。
    • 脚本开始计时,10 分钟后(若仍未重连),自动将电源计划切换为 【节能模式】
五、运行效果与验证
🔍 验证方法
  1. 查看当前电源模式
    在 CMD 中输入 powercfg /getactivescheme,确认当前是“平衡”还是“节能”。
  2. 查看会话状态
    输入 query session,观察断开后的会话是否在 1 小时后消失。
  3. 查看日志记录
    打开 C:\Scripts\power.log,应看到类似记录:

 

🟢 预期行为
  • 登录时:几乎无感,系统瞬间恢复平衡模式,保证操作流畅。
  • 断开后
    • 5 分钟内:保持平衡模式(防止短暂断开频繁切换)。
    • 5 分钟后:自动切换至节能模式,降低功耗和发热。
    • 1 小时后:组策略介入,强制断开会话,清理后台。
🎯 一句话总结

👉 “有人用就全力跑,没人用就自动降功耗”

附件列表