NetworkManager.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using MediaBrowser.Common.Implementations.Networking;
  2. using MediaBrowser.Common.Net;
  3. using MediaBrowser.Model.Net;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Runtime.InteropServices;
  8. namespace MediaBrowser.ServerApplication.Networking
  9. {
  10. /// <summary>
  11. /// Class NetUtils
  12. /// </summary>
  13. public class NetworkManager : BaseNetworkManager, INetworkManager
  14. {
  15. /// <summary>
  16. /// Gets the network shares.
  17. /// </summary>
  18. /// <param name="path">The path.</param>
  19. /// <returns>IEnumerable{NetworkShare}.</returns>
  20. public IEnumerable<NetworkShare> GetNetworkShares(string path)
  21. {
  22. return new ShareCollection(path).OfType<Share>().Select(ToNetworkShare);
  23. }
  24. /// <summary>
  25. /// To the network share.
  26. /// </summary>
  27. /// <param name="share">The share.</param>
  28. /// <returns>NetworkShare.</returns>
  29. private NetworkShare ToNetworkShare(Share share)
  30. {
  31. return new NetworkShare
  32. {
  33. Name = share.NetName,
  34. Path = share.Path,
  35. Remark = share.Remark,
  36. Server = share.Server,
  37. ShareType = ToNetworkShareType(share.ShareType)
  38. };
  39. }
  40. /// <summary>
  41. /// To the type of the network share.
  42. /// </summary>
  43. /// <param name="shareType">Type of the share.</param>
  44. /// <returns>NetworkShareType.</returns>
  45. /// <exception cref="System.ArgumentException">Unknown share type</exception>
  46. private NetworkShareType ToNetworkShareType(ShareType shareType)
  47. {
  48. if (shareType.HasFlag(ShareType.Special))
  49. {
  50. return NetworkShareType.Special;
  51. }
  52. if (shareType.HasFlag(ShareType.Device))
  53. {
  54. return NetworkShareType.Device;
  55. }
  56. if (shareType.HasFlag(ShareType.Disk))
  57. {
  58. return NetworkShareType.Disk;
  59. }
  60. if (shareType.HasFlag(ShareType.IPC))
  61. {
  62. return NetworkShareType.Ipc;
  63. }
  64. if (shareType.HasFlag(ShareType.Printer))
  65. {
  66. return NetworkShareType.Printer;
  67. }
  68. throw new ArgumentException("Unknown share type");
  69. }
  70. /// <summary>
  71. /// Uses the DllImport : NetServerEnum with all its required parameters
  72. /// (see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netserverenum.asp
  73. /// for full details or method signature) to retrieve a list of domain SV_TYPE_WORKSTATION
  74. /// and SV_TYPE_SERVER PC's
  75. /// </summary>
  76. /// <returns>Arraylist that represents all the SV_TYPE_WORKSTATION and SV_TYPE_SERVER
  77. /// PC's in the Domain</returns>
  78. public IEnumerable<string> GetNetworkDevices()
  79. {
  80. //local fields
  81. const int MAX_PREFERRED_LENGTH = -1;
  82. var SV_TYPE_WORKSTATION = 1;
  83. var SV_TYPE_SERVER = 2;
  84. var buffer = IntPtr.Zero;
  85. var tmpBuffer = IntPtr.Zero;
  86. var entriesRead = 0;
  87. var totalEntries = 0;
  88. var resHandle = 0;
  89. var sizeofINFO = Marshal.SizeOf(typeof(_SERVER_INFO_100));
  90. try
  91. {
  92. //call the DllImport : NetServerEnum with all its required parameters
  93. //see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netserverenum.asp
  94. //for full details of method signature
  95. var ret = NativeMethods.NetServerEnum(null, 100, ref buffer, MAX_PREFERRED_LENGTH, out entriesRead, out totalEntries, SV_TYPE_WORKSTATION | SV_TYPE_SERVER, null, out resHandle);
  96. //if the returned with a NERR_Success (C++ term), =0 for C#
  97. if (ret == 0)
  98. {
  99. //loop through all SV_TYPE_WORKSTATION and SV_TYPE_SERVER PC's
  100. for (var i = 0; i < totalEntries; i++)
  101. {
  102. //get pointer to, Pointer to the buffer that received the data from
  103. //the call to NetServerEnum. Must ensure to use correct size of
  104. //STRUCTURE to ensure correct location in memory is pointed to
  105. tmpBuffer = new IntPtr((int)buffer + (i * sizeofINFO));
  106. //Have now got a pointer to the list of SV_TYPE_WORKSTATION and
  107. //SV_TYPE_SERVER PC's, which is unmanaged memory
  108. //Needs to Marshal data from an unmanaged block of memory to a
  109. //managed object, again using STRUCTURE to ensure the correct data
  110. //is marshalled
  111. var svrInfo = (_SERVER_INFO_100)Marshal.PtrToStructure(tmpBuffer, typeof(_SERVER_INFO_100));
  112. //add the PC names to the ArrayList
  113. if (!string.IsNullOrEmpty(svrInfo.sv100_name))
  114. {
  115. yield return svrInfo.sv100_name;
  116. }
  117. }
  118. }
  119. }
  120. finally
  121. {
  122. //The NetApiBufferFree function frees
  123. //the memory that the NetApiBufferAllocate function allocates
  124. NativeMethods.NetApiBufferFree(buffer);
  125. }
  126. }
  127. }
  128. }