Create a new page in your App_Code folder and paste the following code there:
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
[assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode = true)]
[assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
public class CustomImpersonation
{
#region Fields
private IntPtr tokenHandle = new IntPtr(0);
private IntPtr dupeTokenHandle = new IntPtr(0);
private WindowsImpersonationContext impersonationContext;
#endregion
#region Ctor
public CustomImpersonation() : base() { }
#endregion
#region Extern Public Methods
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
//[DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
//private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr lpSource,
// int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, IntPtr* Arguments);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
#endregion
#region Public Methods
///
/// Pass user account you wish to impersonate.
///
///
///
///
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
public void Impersonate(string userName, string password, string domainName)
{
try
{
const int LOGON32_PROVIDER_DEFAULT = 0;
//This parameter causes LogonUser to create a primary token.
const int LOGON32_LOGON_INTERACTIVE = 2;
this.tokenHandle = IntPtr.Zero;
// Call LogonUser to obtain a handle to an access token.
bool returnValue = LogonUser(userName, domainName, password,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
ref tokenHandle);
if (false == returnValue)
{
int ret = Marshal.GetLastWin32Error();
throw new System.ComponentModel.Win32Exception(ret);
}
// Use the token handle returned by LogonUser.
WindowsIdentity newId = new WindowsIdentity(tokenHandle);
this.impersonationContext = newId.Impersonate();
}
catch (Exception ex)
{
throw ex;
}
}
///
/// Stop impersonating the user.
///
///
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
public void Undo()
{
this.impersonationContext.Undo();
// Free the tokens.
if (this.tokenHandle != IntPtr.Zero)
CloseHandle(this.tokenHandle);
}
#endregion
}
//create new instance
CustomImpersonation myImpersonation = new CustomImpersonation();
try
{
// start impersonation
myImpersonation.Impersonate("username","password","domain");
//put the code you want to run while impersonating the user account here
} catch(Exception ex) {
throw ex;
} finally {
myImpersonation.Undo();
}
No comments:
Post a Comment