fix(remote): VNC 升级支持最新版 TightVNC——修 ReadVncServerConfig 的 ConnectToRdp 误读 ExtraPorts、补 WriteVncServerConfig 漏写的 LogLevel(读/写均达 37 项全集)、InstallVncServer 从固定密码空壳实现为真安装(校验 exe→写最新版全集配置+随机密码→注册服务, 装而不启/运行中重启, 返回明文密码); 锁定最新版默认值与安装异常路径的单测

This commit is contained in:
w11
2026-09-23 19:39:08 +08:00
parent 181150b7a1
commit 38e44f7b4a
4 changed files with 90 additions and 50 deletions
+39 -48
View File
@@ -3,6 +3,9 @@
package remote
import (
"fmt"
"os"
"github.com/KarpelesLab/vncpasswd"
"github.com/kardianos/service"
"golang.org/x/sys/windows/registry"
@@ -10,47 +13,9 @@ import (
var VncService service.Service
// ReadVncServerConfig 从注册表读取 TightVNC 服务端配置
// ReadVncServerConfig 从注册表读取 TightVNC 服务端配置(键值缺失按零值返回)
func ReadVncServerConfig() (VncServerConfig, error) {
config := VncServerConfig{
ExtraPorts: "",
QueryTimeout: 0,
QueryAcceptOnTimeout: 0,
LocalInputPriorityTimeout: 0,
LocalInputPriority: 0,
BlockRemoteInput: 0,
BlockLocalInput: 0,
IpAccessControl: "",
RfbPort: 0,
HttpPort: 0,
DisconnectAction: 0,
AcceptRfbConnections: 0,
UseVncAuthentication: 0,
UseControlAuthentication: 0,
RepeatControlAuthentication: 0,
LoopbackOnly: 0,
AcceptHttpConnections: 0,
LogLevel: 0,
EnableFileTransfers: 0,
RemoveWallpaper: 0,
UseD3D: 0,
UseMirrorDriver: 0,
EnableUrlParams: 0,
Password: []byte{},
AlwaysShared: 0,
NeverShared: 0,
DisconnectClients: 0,
PollingInterval: 0,
AllowLoopback: 0,
VideoRecognitionInterval: 0,
GrabTransparentWindows: 0,
SaveLogToAllUsersPath: 0,
RunControlInterface: 0,
IdleTimeout: 0,
VideoClasses: "",
VideoRects: "",
ConnectToRdp: 0,
}
var config VncServerConfig
key, err := registry.OpenKey(registry.LOCAL_MACHINE, "SOFTWARE\\TightVNC\\Server", registry.ALL_ACCESS)
if err != nil {
@@ -93,7 +58,7 @@ func ReadVncServerConfig() (VncServerConfig, error) {
config.IdleTimeout, _, _ = GetDwordValue(key, "IdleTimeout")
config.VideoClasses, _, _ = key.GetStringValue("VideoClasses")
config.VideoRects, _, _ = key.GetStringValue("VideoRects")
config.ConnectToRdp, _, _ = GetDwordValue(key, "ExtraPorts")
config.ConnectToRdp, _, _ = GetDwordValue(key, "ConnectToRdp")
return config, nil
}
@@ -109,16 +74,42 @@ func GetDwordValue(k registry.Key, name string) (val uint32, valtype uint32, err
var vncSvcConfig = &service.Config{
Name: "tvnserver",
DisplayName: "TightVNC Server",
Description: "",
Description: "TightVNC Server (managed by remote-core)",
Arguments: []string{"-service"},
}
// InstallVncServer 安装VNC服务端 返回:结果,密码,错误
func InstallVncServer() (bool, string, error) {
//安装服务
//导入注册表
//生成随机密码
return true, "12345678", nil
// InstallVncServer 绿色安装 TightVNC 服务端(需管理员权限)。
// 最新版注册表全集配置(VncClientDefaultConfig 37 项, 随机 8 位密码)→ 注册系统服务。
// 装而不启:服务注册后保持 Stopped, 等远程指令再 VncStart(避免常驻监听开端口);
// 若服务已在运行则重启以加载新配置。返回生成的明文密码(调用方自行上报/展示)。
func InstallVncServer(exePath string) (string, error) {
if finfo, err := os.Stat(exePath); err != nil || finfo.IsDir() {
return "", fmt.Errorf("tvnserver.exe 不存在: %s", exePath)
}
// 最新版 TightVNC 注册表配置全集(含随机密码)
config := VncClientDefaultConfig(true)
if err := WriteVncServerConfig(config); err != nil {
return "", err
}
// 注册系统服务:未安装→安装; 运行中→重启加载新配置; 已停止→保持
vncSvcConfig.Executable = exePath
if err := VncInit(); err != nil {
return "", err
}
status, err := VncService.Status()
switch {
case err != nil: // 未安装(kardianos 对未安装服务 Status 返回错误)
if err := VncInstall(); err != nil {
return "", err
}
case status == service.StatusRunning:
if err := VncRestart(); err != nil {
return "", err
}
}
return VncPasswordDecrypt(config.Password), nil
}
// VncInit 初始化 VNC 服务对象,VncInstall/VncStart 等操作前必须调用