Option Explicit '关机、重启模块 Public Const EWX_LOGOFF = 0 Public Const EWX_SHUTDOWN = 1 Public Const EWX_REBOOT = 2 Public Const EWX_FORCE = 4 Public Const EWX_POWEROFF = 8 Public Const TOKEN_ADJUST_PRIVILEGES = &H20 Public Const TOKEN_QUERY = &H8 Public Const SE_PRIVILEGE_ENABLED = &H2 Public Const ANYSIZE_ARRAY = 1 Public Const VER_PLATFORM_WIN32_NT = 2 Public Const VER_PLATFORM_WIN32_WINDOWS = 1 Public Const VER_PLATFORM_WIN32s = 0 Public Declare Function GetCurrentProcess Lib "kernel32" () As Long Public Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long Public Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long Public 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 Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long Public Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) As LongType OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Type LUID LowPart As Long HighPart As Long End Type Type LUID_AND_ATTRIBUTES pLuid As LUID Attributes As Long End Type Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES End Type Public ReBootWindows As Boolean Public ShutDownWindows As Boolean Public LogOffWindows As Boolean Public Function IsWinNT() As Integer Dim myOS As OSVERSIONINFO myOS.dwOSVersionInfoSize = Len(myOS) GetVersionEx myOS IsWinNT = myOS.dwPlatformId End Function 'set the shut down privilege for the current application Public Sub EnableShutDown() Dim hProc As Long Dim hToken As Long Dim mLUID As LUID Dim mPriv As TOKEN_PRIVILEGES Dim mNewPriv As TOKEN_PRIVILEGES hProc = GetCurrentProcess() OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID mPriv.PrivilegeCount = 1 mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED mPriv.Privileges(0).pLuid = mLUID ' enable shutdown privilege for the current application AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount) End Sub ' Shut Down NT Public Sub ShutDownNT(Force As Boolean) Dim Ret As Long Dim flags As Long flags = EWX_SHUTDOWN + EWX_POWEROFF
Call IsWinNT
If Force Then flags = flags + EWX_FORCE End If
Select Case IsWinNT Case 2 EnableShutDown ExitWindowsEx flags, 0 Case 1 Ret = ExitWindowsEx(EWX_SHUTDOWN + EWX_POWEROFF Or EWX_FORCE, 0) End Select End Sub 'Restart NT Public Sub RebootNT(Force As Boolean) Dim Ret As Long Dim flags As Long flags = EWX_REBOOT
Call IsWinNT
If Force Then flags = flags + EWX_FORCE End If
Select Case IsWinNT Case 2 EnableShutDown ExitWindowsEx flags, 0 Case 1 Ret = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT, 0) End Select End Sub 'Log off the current user Public Sub LogOffNT(Force As Boolean) Dim Ret As Long Dim flags As Long flags = EWX_LOGOFF
Call IsWinNT
If Force Then flags = flags + EWX_FORCE End If
Select Case IsWinNT Case 2 EnableShutDown ExitWindowsEx flags, 0 Case 1 Ret = ExitWindowsEx(EWX_LOGOFF Or EWX_FORCE, 0) End Select End Sub
我第一次提问题,还要给分是吗,怎么给?
'关机、重启模块
Public Const EWX_LOGOFF = 0
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_FORCE = 4
Public Const EWX_POWEROFF = 8
Public Const TOKEN_ADJUST_PRIVILEGES = &H20
Public Const TOKEN_QUERY = &H8
Public Const SE_PRIVILEGE_ENABLED = &H2
Public Const ANYSIZE_ARRAY = 1
Public Const VER_PLATFORM_WIN32_NT = 2
Public Const VER_PLATFORM_WIN32_WINDOWS = 1
Public Const VER_PLATFORM_WIN32s = 0
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Public Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Public 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
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long
Public Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) As LongType OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Type LUID
LowPart As Long
HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type Public ReBootWindows As Boolean
Public ShutDownWindows As Boolean
Public LogOffWindows As Boolean
Public Function IsWinNT() As Integer
Dim myOS As OSVERSIONINFO
myOS.dwOSVersionInfoSize = Len(myOS)
GetVersionEx myOS
IsWinNT = myOS.dwPlatformId
End Function
'set the shut down privilege for the current application
Public Sub EnableShutDown()
Dim hProc As Long
Dim hToken As Long
Dim mLUID As LUID
Dim mPriv As TOKEN_PRIVILEGES
Dim mNewPriv As TOKEN_PRIVILEGES
hProc = GetCurrentProcess()
OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
mPriv.PrivilegeCount = 1
mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
mPriv.Privileges(0).pLuid = mLUID
' enable shutdown privilege for the current application
AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
End Sub
' Shut Down NT
Public Sub ShutDownNT(Force As Boolean)
Dim Ret As Long
Dim flags As Long
flags = EWX_SHUTDOWN + EWX_POWEROFF
Call IsWinNT
If Force Then
flags = flags + EWX_FORCE
End If
Select Case IsWinNT
Case 2
EnableShutDown
ExitWindowsEx flags, 0
Case 1
Ret = ExitWindowsEx(EWX_SHUTDOWN + EWX_POWEROFF Or EWX_FORCE, 0)
End Select
End Sub
'Restart NT
Public Sub RebootNT(Force As Boolean)
Dim Ret As Long
Dim flags As Long
flags = EWX_REBOOT
Call IsWinNT
If Force Then
flags = flags + EWX_FORCE
End If
Select Case IsWinNT
Case 2
EnableShutDown
ExitWindowsEx flags, 0
Case 1
Ret = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT, 0)
End Select
End Sub
'Log off the current user
Public Sub LogOffNT(Force As Boolean)
Dim Ret As Long
Dim flags As Long
flags = EWX_LOGOFF
Call IsWinNT
If Force Then
flags = flags + EWX_FORCE
End If
Select Case IsWinNT
Case 2
EnableShutDown
ExitWindowsEx flags, 0
Case 1
Ret = ExitWindowsEx(EWX_LOGOFF Or EWX_FORCE, 0)
End Select
End Sub