NetworkInterfaceInfo.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. using System;
  2. using System.Diagnostics;
  3. using System.Linq;
  4. using System.Management;
  5. using System.Net;
  6. using System.Net.NetworkInformation;
  7. using System.Net.Sockets;
  8. using System.Text;
  9. using Vinno.IUS.Common.Log;
  10. namespace Vinno.FIS.Sonopost.Features.Network
  11. {
  12. public enum OperationStatus
  13. {
  14. Connecting,
  15. Connected,
  16. Disconnecting,
  17. Disconnected
  18. }
  19. public class NetworkInterfaceInfo
  20. {
  21. private enum NetworkInterfaceErrors
  22. {
  23. Unknow = -1,
  24. Success = 0,
  25. InvalidSubnetMask = 66,
  26. InvalidIpAddress = 70,
  27. InvalidGateWay = 71
  28. }
  29. private OperationStatus _operationalStatus;
  30. public Guid Guid { get; private set; }
  31. public NetworkInterfaceType NetworkInterfaceType { get; private set; }
  32. public string MacAddress { get; private set; }
  33. public string Description { get; private set; }
  34. public NetworkInterfaceInfoParam<bool> EnableDhcp { get; private set; }
  35. public OperationStatus OperationalStatus
  36. {
  37. get
  38. {
  39. return _operationalStatus;
  40. }
  41. set
  42. {
  43. if (_operationalStatus != value)
  44. {
  45. _operationalStatus = value;
  46. }
  47. }
  48. }
  49. public NetworkInterfaceInfoParam<string> IpAddress { get; private set; }
  50. public NetworkInterfaceInfoParam<string> SubnetMask { get; private set; }
  51. public NetworkInterfaceInfoParam<string> GateWay { get; private set; }
  52. public NetworkInterfaceInfoParam<string> PreferredDNSServer { get; private set; }
  53. public NetworkInterfaceInfoParam<string> StandbyDNSServer { get; private set; }
  54. internal NetworkInterfaceInfo(NetworkInterface networkInterface)
  55. {
  56. Load(networkInterface);
  57. if (EnableDhcp == null || IpAddress == null || SubnetMask == null || GateWay == null)
  58. {
  59. throw new ArgumentNullException("TcpIpSetting parameters");
  60. }
  61. }
  62. public bool ValidIpProperties()
  63. {
  64. if (!IsAddressValid(IpAddress.Value))
  65. {
  66. return false;
  67. }
  68. if (!IsAddressValid(SubnetMask.Value))
  69. {
  70. return false;
  71. }
  72. if (!string.IsNullOrEmpty(GateWay.Value) && !IsAddressValid(GateWay.Value))
  73. {
  74. return false;
  75. }
  76. if (!string.IsNullOrEmpty(PreferredDNSServer.Value) && !IsAddressValid(PreferredDNSServer.Value))
  77. {
  78. return false;
  79. }
  80. if (!string.IsNullOrEmpty(StandbyDNSServer.Value) && !IsAddressValid(StandbyDNSServer.Value))
  81. {
  82. return false;
  83. }
  84. return true;
  85. }
  86. public bool SaveChanges(bool enableDhcp, bool rollback = false)
  87. {
  88. if (rollback)
  89. {
  90. UpdateDefaults(EnableDhcp.DefaultValue, IpAddress.DefaultValue, SubnetMask.DefaultValue, GateWay.DefaultValue, PreferredDNSServer.DefaultValue, StandbyDNSServer.DefaultValue);
  91. return true;
  92. }
  93. uint num = 0u;
  94. string queryString = $"select * from Win32_NetworkAdapterConfiguration ";
  95. using (ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(queryString))
  96. {
  97. var managementObjects = managementObjectSearcher.Get().OfType<ManagementObject>();
  98. ManagementObject managementObject = managementObjects.FirstOrDefault(x => x["MacAddress"] != null && ((string)x["MacAddress"]).Replace(":", "-") == MacAddress);
  99. if (managementObject == null)
  100. {
  101. Logger.WriteLineError($"Adapter {MacAddress} is not enabled.");
  102. HandleSetNetworkReturnValue(NetworkInterfaceErrors.Unknow);
  103. return false;
  104. }
  105. if (enableDhcp)
  106. {
  107. if (!(bool)managementObject["DHCPEnabled"])
  108. {
  109. num = (uint)managementObject.InvokeMethod("EnableDHCP", null);
  110. switch (num)
  111. {
  112. case 0u:
  113. break;
  114. case 84u:
  115. {
  116. NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(x => GetMacAddress(x.GetPhysicalAddress()) == MacAddress);
  117. if (networkInterface != null)
  118. {
  119. try
  120. {
  121. Process process = new Process
  122. {
  123. StartInfo =
  124. {
  125. FileName = "netsh.exe",
  126. Arguments = $"interface ip set address \"{networkInterface.Name}\" DHCP",
  127. UseShellExecute = false,
  128. CreateNoWindow = true
  129. }
  130. };
  131. process.Start();
  132. }
  133. catch (Exception ex)
  134. {
  135. Logger.WriteLineError($"netsh command exception : {ex}");
  136. }
  137. }
  138. break;
  139. }
  140. default:
  141. Logger.WriteLineError("Enable DHCP failed. Error code:" + num);
  142. return false;
  143. }
  144. num = (uint)managementObject.InvokeMethod("SetDNSServerSearchOrder", null);
  145. if (num != 0)
  146. {
  147. Logger.WriteLineError("Set dns server search order fail. Error code:" + num);
  148. return false;
  149. }
  150. }
  151. }
  152. else
  153. {
  154. if (!string.IsNullOrWhiteSpace(IpAddress.Value) && !string.IsNullOrWhiteSpace(SubnetMask.Value))
  155. {
  156. num = (uint)managementObject.InvokeMethod("EnableStatic", new object[2]
  157. {
  158. new string[1]
  159. {
  160. IpAddress.Value
  161. },
  162. new string[1]
  163. {
  164. SubnetMask.Value
  165. }
  166. });
  167. if (num != 0)
  168. {
  169. NetworkInterfaceErrors errorCode = NetworkInterfaceErrors.Unknow;
  170. if (Enum.IsDefined(typeof(NetworkInterfaceErrors), (int)num))
  171. {
  172. errorCode = (NetworkInterfaceErrors)num;
  173. }
  174. Logger.WriteLineError("Set static IP address failed. Error code:" + num);
  175. HandleSetNetworkReturnValue(errorCode, num);
  176. return false;
  177. }
  178. else
  179. {
  180. Logger.WriteLineInfo($"Network Interface Info Set IP And SubnetMask Success.");
  181. }
  182. }
  183. if (!string.IsNullOrWhiteSpace(GateWay.Value))
  184. {
  185. num = (uint)managementObject.InvokeMethod("SetGateways", new object[2]
  186. {
  187. new string[1]
  188. {
  189. GateWay.Value
  190. },
  191. new ushort[1]
  192. {
  193. 1
  194. }
  195. });
  196. if (num != 0)
  197. {
  198. HandleSetNetworkReturnValue(NetworkInterfaceErrors.InvalidGateWay);
  199. Logger.WriteLineError("Set static default gateway failed. Error code:" + num);
  200. return false;
  201. }
  202. else
  203. {
  204. Logger.WriteLineInfo($"Network Interface Info Set default gateway Success.");
  205. }
  206. }
  207. if (!string.IsNullOrWhiteSpace(PreferredDNSServer.Value) || !string.IsNullOrWhiteSpace(StandbyDNSServer.Value))
  208. {
  209. var objInPara = managementObject.GetMethodParameters("SetDNSServerSearchOrder");
  210. if (string.IsNullOrWhiteSpace(StandbyDNSServer.Value))
  211. {
  212. objInPara["DNSServerSearchOrder"] = new string[] { PreferredDNSServer.Value };
  213. }
  214. else if (string.IsNullOrWhiteSpace(PreferredDNSServer.Value))
  215. {
  216. objInPara["DNSServerSearchOrder"] = new string[] { StandbyDNSServer.Value };
  217. }
  218. else
  219. {
  220. objInPara["DNSServerSearchOrder"] = new string[] { PreferredDNSServer.Value, StandbyDNSServer.Value };
  221. }
  222. var managementBaseObject = managementObject.InvokeMethod("SetDNSServerSearchOrder", objInPara, null);
  223. num = (uint)managementBaseObject["ReturnValue"];
  224. if (num != 0)
  225. {
  226. Logger.WriteLineError("Set DNS Server failed. Error code:" + num);
  227. return false;
  228. }
  229. else
  230. {
  231. Logger.WriteLineInfo($"Network Interface Info Set DNS Success.");
  232. }
  233. }
  234. }
  235. }
  236. return true;
  237. }
  238. private void UpdateDefaults(bool enableDhcp, string address, string submask, string getway, string preferredDnsServer, string standbyDnsServer)
  239. {
  240. if (EnableDhcp != null)
  241. {
  242. EnableDhcp.UpdateDefaultValue(enableDhcp);
  243. }
  244. if (IpAddress != null)
  245. {
  246. IpAddress.UpdateDefaultValue(address);
  247. }
  248. if (SubnetMask != null)
  249. {
  250. SubnetMask.UpdateDefaultValue(submask);
  251. }
  252. if (GateWay != null)
  253. {
  254. GateWay.UpdateDefaultValue(getway);
  255. }
  256. if (PreferredDNSServer != null)
  257. {
  258. PreferredDNSServer.UpdateDefaultValue(preferredDnsServer);
  259. }
  260. if (StandbyDNSServer != null)
  261. {
  262. StandbyDNSServer.UpdateDefaultValue(standbyDnsServer);
  263. }
  264. }
  265. private void Load(NetworkInterface networkInterface)
  266. {
  267. if (networkInterface == null)
  268. {
  269. throw new ArgumentNullException("networkInterface");
  270. }
  271. Guid = new Guid(networkInterface.Id);
  272. NetworkInterfaceType = networkInterface.NetworkInterfaceType;
  273. Description = networkInterface.Description;
  274. OperationalStatus = ((networkInterface.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) ? OperationStatus.Connected : OperationStatus.Disconnected);
  275. MacAddress = GetMacAddress(networkInterface.GetPhysicalAddress());
  276. bool enbleDhcp = false;
  277. string address = string.Empty;
  278. string submask = string.Empty;
  279. string getway = string.Empty;
  280. string preferredDnsServer = string.Empty;
  281. string standbyDnsServer = string.Empty;
  282. ParseTcpIpInfo(networkInterface, out enbleDhcp, out address, out submask, out getway, out preferredDnsServer, out standbyDnsServer);
  283. EnableDhcp = new NetworkInterfaceInfoParam<bool>("AutoConfigIPAddress", enbleDhcp);
  284. IpAddress = new NetworkInterfaceInfoParam<string>("IPv4Setting", address);
  285. SubnetMask = new NetworkInterfaceInfoParam<string>("Subnetmask", submask);
  286. GateWay = new NetworkInterfaceInfoParam<string>("DefaultGateway", getway);
  287. PreferredDNSServer = new NetworkInterfaceInfoParam<string>("PreferredDNSServer", preferredDnsServer);
  288. StandbyDNSServer = new NetworkInterfaceInfoParam<string>("StandbyDNSServer", standbyDnsServer);
  289. }
  290. private void ParseTcpIpInfo(NetworkInterface networkInterface, out bool enbleDhcp, out string address, out string submask, out string getway, out string preferredDnsServer, out string standbyDnsServer)
  291. {
  292. IPInterfaceProperties iPProperties = networkInterface.GetIPProperties();
  293. IPv4InterfaceProperties iPv4Properties = iPProperties.GetIPv4Properties();
  294. if (iPv4Properties != null)
  295. {
  296. enbleDhcp = iPv4Properties.IsDhcpEnabled;
  297. }
  298. else
  299. {
  300. enbleDhcp = false;
  301. }
  302. if (networkInterface.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Down)
  303. {
  304. address = string.Empty;
  305. submask = string.Empty;
  306. getway = string.Empty;
  307. preferredDnsServer = string.Empty;
  308. standbyDnsServer = string.Empty;
  309. return;
  310. }
  311. UnicastIPAddressInformation unicastIPAddressInformation = enbleDhcp ? iPProperties.UnicastAddresses.FirstOrDefault((UnicastIPAddressInformation x) => x.Address.AddressFamily == AddressFamily.InterNetwork && x.PrefixOrigin == PrefixOrigin.Dhcp) : iPProperties.UnicastAddresses.FirstOrDefault((UnicastIPAddressInformation x) => x.Address.AddressFamily == AddressFamily.InterNetwork && x.PrefixOrigin == PrefixOrigin.Manual);
  312. if (unicastIPAddressInformation == null)
  313. {
  314. unicastIPAddressInformation = iPProperties.UnicastAddresses.FirstOrDefault((UnicastIPAddressInformation x) => x.Address.AddressFamily == AddressFamily.InterNetwork && x.PrefixOrigin == PrefixOrigin.Manual);
  315. }
  316. if (unicastIPAddressInformation != null)
  317. {
  318. address = unicastIPAddressInformation.Address.ToString();
  319. submask = ((unicastIPAddressInformation.IPv4Mask != null) ? unicastIPAddressInformation.IPv4Mask.ToString() : GetDefaultSubnetMaskWithIpAddress(address));
  320. }
  321. else
  322. {
  323. address = string.Empty;
  324. submask = string.Empty;
  325. }
  326. GatewayIPAddressInformation gatewayIPAddressInformation = iPProperties.GatewayAddresses.FirstOrDefault((GatewayIPAddressInformation x) => x.Address.AddressFamily == AddressFamily.InterNetwork);
  327. if (gatewayIPAddressInformation != null)
  328. {
  329. getway = gatewayIPAddressInformation.Address.ToString();
  330. if ("0.0.0.0" == getway)
  331. {
  332. getway = string.Empty;
  333. }
  334. }
  335. else
  336. {
  337. getway = string.Empty;
  338. }
  339. var ipAddressCollection = iPProperties.DnsAddresses.Where(c => c.AddressFamily == AddressFamily.InterNetwork).ToList();
  340. preferredDnsServer = string.Empty;
  341. standbyDnsServer = string.Empty;
  342. if (ipAddressCollection.Any())
  343. {
  344. preferredDnsServer = ipAddressCollection[0].ToString();
  345. if (ipAddressCollection.Count == 2)
  346. {
  347. standbyDnsServer = ipAddressCollection[1].ToString();
  348. }
  349. }
  350. }
  351. private bool? HandleSetNetworkReturnValue(NetworkInterfaceErrors errorCode, uint result = 0u)
  352. {
  353. if (errorCode != 0)
  354. {
  355. return true;
  356. }
  357. return null;
  358. }
  359. public static string GetDefaultSubnetMaskWithIpAddress(string iPAddress)
  360. {
  361. if (!IsAddressValid(iPAddress))
  362. {
  363. return string.Empty;
  364. }
  365. IPAddress iPAddress2 = IPAddress.Parse(iPAddress);
  366. byte[] addressBytes = iPAddress2.GetAddressBytes();
  367. uint num = addressBytes[0];
  368. if (num >= 0 && num <= 127)
  369. {
  370. return "255.0.0.0";
  371. }
  372. if (num >= 128 && num <= 191)
  373. {
  374. return "255.255.0.0";
  375. }
  376. if (num >= 192 && num <= 223)
  377. {
  378. return "255.255.255.0";
  379. }
  380. return "0.0.0.0";
  381. }
  382. private string GetMacAddress(PhysicalAddress address)
  383. {
  384. //return address.ToString();
  385. return BitConverter.ToString(address.GetAddressBytes());
  386. }
  387. private static bool IsAddressValid(string address)
  388. {
  389. if (string.IsNullOrEmpty(address))
  390. {
  391. return false;
  392. }
  393. IPAddress address2;
  394. return IPAddress.TryParse(address, out address2);
  395. }
  396. public override string ToString()
  397. {
  398. StringBuilder sb = new StringBuilder();
  399. sb.Append($"GUID:{Guid}\t");
  400. sb.Append($"Description:{Description}\t");
  401. sb.Append($"DHCP:{EnableDhcp.Value}\t");
  402. sb.Append($"MAC:{MacAddress}\t");
  403. sb.Append($"IP:{IpAddress.Value}\t");
  404. sb.Append($"SubnetMask:{SubnetMask.Value}\t");
  405. sb.Append($"Gateway:{GateWay.Value}\t");
  406. sb.Append($"DNS1:{PreferredDNSServer.Value}\t");
  407. sb.Append($"DNS2:{StandbyDNSServer.Value}\t");
  408. sb.Append($"Type:{NetworkInterfaceType}\t");
  409. return sb.ToString();
  410. }
  411. internal virtual void Dispose()
  412. {
  413. }
  414. }
  415. }