瑞星卡卡安全论坛技术交流区系统软件 关于VB中调用ExitWindowsEx的问题?【求助】

1   1  /  1  页   跳转

关于VB中调用ExitWindowsEx的问题?【求助】

关于VB中调用ExitWindowsEx的问题?【求助】

今日看到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-06-28 09:11:30
分享到:
gototop
 

有高手能解答一下吗?
万分感激啊!
gototop
 

我不知道你这个后面是什么数。sh = ExitWindowsEx(LOGOFF, dwReserved)
我认为这好像是这样改的。sh = ExitWindowsEx(LOGOFF, 0)
gototop
 

你把你的全部代码复制到这里。在看一下。
gototop
 

要先提升程序权限级别
gototop
 

To 封神梦想:以上就是全部代码了,程序很简单,就一个窗体上三个按钮,对应三种操作,我把dwReserved改为0后还是没反应,看来不是这个原因了。

TO 网络骑士HKC :你指的程序权限级别不是计算机登录那个权限吧,能告诉我怎么提升程序权限级别吗?或者那里能找到相关资料?我把所有其他程序都关了,但是注销偏偏就行。
gototop
 

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
gototop
 

哦。如果是NT以后的系统,就如他们所说的提升权限。
gototop
 
1   1  /  1  页   跳转
页面顶部
Powered by Discuz!NT