utiliser le système ;
en utilisant System.Collections.Generic ;
en utilisant System.Text ;
en utilisant System.Security.Principal ;
en utilisant System.Runtime.InteropServices ;
classe publique usurper l'identité
{
#region 模拟
privé WindowsImpersonationContext impersonationContext ;
privé const int LOGON32_LOGON_INTERACTIVE = 2;
privé const int LOGON32_PROVIDER_DEFAULT = 0;
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private static 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 DuplicateToken (IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
bool externe statique privé RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
bool statique externe privé CloseHandle (descripteur IntPtr);
/// <résumé>
/// 模拟一个用户
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <param name="domain">域名/计算机名</param>
/// <returns>vrai 模拟成功,false 模拟失败</returns>
public bool ImpersonateUser (string userName, string password, string domain)
{
WindowsIdentité wi ;
Jeton IntPtr = IntPtr.Zero ;
IntPtr tokenDuplicate = IntPtr.Zero ;
si (RevertToSelf())
{
if (LogonUser (nom d'utilisateur, domaine, mot de passe,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, jeton de référence) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
wi = nouveau WindowsIdentity(tokenDuplicate);
impersonationContext = wi.Impersonate();
si (emprunt d'identitéContext != null)
{
CloseHandle(tokenDuplicate);
CloseHandle(jeton);
renvoie vrai ;
}
autre
{
if (tokenDuplicate != IntPtr.Zero) CloseHandle(tokenDuplicate);
if (token != IntPtr.Zero) CloseHandle(token);
renvoie faux ;
}
}
autre
{
if (token != IntPtr.Zero) CloseHandle(token);
renvoie faux ;
}
}
autre
renvoie faux ;
}
autre
renvoie faux ;
}
/// <résumé>
/// 取消模拟
/// </summary>
public void UndoImpersonation()
{
impersonationContext.Undo();
}
#endregion
#region 关机
[StructLayout(LayoutKind.Sequential, Pack = 1)]
structure privée TokPriv1Luid
{
public int Nombre ;
public long Luid;
public int Attr ;
}
[DllImport("kernel32.dll", ExactSpelling = true)]
externe statique privé IntPtr GetCurrentThread();
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
private static extern bool OpenThreadToken(IntPtr h, int acc, bool openAsSelf, ref IntPtr phtok);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LookupPrivilegeValue (hôte de chaîne, nom de chaîne, référence long pluid);
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
bool externe statique privé AdjustTokenPrivileges (IntPtr htok, bool disall, ref TokPriv1Luid newst,
int len, IntPtr prev, IntPtr relen);
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
private static extern bool ExitWindowsEx (int flg, int rea);
[DllImport("advapi32.dll")]
private static extern bool InitiateSystemShutdown(string Machinename, string Message,
long Timeout, bool ForceAppsClosed, bool RebootAfterShutdown);
privé const int SE_PRIVILEGE_ENABLED = 0x00000002;
privé const int TOKEN_QUERY = 0x00000008;
privé const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
chaîne const privée SE_SHUTDOWN_NAME = "SeShutdownPrivilege" ;
privé const int EWX_LOGOFF = 0x00000000 ;
const privé int EWX_SHUTDOWN = 0x00000001 ;
privé const int EWX_REBOOT = 0x00000002;
privé const int EWX_FORCE = 0x00000004;
privé const int EWX_POWEROFF = 0x00000008;
const privé int EWX_FORCEIFHUNG = 0x00000010 ;
/// <résumé>
/// 关机
/// </summary>
/// <retours></retours>
public bool Arrêter()
{
résultat booléen ;
TokPriv1Luid tp ;
// Nom : GetCurrentThread, GetCurrentProcess
IntPtr hproc = GetCurrentThread();
IntPtr htok = IntPtr.Zero ;
//注意:这里用的是OpenThreadToken(打开线程令牌),而不是OpenProcessToken(打开进程令牌)
résultat = OpenThreadToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
vrai, réf htok) ;
tp.Count = 1 ;
tp.Luid = 0 ;
tp.Attr = SE_PRIVILEGE_ENABLED ;
result = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
résultat = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
résultat = InitiateSystemShutdown("", "", 60, vrai, faux);
renvoyer le résultat ;
}
#endregion
}
http://www.cnblogs.com/anjou/archive/2006/11/30/577279.html