一个关机的VB类模块
'APIs WHICH HANDLES SHUTDOWN / RESTART / LOGOFF ETC..
Option Explicit
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags 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
Private Const EWX_FORCE As Long = 4
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
Public Enum EnumExitWindows
WE_LOGOFF = 0
WE_SHUTDOWN = 1
WE_REBOOT = 2
WE_POWEROFF = 8
End Enum
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
Public Sub ExitWindows(ByVal exitCommand As EnumExitWindows)
AdjustToken
ExitWindowsEx (exitCommand Or EWX_FORCE), 0
End Sub
'调用的时候只要这样
Dim exitWin As New clsShutdown
Private Sub cmdRestart_Click()
On Error Resume Next
exitWin.ExitWindows WE_REBOOT
End Sub
Private Sub cmdShutdown_Click()
On Error Resume Next
exitWin.ExitWindows WE_POWEROFF
End Sub
该博客提供了一个用于关机的VB类模块。代码中声明了多个处理关机、重启、注销等操作的API函数,定义了相关常量和类型,通过调整令牌权限实现关机功能,并给出了调用示例,如重启和关机按钮的点击事件处理。
341

被折叠的 条评论
为什么被折叠?



