usar sistema;
usar System.Runtime.InteropServices;
usar System.Security.Principal;
usar System.Security.Permissions;
seguridad pública de la clase
{
tokenHandle privado de IntPtr = nuevo IntPtr (0);
impersonatedUser privado de WindowsImpersonationContext;
[DllImport (“kernel32.dll”)]
bool extern estático CloseHandle (manija de IntPtr);
Arnés de prueba de //.
// si usted incorpora este código en un DLL, esté seguro de exigir FullTrust.
[PermissionSetAttribute (SecurityAction.Demand, nombre = “FullTrust”)]
bool público ImpersonateStart (sDomainName de la secuencia, username de la secuencia, contraseña de la secuencia)
{
returnValue del bool;
newId = falta de información de WindowsIdentity;
intento
{
tokenHandle = IntPtr.Zero;
Llamada LogonUser de // para obtener una manija a un símbolo del acceso.
returnValue = falso;
const internacional LOGON32_PROVIDER_DEFAULT = 0;
el parámetro de //This hace LogonUser crear un símbolo primario.
const internacional LOGON32_LOGON_INTERACTIVE = 2;
returnValue = LogonUser (username, sDomainName, tokenHandle de la contraseña, de LOGON32_LOGON_INTERACTIVE, de LOGON32_PROVIDER_DEFAULT, de la referencia);
cheque de // si conexión acertada
si ((== del returnValue falso))
{
la internacional enría = Marshal.GetLastWin32Error ();
tiro nuevo System.ComponentModel.Win32Exception (enriar);
}
{
La conexión de // tuvo éxito
Uso de // que la manija simbólica volvió por LogonUser.
newId = nuevo WindowsIdentity (tokenHandle);
impersonatedUser = newId.Impersonate ();
}
}
retén (excepción ex)
{
ex = falta de información;
returnValue = falso;
}
finalmente
{
¡si (! (falta de información del == del newId))
{
newId.Dispose ();
newId = falta de información;
}
}
returnValue de vuelta;
}
[PermissionSetAttribute (SecurityAction.Demand, nombre = “FullTrust”)]
público ImpersonateStop vacío ()
{
intento
{
Parada de // que personifica al usuario.
impersonatedUser.Undo ();
// libera los símbolos.
¡si (tokenHandle! = IntPtr.Zero)
{
CloseHandle (tokenHandle);
}
}
retén (vuelta de System.Exception)
{
}
}
[DllImport (“advapi32.dll”, SetLastError = verdad, CharSet = CharSet.Unicode)]
bool extern estático público LogonUser (lpszUsername de la secuencia, lpszDomain de la secuencia, lpszPassword de la secuencia,
el dwLogonType de la internacional, dwLogonProvider de la internacional, referencia IntPtr phToken);
}
|