C# API强制关机、重启以及注销计算机
在Windows系统中有2种方式进行关机、重启以及注销计算机操作:
1、使用shutdown()命令;2、使用系统API;
以下是使用系统API进行操作的实例。
程序实例界面:

程序实例代码:

1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Text;
7 using System.Windows.Forms;
8
9 using System.Runtime.InteropServices;
10
11
12 namespace ShutDownSys
13 {
14 public partial class Form1 : Form
15 {
16 public Form1()
17 {
18 InitializeComponent();
19 }
20
21 public class ShutDownSys
22 {
23 //C#关机代码
24 //这个结构体将会传递给API。使用StructLayout
25 //(...特性,确保其中成员是按顺序排列的,C#编译器不会对其进行调整)
26 [StructLayout(LayoutKind.Sequential, Pack = 1)]
27 internal struct TokPriv1Luid
28 {
29 public int Count; public long Luid; public int Attr;
30 }
31
32 //以下使用DLLImport特性导入了所需的Windows API。
33 //导入这些方法必须是static extern的,并且没有方法体。
34 //调用这些方法就相当于调用Windows API。
35 [DllImport("kernel32.dll", ExactSpelling = true)]
36 internal static extern IntPtr GetCurrentProcess();
37
38 [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
39 internal static extern bool OpenProcessToken(IntPtr h,int acc,ref IntPtr phtok);
40
41 [DllImport("advapi32.dll", SetLastError = true)]
42 internal static extern bool LookupPrivilegeValueA
43 (string host, string name, ref long pluid);
44
45 [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
46 internal static extern bool
47 AdjustTokenPrivileges(IntPtr htok,bool disall,ref TokPriv1Luid newst,int len,IntPtr prev,IntPtr relen);
48
49 [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
50 internal static extern bool ExitWindowsEx(int flg,int rea);
51
52 //C#关机代码
53 //以下定义了在调用WinAPI时需要的常数。
54 //这些常数通常可以从Platform SDK的包含文件(头文件)中找到。
55 public const int SE_PRIVILEGE_ENABLED = 0x00000002;
56 public const int TOKEN_QUERY = 0x00000008;
57 public const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
58 public const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
59 public const int EWX_LOGOFF = 0x00000000;
60 public const int EWX_SHUTDOWN = 0x00000001;
61 public const int EWX_REBOOT = 0x00000002;
62 public const int EWX_FORCE = 0x00000004;
63 public const int EWX_POWEROFF = 0x00000008;
64 public const int EWX_FORCEIFHUNG = 0x00000010;
65 // 通过调用WinAPI实现关机,主要代码再最后一行ExitWindowsEx //这调用了同名的WinAPI,正好是关机用的。
66
67
68 public static void DoExitWin(int flg)
69 {
70 bool ok;
71 TokPriv1Luid tp;
72 IntPtr hproc = GetCurrentProcess();
73 IntPtr htok = IntPtr.Zero;
74 ok = OpenProcessToken(hproc,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,ref htok);
75 tp.Count = 1;
76 tp.Luid = 0;
77 tp.Attr = SE_PRIVILEGE_ENABLED;
78 ok = LookupPrivilegeValueA(null,SE_SHUTDOWN_NAME,ref tp.Luid);
79 ok = AdjustTokenPrivileges(htok,false,ref tp,0,IntPtr.Zero,IntPtr.Zero);
80 ok = ExitWindowsEx(flg,0);
81 }
82 }
83
84 //调用
85 public void Reboot()
86 {
87 ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_REBOOT);
88 }
89
90 public void ShutDown()
91 {
92 ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_POWEROFF);
93 }
94
95 public void LogOff()
96 {
97 ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_LOGOFF);
98 }
99
100 //关机
101 private void button1_Click(object sender, EventArgs e)
102 {
103 ShutDown();
104 }
105
106 //重启
107 private void button2_Click(object sender, EventArgs e)
108 {
109 Reboot();
110 }
111
112 //注销
113 private void button3_Click(object sender, EventArgs e)
114 {
115 LogOff();
116 }
117 }
118 }

相关:
1、用System.Runtime.InteropServices服务的DllImport方法引入非托管代码程序集,例如调用系统API,C语言写的方法等等。在这种情况下,声明必须为static
extern 主要用于声明在外部实现的方法,同时,还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本。
2、
ExitwindowsEx函数的原型:
bool ExitwindowsEx(UINT uFlags,DWORD dwReserved);
函数功能:
该函数注销当前用户,关闭系统;或者关闭并重新启动系统。此函数发送WM_QUERYENDSESSION消息给应用程序来确定它们是否能被终止。
参数:
uFlags;指定关机类型。此参数必须包括下列值之一:EWX_LOGOFF,EWX_POWEROFF,EWX_REBOOT,EWX_SHUTDOWN。还包括EWX_FORCE,EWX_FORCEIFHUNG两个可选值。
EWX_LOGOFF:关闭所有调用函数ExitWindowsEx的进程的安全环境里运行的进程,然后注销用户。
EWX_REBOOT:关闭系统并重新启动系统。
EWX_SHUTDOWN:关闭系统使之能完全关闭电源,所有文件缓冲区都被清洗到磁盘,所有的运行的进程都停止。
C# API强制关机、重启以及注销计算机的更多相关文章
- 第五章 Linux操作系统关机、重启、注销及其查看ip命令
一.更新系统时间与网络时间同步 1. 安装ntpdate工具 # yum -y install ntp ntpdate 2. 设置系统时间与网络时间同步 # ntpdate cn.pool.ntp ...
- C# 关机/重启/注销计算机
一.调用 shutdown.exe 执行操作 调用 shutdown.exe 执行计算机关机.重启.注销操作,还可以设置多长时间后执行操作,代码如下: 1 /// <summary> 2 ...
- 使用c#对windows进行关机、重启或注销
方法一:调用windows自带的shutdown.exe (缺点:会出现倒计时窗口) System.Diagnostics.Process.Start("shutdown.exe" ...
- ubuntu 关机,重启,注销命令
1关机命令 shutdown 好像ubuntu的终端中默认的是当前用户的命令,只是普通用户,因此在终端器中可以使用sudo -sh 转换到管理员root用户下执行命令. 1)shutdown –hel ...
- 编程实现Windows关机、重启、注销
要想编程使Windows关机.重启或者注销,可以使用ExWindowsEx这个API函数,该函数只有两个参数,第一个表示关机动作的标志,也就是你要让该函数关机呢,还是重启,还是注销等.可以使用EWX_ ...
- 用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠
简介 本文讲述了用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠. 如何实现 首先,使用 using 语句添加我们需要的命名空间: using System.Diagnostics; ...
- C#实现控制Windows系统关机、重启和注销的方法:
shutdown命令的参数: shutdown.exe -s:关机shutdown.exe -r:关机并重启shutdown.exe -l:注销当前用户 shutdown.exe -s -t 时间:设 ...
- 转摘:常用ubuntu 关机,重启,注销命令
1.关机命令 shutdown 好像ubuntu的终端中默认的是当前用户的命令,只是普通用户,因此在终端器中可以使用sudo -sh 转换到管理员root用户下执行命令. 1).shutdown –h ...
- C#实现控制Windows系统关机、重启和注销的方法
shutdown命令的参数: shutdown.exe -s:关机shutdown.exe -r:关机并重启shutdown.exe -l:注销当前用户 shutdown.exe -s -t 时间:设 ...
随机推荐
- Wine添加路径PATH办法
使用wine运行某些程序时,可能会提示某些DLL找不到,需要手动把这些DLL的路径添加进去.添加方法是:wine regedit打开注册表工具:添加一个键HKEY_CURRENT_USER/Envir ...
- 【转】测试开发工程师必备软硬能力&高级测试开发工程师需要具备什么能力?
对于测试的基本知识,可以查看软件测试相关书籍 对于在公司成为一位优秀的测试开发工程师,我觉得下面这篇文章涉及到的是我们需要的,稍微进行改动https://blog.csdn.net/sinat_210 ...
- csp201809-2 买菜
问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车.具体的,对于小H来说有n个不相交的时间段 ...
- Lucene搜索/索引过程笔记
lucene索引文档过程: > 初始化IndexWriter > 构建Document > 调用IndexWriter.addDocument执行写入 > 初始化Documen ...
- excel转pdf,itextpdf转换excel
最近项目有需求,需要把excel转pdf.由于时间比较急,所以在github上找了一个转换的.最终没用上,但还是踩坑了一波. 踩坑一: 首先,这个是导出的流之间会互相影响,因为流读取过,导致导出的ex ...
- Vue.js 源码分析(九) 基础篇 生命周期详解
先来看看官网的介绍: 主要有八个生命周期,分别是: beforeCreate.created.beforeMount.mounted.beforeupdate.updated .beforeDes ...
- maven 学习---转换基于Maven的Web应用程序支持Eclipse IDE
在上一节教程中,使用Maven创建了一个Web应用程序.这里有一个指南,告诉你如何转换Web应用程序到Eclipse IDE支持的形式. 注意,通过WTP工具Eclipse IDE支持Web应用程序, ...
- libtool编译
1.充分利用共享库的能力.libtool 是一个通用库支持脚本 2.我们可以认为libtool是gcc的一个抽象,也就是说,它包装了gcc或者其他的任何编译器,用户无需知道细节,只要告诉libtool ...
- xcode6新建工程
xcode6中新建空工程 (2014-10-29 13:14:44) 转载▼ 标签: it ios 分类: iOS 升级xcode6之后,直接建立Empty工程后发现,这是太坑,真的是什么都没有啊.只 ...
- 13.生产环境中的 redis 是怎么部署的?
作者:中华石杉 面试题 生产环境中的 redis 是怎么部署的? 面试官心理分析 看看你了解不了解你们公司的 redis 生产集群的部署架构,如果你不了解,那么确实你就很失职了,你的 redis 是主 ...