Guest User

Untitled

a guest
Jan 25th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. namespace Core.Impersonation
  2. {
  3. public class UserCredentials
  4. {
  5. private readonly string _domain;
  6. private readonly string _password;
  7. private readonly string _username;
  8.  
  9. public UserCredentials(string domain, string username, string password)
  10. {
  11. _domain = domain;
  12. _username = username;
  13. _password = password;
  14. }
  15.  
  16. public string Domain { get { return _domain; } }
  17. public string Username { get { return _username; } }
  18. public string Password { get { return _password; } }
  19. }
  20. public class UserImpersonation : IDisposable
  21. {
  22. private readonly IntPtr _dupeTokenHandle = new IntPtr(0);
  23. private readonly IntPtr _tokenHandle = new IntPtr(0);
  24. private WindowsImpersonationContext _impersonatedUser;
  25.  
  26. public UserImpersonation(UserCredentials credentials)
  27. {
  28. const int logon32ProviderDefault = 0;
  29. const int logon32LogonInteractive = 2;
  30. const int securityImpersonation = 2;
  31.  
  32. _tokenHandle = IntPtr.Zero;
  33. _dupeTokenHandle = IntPtr.Zero;
  34.  
  35. if (!Advapi32.LogonUser(credentials.Username, credentials.Domain, credentials.Password, logon32LogonInteractive, logon32ProviderDefault, out _tokenHandle))
  36. {
  37. var win32ErrorNumber = Marshal.GetLastWin32Error();
  38. throw new Exception(string.Format("{0}:{1}:{2}:{3}", win32ErrorNumber, new Win32Exception(win32ErrorNumber).Message, credentials.Username, credentials.Domain));
  39. }
  40.  
  41. if (!Advapi32.DuplicateToken(_tokenHandle, securityImpersonation, out _dupeTokenHandle))
  42. {
  43. var win32ErrorNumber = Marshal.GetLastWin32Error();
  44. Kernel32.CloseHandle(_tokenHandle);
  45. throw new Exception(string.Format("{0}:{1}:{2}:{3}", win32ErrorNumber, "Unable to duplicate token!", credentials.Username, credentials.Domain));
  46. }
  47.  
  48. var newId = new WindowsIdentity(_dupeTokenHandle);
  49. _impersonatedUser = newId.Impersonate();
  50. }
  51.  
  52. public void Dispose()
  53. {
  54. if (_impersonatedUser != null)
  55. {
  56. _impersonatedUser.Undo();
  57. _impersonatedUser = null;
  58.  
  59. if (_tokenHandle != IntPtr.Zero)
  60. Kernel32.CloseHandle(_tokenHandle);
  61.  
  62. if (_dupeTokenHandle != IntPtr.Zero)
  63. Kernel32.CloseHandle(_dupeTokenHandle);
  64. }
  65. }
  66. }
  67.  
  68. internal static class Advapi32
  69. {
  70. [DllImport("advapi32.dll", SetLastError = true)]
  71. public static extern bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, out IntPtr DuplicateTokenHandle);
  72.  
  73. [DllImport("advapi32.dll", SetLastError = true)]
  74. public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
  75. }
  76.  
  77. internal static class Kernel32
  78. {
  79. [DllImport("kernel32.dll", SetLastError = true)]
  80. [return: MarshalAs(UnmanagedType.Bool)]
  81. public static extern bool CloseHandle(IntPtr hObject);
  82. }
  83. }
Add Comment
Please, Sign In to add comment