我的 Windows 10 2004 新增 Bug 解决办法记录

虚拟化相关

大量端口被无端保留,50000 以上高位端口无法分配

这是 Hyper-V 导致的,可以卸载 Hyper-V 平台解决它。

具体参考:

系统为每个网卡都创建一个 vEthernet 虚拟网卡

这是 Hyper-V 平台导致的,只要装了 Hyper-V 平台就会这样,暂时没找到关闭办法。

先卸载 Hyper-V 平台、沙盒、容器、虚拟机平台、虚拟机监控程序平台。

如果之后需要使用这些功能可以重启后再启用。

WSL 2 进入 shell 卡死

执行:wsl --shutdown 强制停止 WSL 后再试。

VMware Workstation 兼容性问题

升级最新的 15.5.5 可以兼容 Hyper-V 了。

VMware Workstation 15 频繁未响应

似乎是一个 Bug,当剪贴板有图片时进入虚拟机就会导致卡死。

关于这个,我在 VMWare 社区发了个帖子:Workstation and Player GUI freezed when host clipboard has image on Windows 10

其他软件

手心输入法字体渲染模糊

打开手心输入法的安装目录,对所有的 exe:

属性 -- 兼容性选项 -- 更改所有用户的设置 -- 更改高 DPI 设置 -- 高 DPI 缩放替代 -- 选择 “应用程序”

另外可以禁用掉手心输入法的开机启动,没有任何其他影响

网易云音乐升级成了 x86 转制版本

我保留了一份 网易云音乐 UWP 版 Appx Bundle 存档,可以在这里下载:kenvix/NeteaseMusicUWP

这个沙雕版本正好和 Windows 10 2004 同时发布,就写到一起了

OneDrive 一直在 “连接中”

如果你开启了系统代理,请排除以下地址:

mobile.pipe.aria.microsoft.com
login.windows.net

此外,如果你使用 OneDrive for Business 还需要排除掉你的 SharePoint 域名,例如 example-my.sharepoint.com

点击阅读全文 →

Ubuntu 上通过以太网分享网络连接(NAT)

Ubuntu 自带网络分享功能,但该功能很不稳定,往往断开连接后再连就无法使用了。
现在我们使用 DNSMASQ+IPTables 手动配置NAT.

禁用 systemd-resolved

Ubuntu 提供的 systemd-resolved 抢占53端口,首先禁用它。

systemctl stop systemd-resolved
systemctl disable systemd-resolved

删除不当设置

如果你之前配置过网络分享或已经用有线连接过电脑了,则需要这一步
运行 nm-connection-editor
删除所有有关你要分享的网卡的设置

安装并配置DNSMASQ

安装

apt install dnsmasq
service dnsmasq stop
nano /etc/dnsmasq.conf

编辑 /etc/dnsmasq.conf,加入下列内容:

dns-forward-max=15000
#eno1为你的要分享的网卡名
interface=eno1
dhcp-range=192.168.33.2,192.168.33.150,255.255.255.0,12h

配置域名解析

nano /etc/resolv.conf

填写你的DNS服务器,例如:

nameserver 223.5.5.5
nameserver 223.6.6.6
nameserver 114.114.114.114

启用内核IPV4转发

/etc/sysctl.conf

加入:

net.ipv4.ip_forward=1

运行:

sysctl -p

配置转发,为网卡分配初始IP

eno1为你的要分享的网卡名
enp2s0为有网的(被分享的)网卡名

ifconfig eno1 192.168.33.2
iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
iptables -A FORWARD -i eno1 -o enp2s0 -m state --state RELATED,ESTABLISHED -j ACCEPT

上述内容重启后无效,可加入 /etc/rc.local 以开机自动应用。

启动DNSMASQ

systemctl enable dnsmasq
systemctl start dnsmasq
systemctl status dnsmasq

完事!

真正实现Minecraft高级登录(外置登录)的几种方案

通常把Minecraft服务器的登录方式分为高级登录(外置登录)和内置登录。高级登录的特点是用户的登录操作在启动器完成,启动器传递token给Minecraft客户端,客户端在加入服务器时直接将token传递给服务端完成身份验证。正版Minecraft登录就是典型的外置登录。而一般的非正版服务器(online-mode=false)则是身份验证仅在用户加入游戏后通过聊天框输入密码完成认证,此时用户已经加入了游戏,仅仅靠登录插件来限制用户进行其他操作。
而内置登录往往存在下列问题:

  1. 玩家在登录前已经进入了游戏。恶意用户可以借此进行假人压测攻击服务器
  2. 由于登录操作复杂并且退出游戏后就需要重新登录,玩家往往把密码设置得较为简单,留下安全隐患
  3. 对于Mod服务器来说,登录插件无法限制Mod行为。例如NEI仍然可以正常使用而不受登录插件限制

如果想根除上述问题,就必须要改换成高级登录。

实现

倘若从零开始自己写一套外部登录系统,意味着我们需要自己写服务端插件+验证端+客户端模组+启动器,还需要考虑兼容性、跨平台等问题。显然,这项工程十分浩大并且不划算。换个思路,mojang已经实现了自己的正版登录系统,我们能否将minecraft自带的正版登录系统为己所用呢?

方案1: 用hosts劫持域名解析

操作复杂度:高

修改操作系统的hosts文件:
(1.2.3.4为你的身份验证服务器IP地址)

1.2.3.4 sessionserver.mojang.com
1.2.3.4 api.mojang.com

然后,自己签署一个具有“所有颁发策略” “所以应用程序策略”的根证书,在MC服务器和身份验证服务器两边信任这个根证书。
接着,自己签发 *.mojang.com 的SSL证书,部署到身份验证服务器,对这两个域名使用自签发证书。
最后,自己按照此文档实现一套Yggdrasil服务端。
至于启动器方面也很简单,拿一套开源的启动器的代码(如BMCL,HMCL)然后批量替换上面给出的两个域名为你的身份验证服务器的域名,然后编译即可。
(用于客户端登录的身份验证服务器必须使用正规证书机构签发的证书,如let’s encrypt,当然你要是能拿到管理员权限悄悄导入根证书就不用管这句提示了)

方案2:用javaagent在运行时动态劫持身份验证地址

操作复杂度:中高

国内有大神已经实现了这种方案,并且最新的HMCL启动器原生支持使用这种方案实现客户端的高级登录。
点击此处查看,同样需要按照此文档实现一套Yggdrasil服务端
具体使用方法可以参考Blessing Studio上的文章

比起方案1,这个方案的优点是可以略过复杂的签发证书过程,并且API地址可以随便起,自己怎么爽怎么来(比如MoeCraft这样:https://accounts.moecraft.net/?s=API/Mc/Authlib&params=/)

方案3:使用他人编写Mod+插件+启动器解决

操作复杂度:低

参见SakuraLogin 樱花登录,可惜不支持 Sponge :(

附注

上文提到的《Yggdrasil服务端技术规范》中有一点需要注意:
以“用户部分-登录”为例,文档中的“请求格式”并 不是在用JSON描述这个请求POST内容的具体格式 ,而是真的POST了一个JSON文本过来!这点很误导人。
以PHP为例,使用 $_POST 无法获得任何数据,要获得POST提交的文本,应该使用 file_get_contents('php://input') 直接读取请求的原始数据

C# 实现自定义"应用程序设置"的配置文件(user.config)存储路径

关于“应用程序设置”: 前往MSDN查看

默认提供的 SettingsProvider 不允许我们修改应用程序设置的配置文件的路径,这就导致了以下问题:

  1. 设置保存在了 %appdata% 目录下,使应用程序不够绿色化
  2. 当用户把程序拷贝到其他电脑上时,设置将丢失
  3. 当用户升级程序时,设置将丢失(自带的 Upgrade() 过于复杂)

要解决上述问题,就需要由我们自己来定义在哪里存储应用程序设置
MSDN给出的方法是:自己实现一个 SettingsProvider

点击阅读全文 →