using Microsoft.Win32;
using System.Diagnostics;
namespace DeviceAgent.Services;
///
/// 远程桌面服务 - 自动开启 Windows 远程桌面
///
public class RemoteDesktopService
{
private readonly ILogger _logger;
public RemoteDesktopService(ILogger logger)
{
_logger = logger;
}
///
/// 启用远程桌面
///
public bool EnableRemoteDesktop()
{
try
{
// 1. 修改注册表启用远程桌面
using var key = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Terminal Server", true);
if (key != null)
{
// fDenyTSConnections = 0 表示允许远程连接
key.SetValue("fDenyTSConnections", 0, RegistryValueKind.DWord);
_logger.LogInformation("已启用远程桌面连接");
}
else
{
_logger.LogWarning("无法打开远程桌面注册表项");
return false;
}
// 2. 设置网络级别身份验证 (NLA) - 可选,设为 0 允许任何版本的远程桌面连接
using var nlaKey = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp", true);
if (nlaKey != null)
{
// UserAuthentication = 0 禁用 NLA(更兼容)
// UserAuthentication = 1 启用 NLA(更安全)
nlaKey.SetValue("UserAuthentication", 0, RegistryValueKind.DWord);
_logger.LogInformation("已配置网络级别身份验证");
}
// 3. 开启防火墙规则
EnableFirewallRule();
// 4. 启动远程桌面服务
StartTerminalService();
return true;
}
catch (UnauthorizedAccessException ex)
{
_logger.LogError(ex, "启用远程桌面失败: 需要管理员权限");
return false;
}
catch (Exception ex)
{
_logger.LogError(ex, "启用远程桌面失败");
return false;
}
}
///
/// 检查远程桌面是否已启用
///
public bool IsRemoteDesktopEnabled()
{
try
{
using var key = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Terminal Server");
if (key != null)
{
var value = key.GetValue("fDenyTSConnections");
return value != null && (int)value == 0;
}
return false;
}
catch (Exception ex)
{
_logger.LogError(ex, "检查远程桌面状态失败");
return false;
}
}
///
/// 开启防火墙规则允许远程桌面
///
private void EnableFirewallRule()
{
try
{
// 启用远程桌面防火墙规则
var startInfo = new ProcessStartInfo
{
FileName = "netsh",
Arguments = "advfirewall firewall set rule group=\"远程桌面\" new enable=yes",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using var process = Process.Start(startInfo);
process?.WaitForExit(5000);
// 如果中文规则名失败,尝试英文
if (process?.ExitCode != 0)
{
startInfo.Arguments = "advfirewall firewall set rule group=\"Remote Desktop\" new enable=yes";
using var process2 = Process.Start(startInfo);
process2?.WaitForExit(5000);
}
_logger.LogInformation("已配置防火墙规则");
}
catch (Exception ex)
{
_logger.LogWarning(ex, "配置防火墙规则失败,可能需要手动配置");
}
}
///
/// 启动远程桌面服务
///
private void StartTerminalService()
{
try
{
var startInfo = new ProcessStartInfo
{
FileName = "sc",
Arguments = "config TermService start= auto",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
using var process = Process.Start(startInfo);
process?.WaitForExit(5000);
// 启动服务
startInfo.Arguments = "start TermService";
using var process2 = Process.Start(startInfo);
process2?.WaitForExit(5000);
_logger.LogInformation("已启动远程桌面服务");
}
catch (Exception ex)
{
_logger.LogWarning(ex, "启动远程桌面服务失败");
}
}
///
/// 获取远程桌面端口
///
public int GetRdpPort()
{
try
{
using var key = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp");
if (key != null)
{
var value = key.GetValue("PortNumber");
if (value != null)
{
return (int)value;
}
}
}
catch (Exception ex)
{
_logger.LogError(ex, "获取远程桌面端口失败");
}
return 3389; // 默认端口
}
}