NetworkConfigurationService.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System.Diagnostics;
  2. using System.Text;
  3. using NetworkTool.Client.Models;
  4. namespace NetworkTool.Client.Services;
  5. public sealed class NetworkConfigurationService
  6. {
  7. public async Task ConfigureMaintenanceNetworkAsync(AdapterInfo adapter, CancellationToken cancellationToken = default)
  8. {
  9. var escapedName = adapter.Name.Replace("'", "''");
  10. var command = "$adapter = Get-NetAdapter -Name '{0}' -ErrorAction Stop; " +
  11. "Remove-NetIPAddress -InterfaceIndex $adapter.IfIndex -AddressFamily IPv4 -Confirm:$false -ErrorAction SilentlyContinue; " +
  12. "Remove-NetRoute -InterfaceIndex $adapter.IfIndex -AddressFamily IPv4 -Confirm:$false -ErrorAction SilentlyContinue; " +
  13. "New-NetIPAddress -InterfaceIndex $adapter.IfIndex -IPAddress 169.254.100.1 -PrefixLength 16 -AddressFamily IPv4 -ErrorAction Stop";
  14. await RunPowerShellAsync(string.Format(command, escapedName), cancellationToken);
  15. }
  16. private static async Task RunPowerShellAsync(string command, CancellationToken cancellationToken)
  17. {
  18. var startInfo = new ProcessStartInfo
  19. {
  20. FileName = "powershell.exe",
  21. Arguments = $"-NoProfile -NonInteractive -ExecutionPolicy Bypass -Command \"{command}\"",
  22. RedirectStandardError = true,
  23. RedirectStandardOutput = true,
  24. UseShellExecute = false,
  25. CreateNoWindow = true,
  26. };
  27. using var process = new Process { StartInfo = startInfo };
  28. process.Start();
  29. var stdOutTask = process.StandardOutput.ReadToEndAsync(cancellationToken);
  30. var stdErrTask = process.StandardError.ReadToEndAsync(cancellationToken);
  31. await process.WaitForExitAsync(cancellationToken);
  32. var stdOut = await stdOutTask;
  33. var stdErr = await stdErrTask;
  34. if (process.ExitCode != 0)
  35. {
  36. var message = new StringBuilder();
  37. if (!string.IsNullOrWhiteSpace(stdOut))
  38. {
  39. message.AppendLine(stdOut.Trim());
  40. }
  41. if (!string.IsNullOrWhiteSpace(stdErr))
  42. {
  43. message.AppendLine(stdErr.Trim());
  44. }
  45. throw new InvalidOperationException(message.ToString().Trim());
  46. }
  47. }
  48. }