using System;
using Microsoft.Win32;
using System.ServiceProcess;
using System.Diagnostics;
using System.Security.Principal;
class EnableRemoteDesktop
{
static void Main(string[] args)
{
if (!IsAdministrator())
{
Console.WriteLine("请以管理员权限运行此程序。");
return;
}
try
{
ConfigureTermService();
EnableRdpThroughRegistry();
DisableNlaThroughRegistry();
RestartTermService();
Console.WriteLine("远程桌面已成功启用,NLA限制已取消!");
}
catch (Exception ex)
{
Console.WriteLine($"操作失败: {ex.Message}");
}
}
static bool IsAdministrator()
{
var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
static void ConfigureTermService()
{
try
{
// 设置服务为自动启动
ProcessStartInfo scConfig = new ProcessStartInfo
{
FileName = "sc",
Arguments = "config TermService start= auto",
UseShellExecute = false,
CreateNoWindow = true
};
Process.Start(scConfig)?.WaitForExit();
// 确保服务运行
using (ServiceController service = new ServiceController("TermService"))
{
if (service.Status != ServiceControllerStatus.Running)
{
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(30));
}
}
}
catch (Exception ex)
{
throw new Exception($"配置远程桌面服务失败: {ex.Message}");
}
}
static void EnableRdpThroughRegistry()
{
try
{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Terminal Server", true))
{
key?.SetValue("fDenyTSConnections", 0, RegistryValueKind.DWord);
}
}
catch (Exception ex)
{
throw new Exception($"修改注册表启用RDP失败: {ex.Message}");
}
}
static void DisableNlaThroughRegistry()
{
try
{
using (RegistryKey rdpKey = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp", true))
{
rdpKey?.SetValue("UserAuthentication", 0, RegistryValueKind.DWord);
}
}
catch (Exception ex)
{
throw new Exception($"禁用NLA失败: {ex.Message}");
}
}
static void RestartTermService()
{
try
{
using (ServiceController service = new ServiceController("TermService"))
{
if (service.Status == ServiceControllerStatus.Running)
{
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(30));
}
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(30));
}
}
catch (Exception ex)
{
throw new Exception($"重启服务失败: {ex.Message}");
}
}
}