usando Sistema;
usando System.Collections.Generic;
usando System.Text;
usando System.Security.Principal;
usando System.Runtime.InteropServices;
clase pública suplantar
{
#región
privado WindowsImpersonationContext impersonationContext;
constante privada int LOGON32_LOGON_INTERACTIVE = 2;
constante privada int LOGON32_PROVIDER_DEFAULT = 0;
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
privado estático externo int LogonUser (String lpszUserName, String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
privado externo estático int DuplicateToken (IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = verdadero)]
bool externo estático privado RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
bool estático externo privado CloseHandle (identificador IntPtr);
/// <resumen>
/// 模拟一个用户
/// </summary>
/// <param nombre="nombredeusuario">用户名</param>
/// <param nombre="contraseña">密码</param>
/// <param nombre="dominio">域名/计算机名</param>
/// <returns>true 模拟成功,false 模拟失败</returns>
public bool ImpersonateUser(nombre de usuario de cadena, contraseña de cadena, dominio de cadena)
{
WindowsIdentidad wi;
Token IntPtr = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
si (RevertToSelf())
{
if (LogonUser(nombre de usuario, dominio, contraseña,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, token de referencia) != 0)
{
si (DuplicateToken(token, 2, ref tokenDuplicate)! = 0)
{
wi = nueva WindowsIdentity(tokenDuplicate);
impersonationContext = wi.Impersonate();
si (suplantaciónContexto! = nulo)
{
CloseHandle(tokenDuplicate);
CloseHandle(token);
devolver verdadero;
}
demás
{
si (tokenDuplicate! = IntPtr.Zero) CloseHandle (tokenDuplicate);
if (token! = IntPtr.Zero) CloseHandle(token);
devolver falso;
}
}
demás
{
if (token! = IntPtr.Zero) CloseHandle(token);
devolver falso;
}
}
demás
devolver falso;
}
demás
devolver falso;
}
/// <resumen>
/// 取消模拟
/// </summary>
vacío público DeshacerImpersonación()
{
personationContext.Undo();
}
#endregion
#region
[StructLayout(LayoutKind.Sequential, Paquete = 1)]
estructura privada TokPriv1Luid
{
recuento público int;
público largo Luid;
atributo int público;
}
[DllImport("kernel32.dll", ExactSpelling = true)]
privado estático externo IntPtr GetCurrentThread();
[DllImport("advapi32.dll", ExactSpelling = verdadero, SetLastError = verdadero)]
bool externo estático privado OpenThreadToken (IntPtr h, int acc, bool openAsSelf, ref IntPtr phtok);
[DllImport("advapi32.dll", SetLastError = verdadero)]
bool externo estático privado LookupPrivilegeValue (host de cadena, nombre de cadena, pluid largo de referencia);
[DllImport("advapi32.dll", ExactSpelling = verdadero, SetLastError = verdadero)]
bool externo estático privado AjustarTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst,
int len, IntPtr prev, IntPtr relen);
[DllImport("user32.dll", ExactSpelling = verdadero, SetLastError = verdadero)]
bool externo estático privado ExitWindowsEx(int flg, int rea);
[DllImport ("advapi32.dll")]
bool externo estático privado InitiateSystemShutdown (cadena Nombre de la máquina, cadena Mensaje,
tiempo de espera largo, bool ForceAppsClosed, bool RebootAfterShutdown);
constante privada int SE_PRIVILEGE_ENABLED = 0x00000002;
constante privada int TOKEN_QUERY = 0x00000008;
constante privada int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
cadena constante privada SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
constante privada int EWX_LOGOFF = 0x00000000;
constante privada int EWX_SHUTDOWN = 0x00000001;
constante privada int EWX_REBOOT = 0x00000002;
constante privada int EWX_FORCE = 0x00000004;
constante privada int EWX_POWEROFF = 0x00000008;
constante privada int EWX_FORCEIFHUNG = 0x00000010;
/// <resumen>
/// 关机
/// </summary>
/// <devoluciones></devoluciones>
bool público Apagar()
{
resultado booleano;
TokPriv1Luid tp;
//注意:这里用的是GetCurrentThread,而不是GetCurrentProcess
IntPtr hproc = GetCurrentThread();
IntPtr htok = IntPtr.Cero;
//注意:这里用的是OpenThreadToken(打开线程令牌),而不是OpenProcessToken(打开进程令牌)
resultado = OpenThreadToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
verdadero, ref htok);
tp.Contar = 1;
tp.Luid = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
resultado = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
resultado = AjustarTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
resultado = InitiateSystemShutdown("", "", 60, verdadero, falso);
resultado de devolución;
}
#regiónfinal
}
http://www.cnblogs.com/anjou/archive/2006/11/30/577279.html