Sunshine 的权限提升实现的坑

0   2812 转为繁体

Sunshine 在进行权限提升操作时,会用WTSGetActiveConsoleSessionId来获取当前的活动会话,找到活动会话中的实际用户,再从这个用户来提升权限。

但是当前会话是RDP时,Windows会分配一个nobody用户,然后给WTSGetActiveConsoleSessionId里返回0。从而后面获取不到用户的token。

在这个贴子中,有人提到了遍历所有的会话,过滤掉不活动的和获取不到token的会话,从而一找到个实际登录的用户。

有了这个修复之后,只要使用物理显示器登录一次,或者用Sunshine 中的 Desktop 程序登录之后,实际串流即可找到正确的用户来提升权限。

我把它和打包出来的二进制放到了这里:

https://github.com/fffonion/Sunshine/releases/tag/0.21-fix

 

Sunshine 云原神配置记录

0   3379 转为繁体

本文中所有软件在这里:https://pan.quark.cn/s/8919c40fcd57

下载Sunshine

下载地址  https://github.com/LizardByte/Sunshine/releases/tag/v0.21.0

如果你平时根本不开显示器而用远程桌面登录,需要这个fix https://github.com/fffonion/Sunshine/releases/tag/0.21-fix

(详见Sunshine 的权限提升实现的坑

如果使用portable版,需要运行 scripts/install-service.bat 安装服务,用来支持后面的权限提升操作。

安装Amyuni 虚拟显示驱动

下载地址 https://www.amyuni.com/forum/viewtopic.php?t=3030

因为显卡需要检测到连接的显示器才会输出视频信号,安装虚拟显示驱动即可不插显示器串流。

另外,也可以购买HDMI诱骗器。

配置远程桌面

非必需,用来手滑误操作时的救援。

注意,远程桌面也使用了虚拟显示器,并且在开启远程桌面时,会屏蔽其他所有的显示器。因此串流时应关闭远程桌面,另外也不能在远程桌面中直接启动 Sunshine,否则会检测不到正确的显示器。可以使用以下命令

在远程桌面中运行后,立即关闭远程桌面,即可在非远程桌面环境中启动 Sunshine。

查找虚拟显示器序号

在 Sunshine 目录中,运行 scripts\dxgi-info.exe 程序,寻找除了 \\.\DISPLAY1 以外的显示器。

配置 Sunshine

  • 在 Applications 选项卡中,点击 + Add New
  • 在 Command 中,填写下列命令打开触摸UI

  • 如果用来给 PC 客户端串流,填写

  • 勾选 Run as administrator
  • 点 Save 保存

自动适配分辨率

在新建的 Application 的 Do Command 中添加如下项

  • 添加客户端的分辨率到虚拟显示器

  • 关闭虚拟显示器

  • 打开虚拟显示器(使新分辨率可用)

  • 设置主显示器为虚拟显示器,注意修改 5 为上一步中找到的虚拟显示器序号

另外,在Undo Command中填写

用来恢复默认主显示器

  • 设置虚拟显示器分辨率

  • 设置O神的分辨率(宽度)

  • 设置原O的分辨率(高度)

以上所有命令均需要勾选 Elevated 复选框。

如果在运行时遇到权限提升失败,检查服务是否已启用,并可以尝试重启 Sunshine。

安装 Moonlight 客户端

手机端使用 阿西西大佬 修改的多点触控版本 https://www.bilibili.com/video/BV1Si4y1Y7Jb/。

iOS可以使用 sideloadly 自签名安装。

PC端使用官方客户端即可。

进入后,在 Settings 中设置分辨率为当前设备的分辨率;手机端的Touch Mode 选择 Touchscreen。

配置 Wireguard 公网串流

在路由器端配置 Wireguard 隧道,或者在手机端配置 Wireguard 隧道,并设置路由规则。

登录Windows

使用Sunshine 的 Desktop 程序,或者在物理显示器上登录一次。注意远程桌面登录的没用。

效果

30M码率在 iPad Mini 6上流畅地公网串流,PC端开启1.5倍渲染高画质,比官方的云原神(10M码率)清晰不少,画质也提高了w

官方云原神:

nginx配置HTTP/3的注意事项

0   2735 转为繁体

因为OpenResty近期更新到了支持HTTP/3的nginx,需要注意以下事项。

打开reuseport

在多worker配置下需要打开HTTP/3端口的reuseport选项,否则会导致两个UDP包被不同的worker处理,从而客户端报ERR_DRAINING错误。

多个Host在同一个端口监听的话,只需在其中的任意一个listen directive中添加reuseport。

把$http_host替换成$host

由于HTTP/3不再发送 Host 头而改用 :authority 伪头来,$http_host 变量变为空值。因此$http_host和ngx.var.http_host都需要改为$host和ngx.var.host。

添加Alt-Svc头

浏览器不会默认通过 HTTP/3 连接,但在看到 Alt-Svc 头后才开始尝试使用 HTTP/3 协议。

另外,随着http3的加入,http2从listen directive中被弃用,改为单独的http2 on/off; directive。

我将以上更改写成一个自动化脚本,用来批量更新多个nginx conf文件。

Do not set HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MiniNT when trying to enable ReFS

0   3469 转为繁体

Lots of articles online indicates adding a AllowRefsFormatOverNonmirrorVolume DWORD key under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MiniNT in reigstry.

This is wrong. The MiniNT section is to indicate the system is a WinRE or WinPE system, thus certain USBccid devices’ driver won’t load. Including SmartCard reader, Windows Hello (mostly implemented as an internal USB camera).

很多教程提到在注册表里添加HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MiniNT项,并添加名为AllowRefsFormatOverNonmirrorVolume的DWORD值。

其实这是错误的利用了WinRE启用了ReFS作为系统盘的功能。在正常的系统中出现MiniNT项会导致系统认为这是WinRE系统,从而不加载基于USB的驱动,包括智能卡读卡器和Windows Hello 驱动(很多 Windows Hello 摄像头是通过USB连接的)。

Windows Server 存储池替换物理硬盘

0   2925 转为繁体

现有两个存储池,分别叫StoragePool1和StoragePool2;两个存储池中各有两块磁盘(Disk1-1, Disk1-2, Disk2-1, Disk2-2),各组成Mirror分布的虚拟磁盘,分别叫VirtualDisk1和VirtualDisk2。

需要将 Disk2-2 退役,在StoragePool1 中加入 Disk1-3,将 Disk1-2 加入StoragePool2。

按如下操作