Private Type LUID UsedPart As Long IgnoredForNowHigh32BitPart As Long End TypePrivate Type TOKEN_PRIVILEGES PrivilegeCount As Long TheLuid As LUID Attributes As Long End TypePrivate 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
Const EWX_FORCE = 4 '强迫中止没有响应的进程 Const EWX_LOGOFF = 0 '中止进程,然后注销 Const EWX_POWEROFFE = 8 '关掉系统电源(如果可能的话,ATX电源就可以) Const EWX_REBOOT = 2 '重新引导系统 Const EWX_SHUTDOWN = 1 '关闭系统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 LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid tkp.PrivilegeCount = 1 tkp.TheLuid = tmpLuid tkp.Attributes = SE_PRIVILEGE_ENABLED AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded End SubSub ShutDown() Call AdjustToken '98可以不用这个,2000与XP就要用 ,2003还没有试过 ExitWindowsEx EWX_LOGOFF, 0 End Sub
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Const EWX_LOGOFF = 0 '注销 Const EWX_SHUTDOWN = 1 '关机 Const EWX_REBOOT = 2 '重启 Const EWX_FORCE = 4 '强制关闭 Private Sub Form_Load() msg = MsgBox("您注销系统吗?", vbInformation + vbOKCancel + 256, "注销") If msg = vbCancel Then End ret& = ExitWindowsEx(EWX_LOGOFF, 0)'0--注销,1--关机,2--重启... End Sub
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End TypePrivate Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End TypePrivate 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
Const EWX_FORCE = 4 '强迫中止没有响应的进程
Const EWX_LOGOFF = 0 '中止进程,然后注销
Const EWX_POWEROFFE = 8 '关掉系统电源(如果可能的话,ATX电源就可以)
Const EWX_REBOOT = 2 '重新引导系统
Const EWX_SHUTDOWN = 1 '关闭系统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
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkp.PrivilegeCount = 1
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
End SubSub ShutDown()
Call AdjustToken '98可以不用这个,2000与XP就要用 ,2003还没有试过
ExitWindowsEx EWX_LOGOFF, 0
End Sub
Const EWX_LOGOFF = 0 '注销
Const EWX_SHUTDOWN = 1 '关机
Const EWX_REBOOT = 2 '重启
Const EWX_FORCE = 4 '强制关闭
Private Sub Form_Load()
msg = MsgBox("您注销系统吗?", vbInformation + vbOKCancel + 256, "注销")
If msg = vbCancel Then End
ret& = ExitWindowsEx(EWX_LOGOFF, 0)'0--注销,1--关机,2--重启...
End Sub