using System.Diagnostics; using System.Text; using NetworkTool.Client.Models; namespace NetworkTool.Client.Services; public sealed class NetworkConfigurationService { public async Task ConfigureMaintenanceNetworkAsync(AdapterInfo adapter, CancellationToken cancellationToken = default) { var escapedName = adapter.Name.Replace("'", "''"); var command = "$adapter = Get-NetAdapter -Name '{0}' -ErrorAction Stop; " + "Remove-NetIPAddress -InterfaceIndex $adapter.IfIndex -AddressFamily IPv4 -Confirm:$false -ErrorAction SilentlyContinue; " + "Remove-NetRoute -InterfaceIndex $adapter.IfIndex -AddressFamily IPv4 -Confirm:$false -ErrorAction SilentlyContinue; " + "New-NetIPAddress -InterfaceIndex $adapter.IfIndex -IPAddress 169.254.100.1 -PrefixLength 16 -AddressFamily IPv4 -ErrorAction Stop"; await RunPowerShellAsync(string.Format(command, escapedName), cancellationToken); } private static async Task RunPowerShellAsync(string command, CancellationToken cancellationToken) { var startInfo = new ProcessStartInfo { FileName = "powershell.exe", Arguments = $"-NoProfile -NonInteractive -ExecutionPolicy Bypass -Command \"{command}\"", RedirectStandardError = true, RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true, }; using var process = new Process { StartInfo = startInfo }; process.Start(); var stdOutTask = process.StandardOutput.ReadToEndAsync(cancellationToken); var stdErrTask = process.StandardError.ReadToEndAsync(cancellationToken); await process.WaitForExitAsync(cancellationToken); var stdOut = await stdOutTask; var stdErr = await stdErrTask; if (process.ExitCode != 0) { var message = new StringBuilder(); if (!string.IsNullOrWhiteSpace(stdOut)) { message.AppendLine(stdOut.Trim()); } if (!string.IsNullOrWhiteSpace(stdErr)) { message.AppendLine(stdErr.Trim()); } throw new InvalidOperationException(message.ToString().Trim()); } } }