转帖:Option ExplicitDim mDattime As DatePrivate Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As LongPrivate Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As Long, ReturnLength As Long) As Long
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LARGE_INTEGER) As LongPrivate Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Const EWX_LOGOFF = 0 '注销当前用户
Private Const EWX_POWEROFF = 8 '关闭系统并关闭电源
Private Const EWX_SHUTDOWN = 1 '关闭系统使之能安全关闭电源
Private Const EWX_REBOOT = 2 '关闭系统并重启
Private Const EWX_FORCE = 4 '应用程序强制关闭
Private Const EWX_FORCEIFHUNG = 16 '如果应用程序已挂起,强制关闭Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const SE_PRIVILEGE_ENABLED_BY_DEFAULT = &H1
Private Const SE_PRIVILEGE_USED_FOR_ACCESS = &H80000000Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY_SOURCE = &H10
Private Const TOKEN_QUERY = &H8Private Const ANYSIZE_ARRAY = 1Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"Private Const PROCESS_SET_INFORMATION = &H200
Private Const PROCESS_QUERY_INFORMATION = &H400Private Type LARGE_INTEGER
lowpart As Long
highpart As Long
End TypePrivate Type LUID
lowpart As Long
highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(0) As LUID_AND_ATTRIBUTES
End TypePrivate Sub Command1_Click()
mDattime = CDate(txtHour.Text & ":" & txtMinute.Text)
Timer1.Interval = 1000
Form1.WindowState = 1
End Sub
Private Sub Shutdown() Dim lAPIReturn As Long Dim tTOKPRI As TOKEN_PRIVILEGES
Dim tLUID As LUID
Dim tLarInt As LARGE_INTEGER
Dim lRequired As Long
Dim hTokHan As Long
Dim hProcess As Long
If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tLarInt) = 0 Then
MsgBox "Get LUID error!", vbOKOnly, "Error"
Exit Sub
End If tLUID.highpart = tLarInt.highpart
tLUID.lowpart = tLarInt.lowpart tTOKPRI.PrivilegeCount = 1
tTOKPRI.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
tTOKPRI.Privileges(0).pLuid = tLUID hProcess = GetCurrentProcess()
lAPIReturn = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hTokHan)
lAPIReturn = AdjustTokenPrivileges(hTokHan, 0, tTOKPRI, Len(tTOKPRI), 0, 0)
' lAPIReturn = ExitWindowsEx(EWX_LOGOFF, 0)
' lAPIReturn = ExitWindowsEx(EWX_SHUTDOWN, 0)
lAPIReturn = ExitWindowsEx(EWX_POWEROFF, 0)
' lAPIReturn = ExitWindowsEx(EWX_REBOOT, 0)
' lAPIReturn = ExitWindowsEx(EWX_FORCE, 0)
' lAPIReturn = ExitWindowsEx(EWX_FORCEIFHUNG, 0)
If lAPIReturn = 0 Then
MsgBox "Function calling error!", vbOKOnly, "错误"
End If lAPIReturn = CloseHandle(hTokHan)End SubPrivate Sub Form_Load()
Timer1.Enabled = True
End SubPrivate Sub Timer1_Timer()
If Format(Time, "hh:mm:ss") = mDattime Then
' If Minute(Time) = 0 Then
Shutdown
End If
End Sub
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LARGE_INTEGER) As LongPrivate Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Const EWX_LOGOFF = 0 '注销当前用户
Private Const EWX_POWEROFF = 8 '关闭系统并关闭电源
Private Const EWX_SHUTDOWN = 1 '关闭系统使之能安全关闭电源
Private Const EWX_REBOOT = 2 '关闭系统并重启
Private Const EWX_FORCE = 4 '应用程序强制关闭
Private Const EWX_FORCEIFHUNG = 16 '如果应用程序已挂起,强制关闭Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const SE_PRIVILEGE_ENABLED_BY_DEFAULT = &H1
Private Const SE_PRIVILEGE_USED_FOR_ACCESS = &H80000000Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY_SOURCE = &H10
Private Const TOKEN_QUERY = &H8Private Const ANYSIZE_ARRAY = 1Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"Private Const PROCESS_SET_INFORMATION = &H200
Private Const PROCESS_QUERY_INFORMATION = &H400Private Type LARGE_INTEGER
lowpart As Long
highpart As Long
End TypePrivate Type LUID
lowpart As Long
highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(0) As LUID_AND_ATTRIBUTES
End TypePrivate Sub Command1_Click()
mDattime = CDate(txtHour.Text & ":" & txtMinute.Text)
Timer1.Interval = 1000
Form1.WindowState = 1
End Sub
Private Sub Shutdown() Dim lAPIReturn As Long Dim tTOKPRI As TOKEN_PRIVILEGES
Dim tLUID As LUID
Dim tLarInt As LARGE_INTEGER
Dim lRequired As Long
Dim hTokHan As Long
Dim hProcess As Long
If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tLarInt) = 0 Then
MsgBox "Get LUID error!", vbOKOnly, "Error"
Exit Sub
End If tLUID.highpart = tLarInt.highpart
tLUID.lowpart = tLarInt.lowpart tTOKPRI.PrivilegeCount = 1
tTOKPRI.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
tTOKPRI.Privileges(0).pLuid = tLUID hProcess = GetCurrentProcess()
lAPIReturn = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hTokHan)
lAPIReturn = AdjustTokenPrivileges(hTokHan, 0, tTOKPRI, Len(tTOKPRI), 0, 0)
' lAPIReturn = ExitWindowsEx(EWX_LOGOFF, 0)
' lAPIReturn = ExitWindowsEx(EWX_SHUTDOWN, 0)
lAPIReturn = ExitWindowsEx(EWX_POWEROFF, 0)
' lAPIReturn = ExitWindowsEx(EWX_REBOOT, 0)
' lAPIReturn = ExitWindowsEx(EWX_FORCE, 0)
' lAPIReturn = ExitWindowsEx(EWX_FORCEIFHUNG, 0)
If lAPIReturn = 0 Then
MsgBox "Function calling error!", vbOKOnly, "错误"
End If lAPIReturn = CloseHandle(hTokHan)End SubPrivate Sub Form_Load()
Timer1.Enabled = True
End SubPrivate Sub Timer1_Timer()
If Format(Time, "hh:mm:ss") = mDattime Then
' If Minute(Time) = 0 Then
Shutdown
End If
End Sub
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_FORCE As Long = 4
Private Const EWX_REBOOT = 2
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
Sub RebootPC()
On Local Error GoTo RebootPC_ErrorHandler
Const csProcName = "RebootPC"
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()
Call OpenProcessToken(hProcessHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hTokenHandle)' Get the LUID for the shutdown privilege
Call LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid) tkpNew.PrivilegeCount = 1 ' One privilege to set
tkpNew.TheLuid = tmpLuid
tkpNew.Attributes = SE_PRIVILEGE_ENABLED' Enable the shutdown privilege in the access token of this process.
lBufferNeeded = 0
Call AdjustTokenPrivileges(hTokenHandle, False, tkpNew, Len(tkpPrevious), tkpPrevious, lBufferNeeded)' Force a Reboot (no option to save files to cancel out)
Call ExitWindowsEx(EWX_FORCE Or EWX_SHUTDOWN, &HFFFF) Exit Sub
RebootPC_ErrorHandler:
Call RaiseError(csModName, csProcName, Err.Number, Err.Description)
End Sub
Public Const EWX_FORCE = 4
Public Const EWX_SHUTDOWN = 1
sub command1_click()
ExitWindowsEx EWX_SHUTDOWN ,EWX_FORCE
end sub
小心点啊。