システムを使用する;
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)]
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)]
private static 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(string ユーザー名、string パスワード、string ドメイン)
{
WindowsIdentity wi;
IntPtr トークン = IntPtr.Zero;
IntPtr トークン重複 = IntPtr.Zero;
if (RevertToSelf())
{
if (LogonUser(ユーザー名、ドメイン、パスワード、
Logon32_LOGON_INTERACTIVE、LOGON32_PROVIDER_DEFAULT、参照トークン) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
wi = 新しい WindowsIdentity(tokenDuplicate);
impersonationContext = wi.Impersonate();
if (impersonationContext != null)
{
CloseHandle(tokenDuplicate);
CloseHandle(トークン);
true を返します。
}
それ以外
{
if (tokenDuplicate != IntPtr.Zero) CloseHandle(tokenDuplicate);
if (トークン != IntPtr.Zero) CloseHandle(トークン);
false を返します。
}
}
それ以外
{
if (トークン != IntPtr.Zero) CloseHandle(トークン);
false を返します。
}
}
それ以外
false を返します。
}
それ以外
false を返します。
}
/// <概要>
/// 取消模拟
/// </概要>
public void UndoImpersonation()
{
impersonationContext.Undo();
}
#endregion
#region 关机
[StructLayout(LayoutKind.Sequential, Pack = 1)]
プライベート構造体 TokPriv1Luid
{
public int カウント;
パブリックロングLid。
public int 属性;
[DllImport("kernel32.dll", ExactSpelling = true)
]
プライベート静的 extern 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(文字列ホスト、文字列名、ref long pluid);
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
private static extern bool 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 マシン名, string メッセージ,
長いタイムアウト、ブール値 ForceAppsClosed、ブール値 RebootAfterShutdown);
プライベート const int SE_PRIVILEGE_ENABLED = 0x00000002;
プライベート const int TOKEN_QUERY = 0x00000008;
プライベート const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
private const string 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;
/// <概要>
/// 关机
/// </概要>
/// <戻り値></戻り値>
public bool ShutDown()
{
ブール値の結果;
TokPriv1Luid tp;
//注意: ここで使用するのは GetCurrentThread であり、GetCurrentProcess ではありません
IntPtr hproc = GetCurrentThread();
IntPtr htok = IntPtr.Zero;
//注意:ここで使用するのは OpenProcessToken(打开进程令牌)ではなく、OpenThreadToken(打开線程令牌)です。
result = OpenThreadToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
true、参照 htok);
tp.Count = 1;
tp.Luid = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
result = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
result = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
result = InitiateSystemShutdown("", "", 60, true, false);
結果を返します。
}
#エンドリージョン
}
http://www.cnblogs.com/anjou/archive/2006/11/30/577279.html