использование системы;
использование System.Collections.Generic;
использование System.Text;
использование System.Security.Principal;
использование System.Runtime.InteropServices;
публичный класс Олицетворять
{
#region 模拟
частный WindowsImpersonationContext impersonationContext;
частная константа int LOGON32_LOGON_INTERACTIVE = 2;
частная константа int LOGON32_PROVIDER_DEFAULT = 0;
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
частный статический extern 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)]
Private extern static int DuplateToken (IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
частный статический extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
Private extern static bool CloseHandle (дескриптор IntPtr);
/// <сводка>
/// 模拟一个用户
/// </сводка>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <param name="domain">域名/计算机名</param>
/// <returns>true 模拟成功, false 模拟失败</returns>
public bool ImpersonateUser (строковое имя пользователя, строковый пароль, строковый домен)
{
WindowsIdentity wi;
Токен IntPtr = IntPtr.Zero;
IntPtr tokenDuulate = IntPtr.Zero;
если (RevertToSelf())
{
if (LogonUser(имя пользователя, домен, пароль,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref-токен) != 0)
{
if (DuulateToken(token, 2, ref tokenDuplate) != 0)
{
wi = новый WindowsIdentity (tokenDuulate);
олицетворениеКонтекст = wi.Impersonate();
если (impersonationContext!= ноль)
{
CloseHandle (токенДупликат);
CloseHandle (токен);
вернуть истину;
}
еще
{
если (tokenDuplate! = IntPtr.Zero) CloseHandle(tokenDuulate);
если (токен!= IntPtr.Zero) CloseHandle(токен);
вернуть ложь;
}
}
еще
{
если (токен!= IntPtr.Zero) CloseHandle(токен);
вернуть ложь;
}
}
еще
вернуть ложь;
}
еще
вернуть ложь;
}
/// <сводка>
/// 取消模拟
/// </сводка>
общественная недействительность Отменить олицетворение()
{
олицетворениеКонтекст.Отменить();
}
#конечныйрегион
#регион 关机
[StructLayout(LayoutKind.Sequential, Pack = 1)]
частная структура TokPriv1Luid
{
общественный интервал Int Count;
публичный длинный Luid;
общественный интервал Attr;
}
[DllImport("kernel32.dll", ExactSpelling = true)]
частный статический extern IntPtr GetCurrentThread();
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
частный статический extern bool OpenThreadToken (IntPtr h, int acc, bool openAsSelf, ref IntPtr phtok);
[DllImport("advapi32.dll", SetLastError = true)]
Private static extern bool LookupPrivilegeValue (хост строки, имя строки, ref long pluid);
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
частный статический extern bool AdjustTokenPrivileges (IntPtr htok, bool disall, ref TokPriv1Luid newst,
int len, IntPtr prev, IntPtr relen);
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
частный статический extern bool ExitWindowsEx (int flg, int rea);
[DllImport("advapi32.dll")]
частный статический extern bool InitiateSystemShutdown (строка Имя машины, строка Сообщение,
long Timeout, bool ForceAppsClosed, bool RebootAfterShutdown);
частная константа int SE_PRIVILEGE_ENABLED = 0x00000002;
частная константа int TOKEN_QUERY = 0x00000008;
частная константа int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
частная константная строка SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
частная константа int EWX_LOGOFF = 0x00000000;
частная константа int EWX_SHUTDOWN = 0x00000001;
частная константа int EWX_REBOOT = 0x00000002;
частная константа int EWX_FORCE = 0x00000004;
частная константа int EWX_POWEROFF = 0x00000008;
частная константа int EWX_FORCEIFHUNG = 0x00000010;
/// <сводка>
/// 关机
/// </сводка>
/// <возвращается></возвращается>
общественное логическое выключение()
{
логический результат;
TokPriv1Luid тп;
//Поддержка: функция GetCurrentThread, функция GetCurrentProcess
IntPtr hproc = GetCurrentThread();
IntPtr htok = IntPtr.Zero;
//Поддержка:Поддержка OpenThreadToken(打开线程令牌),Поддержка OpenProcessToken(打开进程令牌)
результат = OpenThreadToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
правда, ссылка htok);
tp.Count = 1;
тп.Луид = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
результат = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
результат = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
результат = InitiateSystemShutdown("", "", 60, правда, ложь);
вернуть результат;
}
#конечныйрегион
}
http://www.cnblogs.com/anjou/archive/2006/11/30/577279.html