ใช้ระบบ;
ใช้ System.Collections.Generic;
ใช้ System.Text;
ใช้ System.Security.Principal;
โดยใช้ System.Runtime.InteropServices;
การเลียนแบบชั้นเรียนสาธารณะ
-
#ภูมิภาค模拟
ส่วนตัว WindowsImpersonationContext การเลียนแบบ Context;
ส่วนตัว const int LOGON32_LOGON_INTERACTIVE = 2;
ส่วนตัว const int LOGON32_PROVIDER_DEFAULT = 0;
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
ส่วนตัวคงที่ภายนอก int LogonUser (สตริง lpszUserName, สตริง lpszDomain, สตริง lpszPassword,
int dwLogonType, int dwLogonProvider, อ้างอิง IntPtr phToken);
[DllImport("advapi32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
ส่วนตัวภายนอกคงที่ int DuplicateToken (IntPtr hToken, int impersonationLevel, อ้างอิง IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
บูลภายนอกแบบคงที่ส่วนตัว RevertToSelf ();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
บูลคงที่ภายนอกส่วนตัว CloseHandle (ตัวจัดการ IntPtr);
/// <สรุป>
/// 模拟一个用户
/// สรุป>
/// 用户名
/// 密码
/// 域名/计算机名
///
บูลสาธารณะ ImpersonateUser (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง, โดเมนสตริง)
-
WindowsIdentity พร้อม;
โทเค็น IntPtr = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.ศูนย์;
ถ้า (RevertToSelf())
-
ถ้า (LogonUser(ชื่อผู้ใช้, โดเมน, รหัสผ่าน,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, โทเค็นอ้างอิง) != 0)
-
ถ้า (DuplicateToken (โทเค็น, 2, อ้างอิง tokenDuplicate) != 0)
-
wi = WindowsIdentity ใหม่ (tokenDuplicate);
impersonationContext = wi.Impersonate ();
ถ้า (impersonationContext != null)
-
CloseHandle (โทเค็นซ้ำ);
CloseHandle(โทเค็น);
กลับเป็นจริง;
-
อื่น
-
ถ้า (tokenDuplicate ! = IntPtr.Zero) CloseHandle (tokenDuplicate);
ถ้า (โทเค็น! = IntPtr.Zero) CloseHandle (โทเค็น);
กลับเท็จ;
-
-
อื่น
-
ถ้า (โทเค็น! = IntPtr.Zero) CloseHandle (โทเค็น);
กลับเท็จ;
-
-
อื่น
กลับเท็จ;
-
อื่น
กลับเท็จ;
}
/// <สรุป>
/// 取消模拟
/// สรุป>
โมฆะสาธารณะ UndoImpersonation()
-
การเลียนแบบ Context.Undo();
-
#endregion
#ภูมิภาค 关机
[StructLayout(LayoutKind.Sequential, Pack = 1)]
โครงสร้างส่วนตัว TokPriv1Luid
-
จำนวน int สาธารณะ;
สาธารณะยาว Luid;
มหาชน int Attr;
}
[DllImport("kernel32.dll", ExactSpelling = true)]
ส่วนตัวคงที่ภายนอก IntPtr GetCurrentThread();
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
บูลภายนอกแบบคงที่ส่วนตัว OpenThreadToken (IntPtr h, int acc, บูล openAsSelf, อ้างอิง IntPtr phtok);
[DllImport("advapi32.dll", SetLastError = true)]
ส่วนตัวบูลภายนอกแบบคงที่ LookupPrivilegeValue (โฮสต์สตริง, ชื่อสตริง, อ้างอิง pluid แบบยาว);
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
บูลภายนอกแบบคงที่ส่วนตัว AdjustTokenPrivileges (IntPtr htok, บูล disall, อ้างอิง TokPriv1Luid newst,
int len, IntPtr ก่อนหน้า, IntPtr relen);
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
บูลภายนอกแบบคงที่ส่วนตัว ExitWindowsEx (int flg, int rea);
[DllImport("advapi32.dll")]
บูลภายนอกแบบคงที่ส่วนตัว InitiateSystemShutdown (ชื่อเครื่องสตริง, ข้อความสตริง,
หมดเวลานาน, บูล ForceAppsClosed, บูล RebootAfterShutdown);
ส่วนตัว const int SE_PRIVILEGE_ENABLED = 0x00000002;
ส่วนตัว const int TOKEN_QUERY = 0x00000008;
ส่วนตัว const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
สตริง const ส่วนตัว SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
ส่วนตัว const int EWX_LOGOFF = 0x00000000;
ส่วนตัว const int EWX_SHUTDOWN = 0x00000001;
ส่วนตัว const int EWX_REBOOT = 0x00000002;
ส่วนตัว const int EWX_FORCE = 0x00000004;
ส่วนตัว const int EWX_POWEROFF = 0x00000008;
ส่วนตัว const int EWX_FORCEIFHUNG = 0x00000010;
/// <สรุป>
/// 关机
/// สรุป>
/// <ส่งคืน>ส่งคืน>
บูลสาธารณะปิดตัวลง ()
-
ผลลัพธ์บูล;
TokPriv1Luid tp;
// 注意: 这里用的是GetCurrentThread, 而不是GetCurrentProcess
IntPtr hproc = GetCurrentThread();
IntPtr htok = IntPtr.ศูนย์;
// 注意: 这里用的是OpenThreadToken(打里令牌),而不是OpenProcessToken(打里程令牌)
ผลลัพธ์ = OpenThreadToken (hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
จริง อ้างอิง htok);
tp.นับ = 1;
tp.ลุยด์ = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
ผลลัพธ์ = LookupPrivilegeValue (null, SE_SHUTDOWN_NAME, อ้างอิง 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