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}");
        }
    }
}