Wednesday, January 22, 2014

C#_Impersonator Use Another Account to run

// call the Impersonator try { using (new Impersonator("name", "domain", "password")) { string dtsPath = O_926_MIM_Imagine_Import.Project_Path + @"\Import_Imagine.dtsx"; Dictionary conn = new Dictionary(); string message = ""; if (Util.RunDTS(dtsPath, conn, out message)) { this.m_result.Message = dtsPath + " completed successfully."; } else { this.m_result.Message = dtsPath + " failed." + Environment.NewLine + message; this.m_result.Type = StepResultType.Error; } } } catch (Exception ex) { this.m_result.Message = ex.Message; this.m_result.Type = StepResultType.Error; } } //define the Impersonator using System; using System.Security.Principal; using System.Runtime.InteropServices; using System.ComponentModel; namespace SomeNameSpace.Core { public class Impersonator : IDisposable { /// /// Constructor. Starts the impersonation with the given credentials. /// Please note that the account that instantiates the Impersonator class /// needs to have the 'Act as part of operating system' privilege set. /// /// The name of the user to act as. /// The domain name of the user to act as. /// The password of the user to act as. public Impersonator( string userName, string domainName, string password) { ImpersonateValidUser(userName, domainName, password); } public void Dispose() { UndoImpersonation(); } #region P/Invoke. [DllImport("advapi32.dll", SetLastError = true)] private static extern int LogonUser( string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int DuplicateToken( IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool RevertToSelf(); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] private static extern bool CloseHandle( IntPtr handle); private const int LOGON32_LOGON_INTERACTIVE = 2; private const int LOGON32_LOGON_NetworkClearText = 8; private const int LOGON32_PROVIDER_DEFAULT = 0; #endregion #region Private member. // ------------------------------------------------------------------ /// /// Does the actual impersonation. /// /// The name of the user to act as. /// The domain name of the user to act as. /// The password of the user to act as. private void ImpersonateValidUser( string _userName, string _domain, string _password) { WindowsIdentity tempWindowsIdentity = null; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero; try { if (RevertToSelf()) { if (LogonUser( _userName, _domain, _password, LOGON32_LOGON_NetworkClearText, LOGON32_PROVIDER_DEFAULT, ref token) != 0) { if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) { tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); impersonationContext = tempWindowsIdentity.Impersonate(); } else { throw new Win32Exception(Marshal.GetLastWin32Error()); } } else { throw new Win32Exception(Marshal.GetLastWin32Error()); } } else { throw new Win32Exception(Marshal.GetLastWin32Error()); } } finally { if (token != IntPtr.Zero) { CloseHandle(token); } if (tokenDuplicate != IntPtr.Zero) { CloseHandle(tokenDuplicate); } } } /// /// Reverts the impersonation. /// private void UndoImpersonation() { if (impersonationContext != null) { impersonationContext.Undo(); } } private WindowsImpersonationContext impersonationContext = null; // ------------------------------------------------------------------ #endregion } }