在Windows下利用WoL实现多台电脑“联动”开机

折腾笔记

Posted by Pockies on May 10, 2019

人总会有些奇葩需求。

比如不是每个人都愿意让NAS/服务器 7*24小时工作,更多时候他们只需要在标准工作时间内访问服务端内容。

解决方案多种多样,比如:

  • 服务端设置计划任务定时休眠/唤醒;
  • 路由器设置计划任务定时WoL。

但最优解无疑是:

  • 客户端“电脑A”启动时,服务端“电脑B”也跟着自动开机。

绝不白给一丝电费。

于是就开始了折腾。

启用网络唤醒(WoL)

网络唤醒(WoL/Wake-on-LAN)是绝大多数主板都会自带的功能。

强大,便利,异常实用,不花一分钱,诸如“远程开机”“手机遥控开机”等一系列骚操作都离不开WoL。

哪怕你暂时用不上,也强烈推荐开启。

因为这是迟早会用,且用过一次就再也回不去的功能。

配置BIOS

既然是集成在主板上的,第一步自然得进BIOS启用这项功能。

相关设置一般包含“PME” / “Wake on Lan” / “WoL”等字眼,如果找不到,请阅读主板说明书或者直接Google。

例如我这块垃圾主板藏在“高级电源管理”里,名字叫做“PME唤醒”。

配置网卡驱动

Win+R 打开“运行”,输入 devmgmt.msc,“确定”以打开“设备管理器”:

展开“设备管理器”的“网络适配器”,找到网卡驱动,右键“属性”。

在“高级”里将“魔术封包唤醒”与“关机 网络唤醒”设置为开启:

将“网络唤醒和关机链接速度”调整为“不降速”:

同时在“电源管理”里勾选“允许此设备唤醒计算机”:

网络唤醒启用完毕。

这时给手机装个Wake On Lan之类的App,扫描并添加你已经开启WoL的PC,只需掏出手机轻轻一点,就能在局域网内遥控开机了。

配置“联动”开机

原本还在傻缺的折腾计划任务,结果发现有更简单粗暴的姿势:

给“电脑A”安装WOL.EXE

与上文提到的手机AppWake On Lan一样,WOL.EXE也是一款网络唤醒软件,不过它完全基于命令行。

其内容物只有一个193kb的“wol.exe”,直接把它扔到C:\Windows里便完成了“安装”。

要是不嫌麻烦,也可以自定义“安装”位置:

Win+Pause打开“系统属性”,进入“高级系统设置”。

点击“环境变量”,选中“系统变量”里的“Path”并“编辑”,在弹出对话框里点击“新建”,填入存放“wol.exe”的目录即可。(右键查看大图)

例如我放在了C:\Software\Internet\wol

这时你也差不多看明白了,为什么把“wol.exe”直接扔进C:\Windows同样等于安装完毕,因为C:\Windows已经默认存在于Path里。

打开CMD,输入wol,返回wol.exe版本信息,安装成功。

获取“电脑B”的MAC地址

WOL.EXE的命令很简单,cmd输入wol 目标电脑的mac地址即可网络唤醒。

引用官网示例:

wol 5c9d32b5f287
wol 5c-9d-32-b5-f2-87 192.168.0.1
wol 5C:9D:32:B5:F2:87 192.168.0.1 16962
wol 5C.9D.32.B5.F2.87 9
以上四种命令姿势皆可

于是我们至少需要搞到“电脑B”的mac地址:

在已启用网络唤醒的“电脑B”上打开CMD,输入ipconfig /all,返回内容里的Physical Address/物理地址就是mac地址了。

记下即可。

简单的写个批处理

我们已经给“电脑A”装上了wol.exe,也拿到了“电脑B”的mac地址;

意味着现在只需在“电脑A”上输入一条命令,便能网络唤醒“电脑B”

——然而总不能每次都手输命令不是?

在“电脑A”上新建一个文本文档,填入以下内容:

@echo off
wol 电脑B的mac地址

例如:

@echo off
wol 5c-9d-32-b5-f2-87

保存并将文本文档重命名为wol.bat

只需双击运行这个批处理就能启动“电脑B”了。

优雅的写个启动脚本

要知道我们的最终目标可是:

  • 客户端“电脑A”启动时,服务端“电脑B”跟着自动开机。

——结果现在每次都得双击运行一次批处理,批处理还会闪个弹窗,多麻烦!

让我们继续在“电脑A”上新建一个文本文档,填入以下内容:

Set ws = CreateObject("Wscript.Shell") 
   ws.run "cmd /c wol.bat的存放位置",vbhide

例如:

Set ws = CreateObject("Wscript.Shell") 
   ws.run "cmd /c C:\Software\Internet\wol\wol.bat",vbhide

保存并将文本文档重命名为wol.vbs

然后将它移动到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

每次“电脑A”开机都会启动这个脚本,脚本又会在不弹出任何窗口的情况下自动运行批处理,“电脑B”也就跟着自动开机了。

至此,我们已经优雅的实现了“联动开机”。

尾巴

本想着顺便配置一下“联动关机”。

在“电脑B”上打开“组策略编辑器”,按图找到“从远端系统强制关机”,双击并添加你的登录用户。

接着在电脑A写个批处理:

@echo off
net use \\电脑B的IP\ipc$ "电脑B密码"/user:"电脑B用户名"
shutdown -s -m \\电脑B的IP -t 60

双击运行就能远程关机。

——然而趴在地上想了想

同步关机反而会引发麻烦,万一电脑A更新个Bug10之类需要重启,那电脑B岂不得跟着开关机一轮……

万一在电脑B的开关机过程中,遇到正在访问电脑B内容的其它用户,画面不要太美……

作罢。

同步开机就够了,关机还是乖乖定时,交给计划任务吧……