好好人哦 - 2007-6-26 0:14:00
今日看到VB程序设计中可以用下列API函数来调用关机,重启和注销操作,自己尝试了一下发现并不如自己预期的效果:
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Const SHUTDOWN = 1
Const REBOOT = 2
Const LOGOFF = 0
......
Private Sub Command1_Click()
sh = ExitWindowsEx(SHUTDOWN, dwReserved)
End Sub
Private Sub Command2_Click()
sh = ExitWindowsEx(REBOOT, dwReserved)
End Sub
Private Sub Command3_Click()
sh = ExitWindowsEx(LOGOFF, dwReserved)
End Sub
运行中发现系统能进行注销(Command3_Click())操作外,关机和重启均无反应。
所以想问一下原因?还有其他相关调用关机的操作命令吗?这个和操作系统应该没有关系的吧,我是XP SP2
好好人哦 - 2007-6-26 20:58:00
有高手能解答一下吗?
万分感激啊!
封神梦想 - 2007-6-27 10:15:00
我不知道你这个后面是什么数。sh = ExitWindowsEx(LOGOFF, dwReserved)
我认为这好像是这样改的。sh = ExitWindowsEx(LOGOFF, 0)
封神梦想 - 2007-6-27 12:18:00
你把你的全部代码复制到这里。在看一下。
网络骑士HKC - 2007-6-27 20:18:00
要先提升程序权限级别
好好人哦 - 2007-6-27 21:50:00
To 封神梦想:以上就是全部代码了,程序很简单,就一个窗体上三个按钮,对应三种操作,我把dwReserved改为0后还是没反应,看来不是这个原因了。
TO 网络骑士HKC :你指的程序权限级别不是计算机登录那个权限吧,能告诉我怎么提升程序权限级别吗?或者那里能找到相关资料?我把所有其他程序都关了,但是注销偏偏就行。
编程小学生 - 2007-6-27 23:31:00
Option Explicit
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
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
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 Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Const HELP_CONTENTS = &H3&
Const EWX_WAIT = 16
Const EWX_REBOOT = 2 '重起
Const EWX_LOGOFF = 0 '注销
Const EWX_FORCE = 4 '终止没有响应的进程
Const EWX_SHUTDOWN = 8 '关闭电源
Private Sub Command1_Click()
'重新启动计算机
ExitWindowsEx EWX_REBOOT, 0
End Sub
Private Sub Command2_Click()
'关闭计算机
ExitWindowsEx EWX_FORCE Or EWX_SHUTDOWN, 0
End Sub
Private Sub Command3_Click()
End
End Sub
Private Sub Command4_Click()
ExitWindowsEx EWX_LOGOFF, 0
End Sub
Private Sub Form_Load()
Dim hProcessHandle As Long
Dim hTokenHandle As Long
Dim tmpLuid As LUID
Dim tkpNew As TOKEN_PRIVILEGES
Dim tkpPrevious As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
'获取当前进程的一个伪句柄
hProcessHandle = GetCurrentProcess()
OpenProcessToken hProcessHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hTokenHandle
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkpNew.PrivilegeCount = 1
tkpNew.TheLuid = tmpLuid
tkpNew.Attributes = SE_PRIVILEGE_ENABLED
lBufferNeeded = 0
'允许当前应用程序有关闭操作系统的权限
AdjustTokenPrivileges hTokenHandle, False, tkpNew, Len(tkpPrevious), tkpPrevious, lBufferNeeded
End Sub
封神梦想 - 2007-6-28 9:21:00
哦。如果是NT以后的系统,就如他们所说的提升权限。
© 2000 - 2026 Rising Corp. Ltd.