一份 macOS / iOS 远程使用 Windows 操作系统的笔记
Matrix 首页推荐
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
作为 MacBook 十年老用户,让我换 Windows 电脑是很难的。但我有时又确实需要 Windows 软件,这种时候常常就需要用到虚拟机或模拟器。目前,虚拟 Windows 操作系统的应用程序,我用过付费的 Parallels Desktop 和免费版的 UTM;直接运行 Windows 软件而无需安装操作系统的,我用过付费的 CrossOver 和免费的 Whisky。有时不能用,有时不好用,费的心思很多,实际效果有限,且每年都得重新付费以获得更新。每次运行新软件,最难受的地方莫过于在几个软件中来回切换尝试,控制变量找问题,更新也未必总是解决问题,而可能是创造新的困难。
最近买了一台迷你主机,决定彻底解决这个问题,方法也很直观——用 MacBook 远程访问放在家里的 Windows 11 操作系统主机即可。一番折腾之后,实际效果不错。现在,我不论在家或在外,只要有网,就可以远程打开家里的电脑主机,用更为熟悉的 MacBook 键盘、触控板和屏幕远程使用 Windows 操作系统。
一个额外的惊喜是,在 iPad 上打开相同的远程控制软件时,我的 iPad 变成了 Windows 平板,可以触屏,可以使用 Apple Pencil,利用 Mac 和 iPad 的通用控制,还可以使用 Mac 的键鼠和触控板。
写这篇文章,一方面是记录实现的过程,以便于我在未来搬家 / 换路由器 / 换网时能够回忆起这番操作;另一方面,也分享一下方法,给有兴趣采用同样方案使用 Mac 和 Windows 的读者一点参考,了解其实现的复杂度,以及实现后仍然存在的缺憾。
本文分享的经验对以下读者可能有帮助:
需要说明的是,我并非专业人士,以下过程纯粹是摸索而来。同时,这篇文章不会特别详细地介绍每一步的实现,而是更像一个步骤清单。对于类似我这样纯粹的外行来说,可能会一次性看到不少陌生名词。这么做的原因在于,一方面,本文所写的内容,基本上都可以在互联网上找到大量教程,只是未必有这么集中,没有必要在这篇文章中再复述一遍,对于不理解的名词或不了解具体操作,可以通过文章里的关键词来检索;另一方面,实现的路径上可选的方案众多,每个人所处的网络环境和路由器也有所不同,具体的操作步骤可能因实际环境而异,也就没有必要在一篇文章里写尽。
不过,我会尽量列出我在摸索过程中看到的各种方法,哪怕是我没有实际尝试采用的那些。
综合来看,实现远程桌面需要完成以下四步:
而为了实现以上全部目标,可能至少需要以下硬件设施:
此外,可能会额外需要:
在实现目标的过程中,可能会用到以下软件 / 应用:
为什么要在局域网内访问远程桌面?
除了这是进行下面的步骤的前置和测试以外,在局域网内访问远程桌面或许也是不少人的需求——比如,像我这样桌面空间不大,不愿意再展开一组屏幕键盘鼠标的人,可以用一台电脑使用两种操作系统,加上 iPad,选择就丰富至 3 个操作系统共享一套操控和 2 块屏幕(笔记本 + 平板);比如,在家或单位想要将 Mac 或 iPad 作为 Windows 的扩展屏;再比如,想要躺在床上拿着 iPad 假装是 Windows 平板,偶尔运行一些负担较小的独立游戏或老游戏……
不过,以防你在没有看到最后一节就抱有过高期待地上手,需要提前说明的是,这种做法有性能损耗,特别是对显示要求较高的应用程序,效果上可能比主机差很多,因此远程桌面的效果,可能不如无线投屏。
以下正式开始:
一、首先需要在主机端打开远程桌面服务。对于 Windows 10 / 11 专业版 / 企业版的主机,打开设置-系统-远程桌面即可。对于家庭版用户以及其他的一些本身无法打开「远程桌面」的系统版本,有一些方法可以让你「解锁」这个功能,这种做法是否违反用户协议可见此讨论。
当然,一些其他的远程桌面软件并不依赖微软的远程桌面协议(RDP),那么也就不需要开启远程桌面的服务。
二、在 macOS 上下载 Microsoft Remote Desktop(MRD)客户端,在 app Store 下载 IOS 上同样可以下载到 Microsoft Remote Desktop 客户端(RD Client)。
三、令 Windows 主机和安装有 MRD 客户端的 Mac / IOS 设备处于同一局域网内,在 Windows 系统中找到「网络与 Internet 设置」,或打开路由器设置页面,或其他网络工具,查看该 Windows 主机的 IP 地址(大概率是形如 192.168.x.x 的内网地址)。
四、打开 MRD 客户端,添加桌面,在 PC name 位置填入上面的 IP 地址,在 User account 填写 Windows 用户的账户密码。如果主机没有设置用户登录密码(空白密码),那么可能需要在设置-账户-登录选项-密码的位置设置一个密码。或者在本地安全策略(secpol.msc)-本地策略-安全选项中禁用「使用空密码的本地账户只允许进行控制台登录」。考虑到将来的外网登录,我理解还是设置一个密码为好。
五、双击点开添加的桌面,可能会弹出证书验证,选择 Show Certificate,勾选 Always trust… 那一行字,之后点击 Continue 即可。
六、如果顺利进入 Windows 系统,那么这一步就完成了。可以右键点击该桌面选择编辑,进一步设置显示方案、共享文件夹等。其中,勾选 Optimize for Retina displays 可以在很大程度上提升在 Mac 上的显示效果,值得一试,但有可能会影响性能。
七、利用其他软件也可以实现远程桌面,这可能需要在主机端和客户端同时打开软件,登录同一个账号,或使用「投屏码」等。有些软件可能需要收费,就目前我体验的其他免费软件来看,使用效果均不如 MRD。
此外,部分实现远程桌面的软件,强制要求主机连接有显示器,如果没有显示器或不想在使用远程桌面时打开 Windows 的显示器,可以用一个便宜的显卡欺骗器或者坏掉的显示器来替代,笔记本则可以打开盖上不熄屏的模式。
仅在局域网内使用毕竟不够「远程」,因此,接下来的目标是在外网访问 Windows 远程桌面。从这一节开始,路由器将成为折腾的重心,虽然最终实际的操作步骤不多,但要找到一条最适合自己的路径仍然需要一定的尝试。此外,本节开始涉及的公网访问等事项,是否存在以及存在多大风险,请自行判断。
从刚才的步骤可以看出,用 MRD 访问远程桌面使用的是 Windows 主机的 IP 地址,这个逻辑也适用于在外网远程访问桌面。不过,刚才我们查看到的地址,是一个形如「192.168.x.x」的内网 IP 地址,离开了局域网,就不可能根据这个地址定位到这台主机。因此,接下来一系列操作的最终目标,其实就是获得一个能够在外网定位到这台主机的地址。以下具体说明:
首先,最好的情况是有一个公网 IP。有公网 IP,才能够在外网与家里的主机通信。并不是所有的家庭都有公网 IP,网上可以找到很多判断家里是否公网 IP 的方法。其中最简单的是在浏览器搜索本机 IP(注意搜索时不要使用代理),将看到的结果与登录路由器设置页面查看到的 WAN IP 对比,二者一致意味着有公网 IP。需要注意的是,如果你家里同时有光猫和路由器,需要分别登录二者的路由器设置界面看。进入路由器设置页面的地址、账号和密码一般就贴在路由器上。
如果你没有公网 IP,那么就需要向运营商申请,具体方式可以上网搜索。如果你无法申请到公网 IP,那么可能就只能搜索「内网穿透」,通过其他方式来实现在没有公网 IP 的情况下,从外网访问家里的一个主机。但这有可能需要额外租用服务器,产生费用。
在有公网 IP 的前提下,下面我先介绍我自己的具体方案,后面再列举我了解到的其他方案:
在有公网 IP 的前提下,实现「获得一个能够在外网定位到 Windows 主机的地址」这一目的,显然不只有我上面的操作方法,同样是光猫(路由模式)-路由器的情况下,至少还有如下路径:
如果你尝试了上面的局域网访问和远程访问 Windows 主机,你应该已经发现了一个问题,那就是当主机处于关机或睡眠状态时,远程桌面是无法正常打开的。对此,有两个选择,第一,让主机 24*7 开机,但这不苹(huan)果(bao),可能对于一些其他的需求,比如搭建服务器是适用的;第二,想办法远程打开计算机,也就是实现远程唤醒 Wake-on-LAN(WoL)。
在这一节中,有一些需要被访问主机的 BIOS 和路由器支持才能够实现的功能,也因为各家主板和路由器不同,这部分无法特别细致地说明。
首先先列出我完全未尝试的方案,倒不是因为不好用,只是因为需要额外付费,目前我已经通过其他方式基本解决,就没有进一步探索:
下面是我自己的实现方法,其中的一些准备工作可能与上面的其他方式有重合,这些准备工作包括:
虽然说是准备工作,但到上面位置已经能够实现远程唤醒了,只是我还不满意。原因是不管是 app 还是路由器设置页面的连接速度都很慢,需要等待路由器信息全部加载,并且唤醒功能藏得比较深,需要好几步操作,增加了唤醒的复杂度。因此,我想要用别的方式来唤醒。经历了前面这么多步骤,不难将两个事情联系到一起:其一,我可以从外网通过注册的 DDNS 服务域名 + 端口的方式与家里的主机通信;其二,要网路唤醒只需要向目标主机发送名为「幻数据包」的东西。从而,进一步地:
arp -s IP MAC地址
来绑定,但这个绑定会在路由器重启后失效,要么每次重新输入,要么想办法设置路由器开机启动这个脚本。这部分内容因路由器而异,可能需要刷固件等,请自行检索。import socket
IP = 't.a.com' #此处填写公网 IP 或注册的 DDNS 服务域名
MAC = 'AA-AA-AA-AA-AA-AA' #此处填写 MAC 主机地址
PORT = 3999 #此处填写前面设置的端口转发外部端口
packet = bytes.fromhex("F" * 12 + MAC.replace(MAC[2], "") * 16)
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.sendto(packet, (IP, PORT))
Run Shell Script:
# 这里将 socket 解析得到的 IP 地址传入到下一步去作为默认答案,以便于对比发现无法唤醒是否是地址解析问题。
import socket
de_ip = socket.gethostbyname('t.a.com') #此处填写公网 IP 或注册的 DDNS 服务域名
print(de_ip)
Ask for Text:
输入实际 IP 地址:
$1
Run Shell Script:
import sys
import socket
IP = sys.argv[1]
MAC = 'AA-AA-AA-AA-AA-AA' #此处填写 MAC 主机地址
PORT = 3999 #此处填写前面设置的端口转发外部端口
packet = bytes.fromhex("F" * 12 + MAC.replace(MAC[2], "") * 16)
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.sendto(packet, (IP, PORT))
到这一步为止,远程唤醒和远程访问均已实现,并且基本可以通过少量点击打开,速度上部分取决于 Windows 主机开机 / 唤醒速度和网速,已经相当可用。不过,实际使用中还是会遇到一些问题,优化永远在路上,这里简单写两点,一是显示方面的性能优化,二是快捷键。
MRD 使用 RDP 协议,运行时会虚拟一张名为 Microsoft Remote Display Adapter 的显卡,影响图形性能。网上很容易找到有关 RDP 优化的文章,具体效果请自行判断,我测试起来是有一些作用的:
其次是快捷键,作为十年 MacBook 老用户,我早已习惯使用 macOS 系统快捷键,特别是大拇指位置的 Command 键的组合按键。在 MRD 下,微软还是比较贴心地提供了一些快捷键的,包括复制、剪切、粘贴、全选、撤销和搜索,但仍不够全。比如,我习惯于使用 Command + W 这个组合来关闭窗口 / 标签页,这在 MRD 下会直接关闭当前的远程桌面窗口,非常烦人,急需解决。总体来说,解决快捷键问题分为两步:
shell:startup
即可打开)以开机自行启动。; Commad + w -> Ctrl + w
#w::
Send, ^w
return
; Commad + s -> Ctrl + s
#s::
Send, ^s
return
; 仅在使用资源管理器时
; Commad + ↑ -> Alt + ↑
#IfWinActive ahk_class ExploreWClass
#Up::
#IfWinActive ahk_class CabinetWClass
#Up::
Send, !{Up}
return
; 仅在使用资源管理器时
; Commad + ↓ -> Enter
#IfWinActive ahk_class ExploreWClass
#Down::
#IfWinActive ahk_class CabinetWClass
#Down::
Send, {Enter}
return
通过远程桌面运行的,是完整的 Windows 系统,这是任何虚拟机和模拟器不能比拟的,但也说不上完美,至少在以下几个方面仍有缺憾:
尽管如此,我至少找到了一个在不用放弃 MacBook 的基础上,能够正常运行、调试各种 Windows 应用程序方案,给我在家和在外的系统多了一个选择。折腾还是有收获的。
> 关注 少数派公众号,解锁全新阅读体验 📰
> 实用、好用的 正版软件,少数派为你呈现 🚀
© 本文著作权归作者所有,并授权少数派独家使用,未经少数派许可,不得转载使用。