使用系統;
使用 System.Collections.Generic;
使用系統文字;
使用 System.Security.Principal;
使用 System.Runtime.InteropServices;
公開課模仿
{
#region 模擬
私有 WindowsImpersonationContext 模擬上下文;
私有常數 int LOGON32_LOGON_INTERACTIVE = 2;
私有常數 int LOGON32_PROVIDER_DEFAULT = 0;
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
私有靜態 extern int LogonUser(字串 lpszUserName, 字串 lpszDomain, 字串 lpszPassword,
int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport(“advapi32.dll”,CharSet = System.Runtime.InteropServices.CharSet.Auto,SetLastError = true)]
私有 extern static int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
私有靜態 extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
私有 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 無線;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf())
{
if (LogonUser(使用者名稱, 網域, 密碼,
LOGON32_LOGON_INTERACTIVE、LOGON32_PROVIDER_DEFAULT、參考令牌)!
{
if (DuplicateToken(令牌, 2, 參考 tokenDuplicate) != 0)
{
wi = new WindowsIdentity(tokenDuplicate);
impersonationContext = wi.Impersonate();
if (impersonationContext != null)
{
關閉句柄(tokenDuplicate);
關閉句柄(令牌);
返回真;
}
別的
{
if (tokenDuplicate != IntPtr.Zero) CloseHandle(tokenDuplicate);
if (token!= IntPtr.Zero) CloseHandle(token);
返回假;
}
}
別的
{
if (token!= IntPtr.Zero) CloseHandle(token);
返回假;
}
}
別的
返回假;
}
別的
返回假;
}
/// <摘要>
/// 取消模擬
/// </摘要>
公共無效撤銷模擬()
{
impersonationContext.Undo();
}
#endregion
#region 關閉
[StructLayout(LayoutKind.Sequential, Pack = 1)]
私有結構 TokPriv1Luid
{
公共 int 計數;
公眾長Luid;
公共 int 屬性;
[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(string host, string name, ref long pluid);
[DllImport(“advapi32.dll”,ExactSpelling = true,SetLastError = true)]
私人靜態外部布爾AdjustTokenPrivileges(IntPtr htok,布爾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(string Machinename, string Message,
長超時,布爾 ForceAppsClosed,布爾 RebootAfterShutdown);
私有常數 int SE_PRIVILEGE_ENABLED = 0x00000002;
私有常數 int TOKEN_QUERY = 0x00000008;
私有常數 int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
私有 const string 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 tp;
//注意:這裡用的是GetCurrentThread,而不是GetCurrentProcess
IntPtr hproc = GetCurrentThread();
IntPtr htok = IntPtr.Zero;
//注意:這裡用的是OpenThreadToken(開啟執行緒令牌),而不是OpenProcessToken(開啟進程令牌)
結果 = OpenThreadToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
正確,參考 htok);
tp.Count = 1;
tp.Luid = 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, true, false);
返回結果;
}
#endregion
}
http://www.cnblogs.com/anjou/archive/2006/11/30/577279.html