c#调用api控制windows关机示例(可以重启/注销)_C#教程-查字典教程网
c#调用api控制windows关机示例(可以重启/注销)
c#调用api控制windows关机示例(可以重启/注销)
发布时间:2016-12-28 来源:查字典编辑
摘要:方法一:调用windows自带的shutdown.exe(缺点:会出现倒计时窗口)System.Diagnostics.Process.St...

方法一:调用windows自带的shutdown.exe (缺点:会出现倒计时窗口)

System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 15");

shutdown参数含义:-r关闭并重启动此计算机;-f 强制运行的应用程序关闭而没有警告;-t 15 延时15shutdown.exe的详细用法:

shutdown [-i | -l | -s | -r | -a] [-f] [-m //computername] [-t xx] [-c "comment"] [-d up:xx:yy]

没有参数 显示此消息(与 ? 相同)

-i 显示 GUI 界面,必须是第一个选项

-l 注销(不能与选项 -m 一起使用)

-s 关闭此计算机

-r 关闭并重启动此计算机

-a 放弃系统关机

-m //computername 远程计算机关机/重启动/放弃

-t xx 设置关闭的超时为 xx 秒

-c "comment" 关闭注释(最大 127 个字符)

-f 强制运行的应用程序关闭而没有警告

-d [u][p]:xx:yy 关闭原因代码

u 是用户代码

p 是一个计划的关闭代码

xx 是一个主要原因代码(小于 256 的正整数)

yy 是一个次要原因代码(小于 65536 的正整数)

方法二:调用API

复制代码 代码如下:

private const int SE_PRIVILEGE_ENABLED = 0x00000002;

private const int TOKEN_QUERY = 0x00000008;

private const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

private const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";

[Flags]

public enum ExitWindows : uint

{

LogOff = 0x00, //注销

ShutDown = 0x01, //关机

Reboot = 0x02, //重启

Force = 0x04,

PowerOff = 0x08,

ForceIfHung = 0x10

}

[Flags]

private enum ShutdownReason : uint

{

MajorApplication = 0x00040000,

MajorHardware = 0x00010000,

MajorLegacyApi = 0x00070000,

MajorOperatingSystem = 0x00020000,

MajorOther = 0x00000000,

MajorPower = 0x00060000,

MajorSoftware = 0x00030000,

MajorSystem = 0x00050000,

MinorBlueScreen = 0x0000000F,

MinorCordUnplugged = 0x0000000b,

MinorDisk = 0x00000007,

MinorEnvironment = 0x0000000c,

MinorHardwareDriver = 0x0000000d,

MinorHotfix = 0x00000011,

MinorHung = 0x00000005,

MinorInstallation = 0x00000002,

MinorMaintenance = 0x00000001,

MinorMMC = 0x00000019,

MinorNetworkConnectivity = 0x00000014,

MinorNetworkCard = 0x00000009,

MinorOther = 0x00000000,

MinorOtherDriver = 0x0000000e,

MinorPowerSupply = 0x0000000a,

MinorProcessor = 0x00000008,

MinorReconfig = 0x00000004,

MinorSecurity = 0x00000013,

MinorSecurityFix = 0x00000012,

MinorSecurityFixUninstall = 0x00000018,

MinorServicePack = 0x00000010,

MinorServicePackUninstall = 0x00000016,

MinorTermSrv = 0x00000020,

MinorUnstable = 0x00000006,

MinorUpgrade = 0x00000003,

MinorWMI = 0x00000015,

FlagUserDefined = 0x40000000,

FlagPlanned = 0x80000000

}

[StructLayout(LayoutKind.Sequential, Pack = 1)]

private struct TokPriv1Luid

{

public int Count;

public long Luid;

public int Attr;

}

[DllImport("kernel32.dll", ExactSpelling = true)]

private static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]

private static extern bool OpenProcessToken(IntPtr h, int acc, 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)]

private static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

[DllImport("user32.dll")]

private static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);

/// <summary>

/// 关机、重启、注销windows

/// </summary>

/// <param name="flag"></param>

public static void DoExitWindows(ExitWindows flag)

{

TokPriv1Luid tp;

IntPtr hproc = GetCurrentProcess();

IntPtr htok = IntPtr.Zero;

OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref 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);

ExitWindowsEx(flag, ShutdownReason.MajorOther);

}

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新C#教程学习
    热门C#教程学习
    编程开发子分类