整理硬盘时,发现这个以前写的小程序,稍整理了一下放在这共享。
关键代码是调用API实现关机,借鉴了网上的程序代码,省了自己查windows API。如果侵犯版权,
请联系我 。
[StructLayout(LayoutKind.Sequential, Pack
=
1
)]
internal
struct
TokPriv1Luid
{
public
int
Count;
public
long
Luid;
public
int
Attr;
}
[DllImport(
"
kernel32.dll
"
, ExactSpelling
=
true
)]
internal
static
extern
IntPtr GetCurrentProcess();
[DllImport(
"
advapi32.dll
"
, ExactSpelling
=
true
, SetLastError
=
true
)]
internal
static
extern
bool
OpenProcessToken(IntPtr h,
int
acc,
ref
IntPtr phtok);
[DllImport(
"
advapi32.dll
"
, SetLastError
=
true
)]
internal
static
extern
bool
LookupPrivilegeValue(
string
host,
string
name,
ref
long
pluid);
[DllImport(
"
advapi32.dll
"
, ExactSpelling
=
true
, SetLastError
=
true
)]
internal
static
extern
bool
AdjustTokenPrivileges(IntPtr htok,
bool
disall,
ref
TokPriv1Luid newst,
int
len, IntPtr prev, IntPtr relen);
[DllImport(
"
user32.dll
"
, ExactSpelling
=
true
, SetLastError
=
true
)]
internal
static
extern
bool
ExitWindowsEx(
int
DoFlag,
int
rea);
internal
const
int
SE_PRIVILEGE_ENABLED
=
0x00000002
;
internal
const
int
TOKEN_QUERY
=
0x00000008
;
internal
const
int
TOKEN_ADJUST_PRIVILEGES
=
0x00000020
;
internal
const
string
SE_SHUTDOWN_NAME
=
"
SeShutdownPrivilege
"
;
internal
const
int
EWX_LOGOFF
=
0x00000000
;
internal
const
int
EWX_SHUTDOWN
=
0x00000001
;
internal
const
int
EWX_REBOOT
=
0x00000002
;
internal
const
int
EWX_FORCE
=
0x00000004
;
internal
const
int
EWX_POWEROFF
=
0x00000008
;
internal
const
int
EWX_FORCEIFHUNG
=
0x00000010
;
private
static
void
DoExitWin(
int
DoFlag)
{
bool
ok;
TokPriv1Luid tp;
IntPtr hproc
=
GetCurrentProcess();
IntPtr htok
=
IntPtr.Zero;
ok
=
OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES
|
TOKEN_QUERY,
ref
htok);
tp.Count
=
1
;
tp.Luid
=
0
;
tp.Attr
=
SE_PRIVILEGE_ENABLED;
ok
=
LookupPrivilegeValue(
null
, SE_SHUTDOWN_NAME,
ref
tp.Luid);
ok
=
AdjustTokenPrivileges(htok,
false
,
ref
tp,
0
, IntPtr.Zero, IntPtr.Zero);
ok
=
ExitWindowsEx(DoFlag,
0
);
}
//重启
public
static
void
Reboot()
{
DoExitWin(EWX_FORCE
|
EWX_REBOOT);
}
//关机
public
static
void
PowerOff()
{
DoExitWin(EWX_FORCE
|
EWX_POWEROFF);
}
//
注销
public
static
void
LogOff()
{
DoExitWin(EWX_FORCE
|
EWX_LOGOFF);
}
关键是学习一下C# 如何使用非托管的 windows API。程序本身没什么技术含量。
完整源程序:
点击下载