标签:lookup system long ast host kernel32 current arch stat
namespace System {
/*
参考://https://www.cnblogs.com/banhua/archive/2012/07/13/2590920.html
*/ using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; class SystemUtil { [StructLayout(LayoutKind.Sequential,Pack = 1)] struct TokPriv1Luid { public int Count; public long Luid; public int Attr; } [DllImport("kernel32.dll",ExactSpelling = true)] static extern IntPtr GetCurrentProcess(); [DllImport("advapi32.dll",ExactSpelling = true,SetLastError = true)] static extern bool OpenProcessToken(IntPtr h,int acc,ref IntPtr phtok); [DllImport("advapi32.dll",SetLastError = true)] static extern bool LookupPrivilegeValue(string host,string name,ref long pluid); [DllImport("advapi32.dll",ExactSpelling = true,SetLastError = true)] static extern bool AdjustTokenPrivileges(IntPtr htok,bool disall,ref TokPriv1Luid newst,int len,IntPtr prev,IntPtr relen); [DllImport("user32.dll",ExactSpelling = true,SetLastError = true)] static extern bool ExitWindowsEx(int flg,int rea); const int SE_PRIVILEGE_ENABLED = 0x00000002; const int TOKEN_QUERY = 0x00000008; const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; 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; private static void DoExitWin(int flg) { bool b; TokPriv1Luid tp; IntPtr hproc = GetCurrentProcess(); IntPtr htok = IntPtr.Zero; b = OpenProcessToken(hproc,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,ref htok); tp.Count = 1; tp.Luid = 0; tp.Attr = SE_PRIVILEGE_ENABLED; b = LookupPrivilegeValue(null,SE_SHUTDOWN_NAME,ref tp.Luid); b = AdjustTokenPrivileges(htok,false,ref tp,0,IntPtr.Zero,IntPtr.Zero); b = ExitWindowsEx(flg,0); } public static void Reboot() { DoExitWin(EWX_FORCE | EWX_REBOOT); //重启 } public static void PowerOff() { DoExitWin(EWX_FORCE | EWX_POWEROFF); //关机 } public static void LogoOff() { DoExitWin(EWX_FORCE | EWX_LOGOFF); //注销 } } }
标签:lookup system long ast host kernel32 current arch stat
原文地址:https://www.cnblogs.com/xe2011/p/12896563.html