请输入您要查询的百科知识:

 

词条 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.

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/2/26 15:20:09