باستخدام النظام؛
باستخدام System.Collections.Generic؛
باستخدام System.Text؛
باستخدام System.Security.Principal؛
باستخدام System.Runtime.InteropServices؛
انتحال شخصية الطبقة العامة
{
#المنطقة
خاص WindowsImpersonationContext impersonationContext;
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, ref IntPtr phToken);
[DllImport("advapi32.dll"، CharSet = System.Runtime.InteropServices.CharSet.Auto، SetLastError = true)]
خاص خارجي ثابت int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll"، CharSet = CharSet.Auto، SetLastError = true)]
المنطق المنطقي الخارجي الثابت الخاص RevertToSelf();
[DllImport("kernel32.dll"، CharSet = CharSet.Auto)]
منطق منطقي ثابت خارجي خاص CloseHandle(IntPtr Handle);
/// <الملخص>
/// 模拟一个用户
/// </الملخص>
/// <param name="userName">اسم المستخدم</param>
/// <param name="password">密码</param>
/// <param name="domain">域名/计算机名</param>
/// <returns>صحيح، خطأ، خطأ</returns>
المنطق العام ImpersonateUser (اسم مستخدم السلسلة، كلمة مرور السلسلة، مجال السلسلة)
{
WindowsIdentity واي؛
رمز IntPtr = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
إذا (RevertToSelf ())
{
إذا (LogonUser(اسم المستخدم، المجال، كلمة المرور،
LOGON32_LOGON_INTERACTIVE، LOGON32_PROVIDER_DEFAULT، الرمز المميز) != 0)
{
إذا (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
wi = new WindowsIdentity(tokenDuplicate);
impersonationContext = wi.Impersonate();
إذا (انتحال كونتيكست! = فارغ)
{
CloseHandle(tokenDuplicate);
CloseHandle(token);
عودة صحيحة؛
}
آخر
{
if (tokenDuplicate != IntPtr.Zero) CloseHandle(tokenDuplicate);
if (token!= IntPtr.Zero) CloseHandle(token);
عودة كاذبة.
}
}
آخر
{
if (token!= IntPtr.Zero) CloseHandle(token);
عودة كاذبة.
}
}
آخر
عودة كاذبة.
}
آخر
عودة كاذبة.
}
/// <الملخص>
/// 取消模拟
/// </الملخص>
الفراغ العام UndoImpersonation ()
{
impersonationContext.Undo();
}
#endregion
#region 关机
[StructLayout(LayoutKind.Sequential, Pack = 1)]
البنية الخاصة TokPriv1Luid
{
عدد العمليات العامة؛
لويد طويل عام؛
كثافة العمليات العامة؛
}
[DllImport("kernel32.dll"، ExactSpelling = صحيح)]
خاص ثابت خارجي IntPtr GetCurrentThread();
[DllImport("advapi32.dll"، ExactSpelling = صحيح، SetLastError = صحيح)]
المنطق المنطقي الخارجي الثابت الخاص OpenThreadToken(IntPtr h, int acc, bool openAsSelf, ref IntPtr phtok);
[DllImport("advapi32.dll"، SetLastError = صحيح)]
منطق منطقي خارجي ثابت خاص LookupPrivilegeValue(string host, string name, ref long pluid);
[DllImport("advapi32.dll"، ExactSpelling = صحيح، SetLastError = صحيح)]
منطقي خارجي ثابت خاص AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst,
int len، IntPtr prev، IntPtr relen)؛
[DllImport("user32.dll"، ExactSpelling = صحيح، SetLastError = صحيح)]
المنطق المنطقي الخارجي الثابت الخاص ExitWindowsEx(int flg, int rea);
[DllImport("advapi32.dll")]
منطقي خارجي ثابت خاص InitiateSystemShutdown (سلسلة اسم الآلة، سلسلة رسالة،
مهلة طويلة، bool ForceAppsClosed، bool RebootAfterShutdown)؛
const الخاص int SE_PRIVILEGE_ENABLED = 0x00000002;
const الخاص int TOKEN_QUERY = 0x00000008؛
const الخاص int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
سلسلة ثابتة خاصة 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;
/// <الملخص>
/// 关机
/// </الملخص>
/// <returns></returns>
إيقاف تشغيل المنطق العام ()
{
نتيجة منطقية؛
TokPriv1Luid tp;
// المصدر: عنوان URL لـ 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);
result = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
النتيجة = InitiateSystemShutdown(""، ""، 60، صحيح، خطأ)؛
نتيجة الإرجاع؛
}
#endregion
}
http://www.cnblogs.com/anjou/archive/2006/11/30/577279.html