Instantly share code, notes, and snippets.
Created
October 31, 2014 18:24
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
-
Save AlbertoMonteiro/9df3d20b30044fc38e96 to your computer and use it in GitHub Desktop.
Classe para permitir o acesso a diretorios na rede usando credenciais do Active Directory
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.ComponentModel; | |
| using System.Runtime.InteropServices; | |
| namespace ConsoleApplication5 | |
| { | |
| /// <summary> | |
| /// Provides access to a network share. | |
| /// </summary> | |
| public class NetworkShareAccesser : IDisposable | |
| { | |
| private string _remoteUncName; | |
| private string _remoteComputerName; | |
| public string RemoteComputerName | |
| { | |
| get | |
| { | |
| return this._remoteComputerName; | |
| } | |
| set | |
| { | |
| this._remoteComputerName = value; | |
| this._remoteUncName = @"\\" + this._remoteComputerName; | |
| } | |
| } | |
| public string UserName | |
| { | |
| get; | |
| set; | |
| } | |
| public string Password | |
| { | |
| get; | |
| set; | |
| } | |
| #region Consts | |
| private const int RESOURCE_CONNECTED = 0x00000001; | |
| private const int RESOURCE_GLOBALNET = 0x00000002; | |
| private const int RESOURCE_REMEMBERED = 0x00000003; | |
| private const int RESOURCETYPE_ANY = 0x00000000; | |
| private const int RESOURCETYPE_DISK = 0x00000001; | |
| private const int RESOURCETYPE_PRINT = 0x00000002; | |
| private const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000; | |
| private const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001; | |
| private const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002; | |
| private const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003; | |
| private const int RESOURCEDISPLAYTYPE_FILE = 0x00000004; | |
| private const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005; | |
| private const int RESOURCEUSAGE_CONNECTABLE = 0x00000001; | |
| private const int RESOURCEUSAGE_CONTAINER = 0x00000002; | |
| private const int CONNECT_INTERACTIVE = 0x00000008; | |
| private const int CONNECT_PROMPT = 0x00000010; | |
| private const int CONNECT_REDIRECT = 0x00000080; | |
| private const int CONNECT_UPDATE_PROFILE = 0x00000001; | |
| private const int CONNECT_COMMANDLINE = 0x00000800; | |
| private const int CONNECT_CMD_SAVECRED = 0x00001000; | |
| private const int CONNECT_LOCALDRIVE = 0x00000100; | |
| #endregion | |
| #region Errors | |
| private const int NO_ERROR = 0; | |
| private const int ERROR_ACCESS_DENIED = 5; | |
| private const int ERROR_ALREADY_ASSIGNED = 85; | |
| private const int ERROR_BAD_DEVICE = 1200; | |
| private const int ERROR_BAD_NET_NAME = 67; | |
| private const int ERROR_BAD_PROVIDER = 1204; | |
| private const int ERROR_CANCELLED = 1223; | |
| private const int ERROR_EXTENDED_ERROR = 1208; | |
| private const int ERROR_INVALID_ADDRESS = 487; | |
| private const int ERROR_INVALID_PARAMETER = 87; | |
| private const int ERROR_INVALID_PASSWORD = 1216; | |
| private const int ERROR_MORE_DATA = 234; | |
| private const int ERROR_NO_MORE_ITEMS = 259; | |
| private const int ERROR_NO_NET_OR_BAD_PATH = 1203; | |
| private const int ERROR_NO_NETWORK = 1222; | |
| private const int ERROR_BAD_PROFILE = 1206; | |
| private const int ERROR_CANNOT_OPEN_PROFILE = 1205; | |
| private const int ERROR_DEVICE_IN_USE = 2404; | |
| private const int ERROR_NOT_CONNECTED = 2250; | |
| private const int ERROR_OPEN_FILES = 2401; | |
| #endregion | |
| #region PInvoke Signatures | |
| [DllImport("Mpr.dll")] | |
| private static extern int WNetUseConnection( | |
| IntPtr hwndOwner, | |
| NETRESOURCE lpNetResource, | |
| string lpPassword, | |
| string lpUserID, | |
| int dwFlags, | |
| string lpAccessName, | |
| string lpBufferSize, | |
| string lpResult | |
| ); | |
| [DllImport("Mpr.dll")] | |
| private static extern int WNetCancelConnection2( | |
| string lpName, | |
| int dwFlags, | |
| bool fForce | |
| ); | |
| [StructLayout(LayoutKind.Sequential)] | |
| private class NETRESOURCE | |
| { | |
| public int dwScope = 0; | |
| public int dwType = 0; | |
| public int dwDisplayType = 0; | |
| public int dwUsage = 0; | |
| public string lpLocalName = ""; | |
| public string lpRemoteName = ""; | |
| public string lpComment = ""; | |
| public string lpProvider = ""; | |
| } | |
| #endregion | |
| /// <summary> | |
| /// Creates a NetworkShareAccesser for the given computer name using the given domain/computer name, username and password | |
| /// </summary> | |
| /// <param name="remoteComputerName"></param> | |
| /// <param name="domainOrComuterName"></param> | |
| /// <param name="userName"></param> | |
| /// <param name="password"></param> | |
| public static NetworkShareAccesser Access(string remoteComputerName, string domainOrComuterName, string userName, string password) | |
| { | |
| return new NetworkShareAccesser(remoteComputerName, string.Format("{0}\\{1}", domainOrComuterName, userName), password); | |
| } | |
| private NetworkShareAccesser(string remoteComputerName) | |
| { | |
| RemoteComputerName = remoteComputerName; | |
| this.ConnectToShare(this._remoteUncName, null, null, true); | |
| } | |
| private NetworkShareAccesser(string remoteComputerName, string userName, string password) | |
| { | |
| RemoteComputerName = remoteComputerName; | |
| UserName = userName; | |
| Password = password; | |
| this.ConnectToShare(this._remoteUncName, this.UserName, this.Password, false); | |
| } | |
| private void ConnectToShare(string remoteUnc, string username, string password, bool promptUser) | |
| { | |
| var nr = new NETRESOURCE | |
| { | |
| dwType = RESOURCETYPE_DISK, | |
| lpRemoteName = remoteUnc | |
| }; | |
| int result = promptUser | |
| ? WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null) | |
| : WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null); | |
| if (result != NO_ERROR) | |
| throw new Win32Exception(result); | |
| } | |
| private void DisconnectFromShare(string remoteUnc) | |
| { | |
| int result = WNetCancelConnection2(remoteUnc, CONNECT_UPDATE_PROFILE, false); | |
| if (result != NO_ERROR) | |
| { | |
| throw new Win32Exception(result); | |
| } | |
| } | |
| /// <summary> | |
| /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. | |
| /// </summary> | |
| /// <filterpriority>2</filterpriority> | |
| public void Dispose() | |
| { | |
| this.DisconnectFromShare(this._remoteUncName); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment