标题：AbortSystemShutdown
AbortSytstemShutdown函数

声明:Declare Function AbortSystemShutdown Lib "advapi32.dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Long说明:停止系统工作示例:'取得os版本 
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long 
Private Const VER_PLATFORM_WIN32_NT = 2 
Private Const VER_PLATFORM_WIN32_WINDOWS = 1 
Private Const VER_PLATFORM_WIN32s = 0 
Private Type OSVERSIONINFO 
dwOSVersionInfoSize As Long 
dwMajorVersion As Long 
dwMinorVersion As Long 
dwBuildNumber As Long 
dwPlatformId As Long 
szCSDVersion As String * 128 
End Type 
'报告API错误： 
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100 
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000 
Private Const FORMAT_MESSAGE_FROM_HMODULE = &H800 
Private Const FORMAT_MESSAGE_FROM_STRING = &H400 
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000 
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200 
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF 
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long 
' ===================================================================== 
' NT Only 
Private Type LARGE_INTEGER 
LowPart As Long 
HighPart As Long 
End Type 
Private 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 To 0) As LUID_AND_ATTRIBUTES 
End Type 
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long 
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, TokenInformationClass As Integer, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long 
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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 Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long 
Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege" 
Private Const SE_PRIVILEGE_ENABLED = &H2 
Private Const READ_CONTROL = &H20000 
Private Const STANDARD_RIGHTS_ALL = &H1F0000 
Private Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL) 
Private Const STANDARD_RIGHTS_READ = (READ_CONTROL) 
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000 
Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL) 
Private Const TOKEN_ASSIGN_PRIMARY = &H1 
Private Const TOKEN_DUPLICATE = (&H2) 
Private Const TOKEN_IMPERSONATE = (&H4) 
Private Const TOKEN_QUERY = (&H8) 
Private Const TOKEN_QUERY_SOURCE = (&H10) 
Private Const TOKEN_ADJUST_PRIVILEGES = (&H20) 
Private Const TOKEN_ADJUST_GROUPS = (&H40) 
Private Const TOKEN_ADJUST_DEFAULT = (&H80) 
Private Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _ 
TOKEN_ASSIGN_PRIMARY Or _ 
TOKEN_DUPLICATE Or _ 
TOKEN_IMPERSONATE Or _ 
TOKEN_QUERY Or _ 
TOKEN_QUERY_SOURCE Or _ 
TOKEN_ADJUST_PRIVILEGES Or _ 
TOKEN_ADJUST_GROUPS Or _ 
TOKEN_ADJUST_DEFAULT) 
Private Const TOKEN_READ = (STANDARD_RIGHTS_READ Or TOKEN_QUERY) 
Private Const TOKEN_WRITE = (STANDARD_RIGHTS_WRITE Or _ 
TOKEN_ADJUST_PRIVILEGES Or _ 
TOKEN_ADJUST_GROUPS Or _ 
TOKEN_ADJUST_DEFAULT) 
Private Const TOKEN_EXECUTE = (STANDARD_RIGHTS_EXECUTE) 
Private Const TokenDefaultDacl = 6 
Private Const TokenGroups = 2 
Private Const TokenImpersonationLevel = 9 
Private Const TokenOwner = 4 
Private Const TokenPrimaryGroup = 5 
Private Const TokenPrivileges = 3 
Private Const TokenSource = 7 
Private Const TokenStatistics = 10 
Private Const TokenType = 8 
Private Const TokenUser = 1 
Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long 
Private Declare Function AbortSystemShutdown Lib "advapi32点dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Long 
' ================================================================ 
Public Function WinError(ByVal lLastDLLError As Long) As String 
Dim sBuff As String 
Dim lCount As Long 
'返回与LastDLLError关联的错误消息： 
sBuff = String$(256, 0) 
lCount = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _ 
0, lLastDLLError, 0&, sBuff, Len(sBuff), ByVal 0) 
If lCount Then 
WinError = Left$(sBuff, lCount) 
End If 
End Function 
Public Function IsNT() As Boolean 
Static bOnce As Boolean 
Static bValue As Boolean 
'返回系统是否为NT： 
If Not (bOnce) Then 
Dim tVI As OSVERSIONINFO 
tVI.dwOSVersionInfoSize = Len(tVI) 
If (GetVersionEx(tVI) <> 0) Then 
bValue = (tVI.dwPlatformId = VER_PLATFORM_WIN32_NT) 
bOnce = True 
End If 
End If 
IsNT = bValue 
End Function 
Private Function NTEnableShutDown(ByRef sMsg As String) As Boolean 
Dim tLUID As LUID 
Dim hProcess As Long 
Dim hToken As Long 
Dim tTP As TOKEN_PRIVILEGES, tTPOld As TOKEN_PRIVILEGES 
Dim lTpOld As Long 
Dim lR As Long 
'在NT下，我们必须给试图关闭系统的进程SE_SHUTDOWN_NAME特权 
'否则，所有企图关闭系统的调用都会无效！ 
'寻找Shoudown特权令牌的LUID： 
lR = LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tLUID) 
'如果我们找到了 
If (lR <> 0) Then 
'取得当前进程的句柄： 
hProcess = GetCurrentProcess() 
If (hProcess <> 0) Then 
'打开令牌来Adjust和Query（用户可能没有权限） 
lR = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) 
If (lR <> 0) Then 
'好，我们现在可以调整Shutdown特权了： 
With tTP 
.PrivilegeCount = 1 
With .Privileges(0) 
.Attributes = SE_PRIVILEGE_ENABLED 
.pLuid.HighPart = tLUID.HighPart 
.pLuid.LowPart = tLUID.LowPart 
End With 
End With 
'现在允许这个进程关闭系统： 
lR = AdjustTokenPrivileges(hToken, 0, tTP, Len(tTP), tTPOld, lTpOld) 
If (lR <> 0) Then 
NTEnableShutDown = True 
Else 
Err.Raise eeSSDErrorBase + 6, App.EXEName & "点mShutDown", "不能shutdown：你没有关闭本系统的权限。[" & WinError(Err点LastDllError) & "]" 
End If 
'记得用完后关闭这个句柄： 
CloseHandle hToken 
Else 
Err.Raise eeSSDErrorBase + 6, App.EXEName & ".mShutDown", "不能shutdown：你没有关闭本系统的权限。[" & WinError(Err点LastDllError) & "]" 
End If 
Else 
Err.Raise eeSSDErrorBase + 5, App.EXEName & "点mShutDown", "不能shutdown：不能终止当前进程。[" & WinError(Err.LastDllError) & "]" 
End If 
Else 
Err.Raise eeSSDErrorBase + 4, App.EXEName & "点mShutDown", "不能shutdown：找不到SE_SHUTDOWN_NAME特权值。[" & WinError(Err点LastDllError) & "]" 
End If 
End Function 
Public Function NTForceTimedShutdown( _ 
Optional ByVal lTimeOut As Long = -1, _ 
Optional ByVal sMsg As String = "", _ 
Optional ByVal sMachineNetworkName As String = vbNullString, _ 
Optional ByVal bForceAppsToClose As Boolean = False, _ 
Optional ByVal bReboot As Boolean = False _ 
) As Boolean 
Dim lR As Long 
If IsNT Then 
'如果我们在NT下，确信我们已经给了这个进程关闭系统的特权： 
If Not (NTEnableShutDown(sMsg)) Then 
Exit Function 
End If 
'这是定时关闭系统的代码： 
lR = InitiateSystemShutdown(sMachineNetworkName, sMsg, lTimeOut, bForceAppsToClose, bReboot) 
If (lR = 0) Then 
Err.Raise eeSSDErrorBase + 2, App点EXEName & "点mShutDown", "InitiateSystemShutdown failed: " & WinError(Err点LastDllError) 
End If 
Else 
Err.Raise eeSSDErrorBase + 1, App点EXEName & "点mShutDown", "函数仅在Windows NT下有效。" 
End If 
End Function 
'取消关闭系统 
Public Function NTAbortTimedShutdown(Optional ByVal sMachineNetworkName As String = vbNullString) 
AbortSystemShutdown sMachineNetworkName 
End Function 
另一组程序
AbortSystemShutdown 
The   AbortSystemShutdown   function   stops   a   system   shutdown   started   by   using   the   InitiateSystemShutdown   function.    
BOOL   AbortSystemShutdown( 
LPTSTR   lpMachineName         //   pointer   to   name   of   computer   to   stop    
//   shutting   down 
); 
Parameters 
lpMachineName    
Pointer   to   the   null-terminated   string   that   specifies   the   network   name   of   the   computer   where   the   shutdown   is   to   be   stopped.   If   lpMachineName   is   NULL   or   points   to   an   empty   string,   the   function   stops   the   shutdown   on   the   local   computer.    
Return   Values 
If   the   function   succeeds,   the   return   value   is   nonzero. 
If   the   function   fails,   the   return   value   is   zero.   To   get   extended   error   information,   callGetLastError.    
Remarks 
The   InitiateSystemShutdown   function   displays   a   dialog   box   that   notifies   the   user   that   the   system   is   shutting   down.   During   the   InitiateSystemShutdown   time-out   period,   the   AbortSystemShutdown   function   can   prevent   the   system   from   shutting   down.    
To   stop   the   local   computer   from   shutting   down,   the   calling   process   must   have   the   SE_SHUTDOWN_NAME   privilege.   To   stop   a   remote   computer   from   shutting   down,   the   calling   process   must   have   the   SE_REMOTE_SHUTDOWN_NAME   privilege   on   the   remote   computer.   By   default,   users   can   enable   the   SE_SHUTDOWN_NAME   privilege   on   the   computer   they   are   logged   onto,   and   administrators   can   enable   the   SE_REMOTE_SHUTDOWN_NAME   privilege   on   remote   computers.    
Common   reasons   for   failure   include   an   invalid   computer   name,   an   inaccessible   computer,   or   insufficient   privilege.    
QuickInfo 
Windows   NT:   Requires   version   3.1   or   later. 
Windows:   Unsupported. 
Windows   CE:   Unsupported. 
Header:   Declared   in   winreg.h. 
Import   Library:   Use   advapi32.lib. 
Unicode:   Implemented   as   Unicode   and   ANSI   versions   on   Windows   NT.
-----------------------------------------------------------------------------------------------
InitiateSystemShutdown 
The   InitiateSystemShutdown   function   initiates   a   shutdown   and   optional   restart   of   the   specified   computer.    
BOOL   InitiateSystemShutdown( 
LPTSTR   lpMachineName,         //   pointer   to   name   of   computer   to   shut   down 
LPTSTR   lpMessage,                              //   pointer   to   message   to   display   in    
//   dialog   box 
DWORD   dwTimeout,                                 //   time   to   display   dialog   box 
BOOL   bForceAppsClosed,               //   force   applications   closed   flag 
BOOL   bRebootAfterShutdown      //   reboot   flag 
); 
Parameters 
lpMachineName    
Pointer   to   the   null-terminated   string   that   specifies   the   network   name   of   the   computer   to   shut   down.   If   lpMachineName   is   NULL   or   points   to   an   empty   string,   the   function   shuts   down   the   local   computer.    
lpMessage    
Pointer   to   a   null-terminated   string   that   specifies   a   message   to   display   in   the   shutdown   dialog   box.   This   parameter   can   be   NULL   if   no   message   is   required.    
dwTimeout    
Specifies   the   time   (in   seconds)   that   the   dialog   box   should   be   displayed.   While   this   dialog   box   is   displayed,   the   shutdown   can   be   stopped   by   the   AbortSystemShutdown   function.    
If   dwTimeout   is   not   zero,   InitiateSystemShutdown   displays   a   dialog   box   on   the   specified   computer.   The   dialog   box   displays   the   name   of   the   user   who   called   the   function,   displays   the   message   specified   by   the   lpMessage   parameter,   and   prompts   the   user   to   log   off.   The   dialog   box   beeps   when   it   is   created   and   remains   on   top   of   other   windows   in   the   system.   The   dialog   box   can   be   moved   but   not   closed.   A   timer   counts   down   the   remaining   time   before   a   forced   shutdown.   If   the   user   logs   off,   the   system   shuts   down   immediately.   Otherwise,   the   computer   is   shut   down   when   the   timer   expires.    
If   dwTimeout   is   zero,   the   computer   shuts   down   without   displaying   the   dialog   box,   and   the   shutdown   cannot   be   stopped   by   AbortSystemShutdown.    
bForceAppsClosed    
Specifies   whether   applications   with   unsaved   changes   are   to   be   forcibly   closed.   If   this   parameter   is   TRUE,   such   applications   are   closed.   If   this   parameter   is   FALSE,   a   dialog   box   is   displayed   prompting   the   user   to   close   the   applications.    
bRebootAfterShutdown    
Specifies   whether   the   computer   is   to   restart   immediately   after   shutting   down.   If   this   parameter   is   TRUE,   the   computer   is   to   restart.   If   this   parameter   is   FALSE,   the   system   flushes   all   caches   to   disk,   clears   the   screen,   and   displays   a   message   indicating   that   it   is   safe   to   power   down.    
Return   Values 
If   the   function   succeeds,   the   return   value   is   nonzero. 
If   the   function   fails,   the   return   value   is   zero.   To   get   extended   error   information,   callGetLastError.    
Remarks 
To   shut   down   the   local   computer,   the   calling   process   must   have   the   SE_SHUTDOWN_NAME   privilege.   To   shut   down   a   remote   computer,   the   calling   process   must   have   the   SE_REMOTE_SHUTDOWN_NAME   privilege   on   the   remote   computer.   By   default,   users   can   enable   the   SE_SHUTDOWN_NAME   privilege   on   the   computer   they   are   logged   onto,   and   administrators   can   enable   the   SE_REMOTE_SHUTDOWN_NAME   privilege   on   remote   computers.    
Common   reasons   for   failure   include   an   invalid   or   inaccessible   computer   name   or   insufficient   privilege.    
QuickInfo 
Windows   NT:   Requires   version   3.1   or   later. 
Windows:   Unsupported. 
Windows   CE:   Unsupported. 
Header:   Declared   in   winreg.h. 
Import   Library:   Use   advapi32.lib. 
Unicode:   Implemented   as   Unicode   and   ANSI   versions   on   Windows   NT.