Advertisement
uwekeim

NetworkConnection.cs

Nov 28th, 2022 (edited)
1,006
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.62 KB | Software | 0 0
  1. namespace Tools;
  2.  
  3. using System.IO;
  4. using System.Runtime.InteropServices;
  5.  
  6. /// <summary>
  7. /// Wrapper for the "NET USE" functionality.
  8. /// Connect to a network resource, e.g. a network share under a different user.
  9. /// </summary>
  10. /// <remarks>
  11. /// Encapsulate an instance into a using-directive like e.g.:
  12. /// ...
  13. /// using ( new NetworkConnection( @"\\myshare", true, "myUsername", "myPassword" ) )
  14. /// {
  15. ///     ...
  16. ///     [code that connects to the network share under the new user context]
  17. ///     ...
  18. /// }
  19. /// ...
  20. /// </remarks>
  21. [PublicAPI]
  22. public sealed class NetworkConnection : IDisposable
  23. {
  24.     private string? _networkName;
  25.  
  26.     public NetworkConnection(
  27.         string networkName,
  28.         bool activate,
  29.         string userName,
  30.         string password)
  31.     {
  32.         if (activate)
  33.         {
  34.             doNetUse(networkName, userName, password);
  35.         }
  36.     }
  37.  
  38.     private void doNetUse(string networkName, string userName, string password)
  39.     {
  40.         var netResource = new NetResource
  41.         {
  42.             Scope = ResourceScope.GlobalNetwork,
  43.             ResourceType = ResourceType.Disk,
  44.             DisplayType = ResourceDisplaytype.Share,
  45.             RemoteName = networkName
  46.         };
  47.  
  48.         var result = WNetAddConnection2(
  49.             netResource,
  50.             password,
  51.             userName,
  52.             0);
  53.  
  54.         if (result != 0)
  55.         {
  56.             throw new IOException($"Error connecting to remote share '{networkName}': {result}", result);
  57.         }
  58.  
  59.         _networkName = networkName;
  60.     }
  61.  
  62.     ~NetworkConnection()
  63.     {
  64.         doDispose();
  65.     }
  66.  
  67.     public void Dispose()
  68.     {
  69.         doDispose();
  70.         GC.SuppressFinalize(this);
  71.     }
  72.  
  73.     private void doDispose()
  74.     {
  75.         if (!string.IsNullOrEmpty(_networkName))
  76.         {
  77.             var nn = _networkName;
  78.             _networkName = null;
  79.             var result = WNetCancelConnection2(nn, 0, true);
  80.             Trace.TraceInformation("Result for canceling network connection: {0}.", result);
  81.         }
  82.     }
  83.  
  84.     [DllImport(@"mpr.dll", CharSet = CharSet.Unicode)]
  85.     private static extern int WNetAddConnection2(
  86.         NetResource netResource,
  87.         string password,
  88.         string username,
  89.         int flags);
  90.  
  91.     [DllImport(@"mpr.dll", CharSet = CharSet.Unicode)]
  92.     private static extern int WNetCancelConnection2(
  93.         string? name,
  94.         int flags,
  95.         bool force);
  96. }
  97.  
  98. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  99. public class NetResource
  100. {
  101.     // ReSharper disable NotAccessedField.Global
  102.     // ReSharper disable NotAccessedField.Global
  103.     // ReSharper disable UnusedMember.Global
  104.     public ResourceScope Scope;
  105.     public ResourceType ResourceType;
  106.     public ResourceDisplaytype DisplayType;
  107.     public int Usage;
  108.     public string? LocalName;
  109.     public string? RemoteName;
  110.     public string? Comment;
  111.     public string? Provider;
  112.     // ReSharper restore UnusedMember.Global
  113.     // ReSharper restore NotAccessedField.Global
  114.     // ReSharper restore UnusedMember.Global
  115. }
  116.  
  117. public enum ResourceScope
  118. {
  119.     // ReSharper disable NotAccessedField.Global
  120.     // ReSharper disable UnusedMember.Global
  121.     Connected = 1,
  122.     GlobalNetwork,
  123.     Remembered,
  124.     Recent,
  125.     Context
  126.     // ReSharper restore UnusedMember.Global
  127.     // ReSharper restore UnusedMember.Global
  128. };
  129.  
  130. public enum ResourceType
  131. {
  132.     // ReSharper disable UnusedMember.Global
  133.     // ReSharper disable UnusedMember.Global
  134.     Any = 0,
  135.     Disk = 1,
  136.     Print = 2,
  137.     Reserved = 8,
  138.     // ReSharper restore UnusedMember.Global
  139.     // ReSharper restore UnusedMember.Global
  140. }
  141.  
  142. public enum ResourceDisplaytype
  143. {
  144.     // ReSharper disable UnusedMember.Global
  145.     // ReSharper disable UnusedMember.Global
  146.     Generic = 0x0,
  147.     Domain = 0x01,
  148.     Server = 0x02,
  149.     Share = 0x03,
  150.     File = 0x04,
  151.     Group = 0x05,
  152.     Network = 0x06,
  153.     Root = 0x07,
  154.     Shareadmin = 0x08,
  155.     Directory = 0x09,
  156.     Tree = 0x0a,
  157.     Ndscontainer = 0x0b
  158.     // ReSharper restore UnusedMember.Global
  159.     // ReSharper restore UnusedMember.Global
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement