96 lines
2.8 KiB
C#
96 lines
2.8 KiB
C#
using System.Runtime.InteropServices;
|
||
|
||
namespace YLErp.Helpers
|
||
{
|
||
public class IdentityScope : IDisposable
|
||
{
|
||
|
||
// obtains user token
|
||
[DllImport("advapi32.dll", SetLastError = true)]
|
||
static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
|
||
|
||
// closes open handes returned by LogonUser
|
||
|
||
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
|
||
|
||
extern static bool CloseHandle(IntPtr handle);
|
||
|
||
|
||
[DllImport("Advapi32.DLL")]
|
||
static extern bool ImpersonateLoggedOnUser(IntPtr hToken);
|
||
|
||
[DllImport("Advapi32.DLL")]
|
||
static extern bool RevertToSelf();
|
||
|
||
const int LOGON32_PROVIDER_DEFAULT = 0;
|
||
|
||
const int LOGON32_LOGON_NEWCREDENTIALS = 9;//域ò控?中D的?需è要a用?:Interactive = 2
|
||
|
||
private bool disposed;
|
||
|
||
/// <summary>
|
||
/// 登?录?
|
||
/// </summary>
|
||
/// <param name="sUsername">用?户§名?</param>
|
||
/// <param name="sDomain">域ò名?,?如?果?不?在ú域ò中D就í使1用?机ú器÷IP地?址·</param>
|
||
/// <param name="sPassword">密ü码?</param>
|
||
public IdentityScope(string sUsername, string sDomain, string sPassword)
|
||
{
|
||
|
||
// initialize tokens
|
||
IntPtr pExistingTokenHandle = new IntPtr(0);
|
||
IntPtr pDuplicateTokenHandle = new IntPtr(0);
|
||
try
|
||
{
|
||
|
||
// get handle to token
|
||
bool bImpersonated = LogonUser(sUsername, sDomain, sPassword, LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);
|
||
if (true == bImpersonated)
|
||
{
|
||
if (!ImpersonateLoggedOnUser(pExistingTokenHandle))
|
||
{
|
||
int nErrorCode = Marshal.GetLastWin32Error();
|
||
throw new Exception("ImpersonateLoggedOnUser error;Code=" + nErrorCode);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
int nErrorCode = Marshal.GetLastWin32Error();
|
||
throw new Exception("LogonUser error;Code=" + nErrorCode);
|
||
|
||
}
|
||
|
||
}
|
||
finally
|
||
{
|
||
// close handle(s)
|
||
if (pExistingTokenHandle != IntPtr.Zero)
|
||
|
||
CloseHandle(pExistingTokenHandle);
|
||
|
||
if (pDuplicateTokenHandle != IntPtr.Zero)
|
||
|
||
CloseHandle(pDuplicateTokenHandle);
|
||
}
|
||
|
||
}
|
||
|
||
protected virtual void Dispose(bool disposing)
|
||
{
|
||
|
||
if (!disposed)
|
||
{
|
||
RevertToSelf();
|
||
disposed = true;
|
||
}
|
||
|
||
}
|
||
|
||
public void Dispose()
|
||
{
|
||
Dispose(true);
|
||
}
|
||
|
||
}
|
||
}
|