using o sistema;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
segurança pública da classe
{
tokenHandle confidencial de IntPtr = IntPtr novo (0);
impersonatedUser confidencial de WindowsImpersonationContext;
[DllImport (“kernel32.dll”)]
bool extern de estática CloseHandle (punho de IntPtr);
Chicote de fios de teste de //.
// se você incorpora este código em um DLL, seja certo exijir FullTrust.
[PermissionSetAttribute (SecurityAction.Demand, nome = “FullTrust”)]
bool público ImpersonateStart (sDomainName da corda, username da corda, senha da corda)
{
returnValue do bool;
newId = zero de WindowsIdentity;
tentativa
{
tokenHandle = IntPtr.Zero;
Chamada LogonUser de // para obter um punho a um símbolo do acesso.
returnValue = falso;
const int LOGON32_PROVIDER_DEFAULT = 0;
o parâmetro de //This faz com que LogonUser crie um símbolo preliminar.
const int LOGON32_LOGON_INTERACTIVE = 2;
returnValue = LogonUser (username, sDomainName, tokenHandle da senha, do LOGON32_LOGON_INTERACTIVE, do LOGON32_PROVIDER_DEFAULT, da referência);
verificação de // se início de uma sessão bem sucedido
se ((== do returnValue falso))
{
o int ret = Marshal.GetLastWin32Error ();
lance System.ComponentModel.Win32Exception novo (ret);
}
mais
{
Início de uma sessão de // sucedido
Uso que de // o punho simbólico retornou por LogonUser.
newId = WindowsIdentity novo (tokenHandle);
impersonatedUser = newId.Impersonate ();
}
}
prendedor (exceção ex)
{
ex = zero;
returnValue = falso;
}
finalmente
{
se (! (zero do == do newId))
{
newId.Dispose ();
newId = zero;
}
}
returnValue do retorno;
}
[PermissionSetAttribute (SecurityAction.Demand, nome = “FullTrust”)]
público ImpersonateStop vago ()
{
tentativa
{
Batente de // que impersonating o usuário.
impersonatedUser.Undo ();
// livra os símbolos.
se (tokenHandle! = IntPtr.Zero)
{
CloseHandle (tokenHandle);
}
}
prendedor (retorno de System.Exception)
{
}
}
[DllImport (“advapi32.dll”, SetLastError = retificam, CharSet = CharSet.Unicode)]
bool extern de estática público LogonUser (lpszUsername da corda, lpszDomain da corda, lpszPassword da corda,
o dwLogonType do int, dwLogonProvider do int, referência IntPtr phToken);
}
|