怎样实现利用API关闭winnt(如:2000,XP)系统??
解决方案 »
- 开启 VB IDE 时, 如何自动引用某个 ActiveX DLL
- 在线等 同时判断2个文件,帮忙看下那里错了
- 关于用VB模拟鼠标单击事件的问题!
- 为社区做一项调查,请大家贡献一下 —— 您认为的较好的专业领域站点和论坛(中、英文);献者有分
- #const 这个语法,谁懂得,请进
- 用来标注高度的0-9数字怎么写?(在线等)
- 请问大侠们关于VB的一个中文问题
- 不重复打开excel文件
- vb的一个exe被vs2005,C#引用,在本机可以,换了机器就要换exe文件
- 文件共享的问题!!!!!!!
- 如何把xml转化成ado.Recordset?
- 关于activereport:不用ADO控件绑field控件,用代码实现。请大家指导!
当使用ExitWindowsEx API在Windows NT和Windows 2000下重启系统时,机器不重启。原因
要通过程序重启Windows NT或Windows 2000系统,进程要求有SE_SHUTDOWN_NAME权限。缺省状态下,Visual Basic应用程序没有此权限,因此无法重启机器。
解决方法
为了使ExitWindowsEx API能在Windows NT或Windows 2000下重启系统,必须设置SE_SHUTDOWN_NAME权限。下列步骤说明了如何使ExitWindowsEx API在Windows NT和Windows 2000下生效。 分步实现的例子
1.在Visual Basic中新建一个标准EXE,默认创建Form1。
2.在Form1代码视图中,在Declarations段中加入下列代码:
Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_FORCE As Long = 4
Private Const EWX_REBOOT = 2 Private Declare Function ExitWindowsEx Lib "user32" (ByVal _
dwOptions As Long, ByVal dwReserved As Long) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal _
ProcessHandle As Long, _
ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" _
Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, ByVal lpName As String, lpLuid _
As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
(ByVal TokenHandle As Long, _
ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES _
, ByVal BufferLength As Long, _
PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
3.添加一个名为AdjustToken的过程,包含下列代码:
Private Sub AdjustToken()
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle ' Get the LUID for shutdown privilege.
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid tkp.PrivilegeCount = 1 ' One privilege to set
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED ' Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges hdlTokenHandle, False, _
tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded End Sub
4.在表单上添加CommandButton,在Click事件中添加下列代码:
Private Sub Command1_Click()
AdjustToken
ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
End Sub
5.保存工程并声称可执行文件。当运行可执行文件并点击CommandButton机器将如预期重启。