Microsoft KB Archive/161136

-

The information in this article applies to:


 * Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, versions 5.0, 6.0

-

SUMMARY
Periodically, you may need to shutdown Windows NT, Windows 95, and Windows 98 from Visual Basic code. The Step-by-Step Example in this article shows how to do this by using the Windows API.

Step-by-Step Example
 Start a new Standard EXE project. Form1 is added by default. Add a CommandButton (named cmdForceShutdown) to Form1.  Add the following code to the General Declarations section of Form1:

     Option Explicit

Private Type LUID UsedPart As Long IgnoredForNowHigh32BitPart As Long End Type

Private Type TOKEN_PRIVILEGES PrivilegeCount As Long TheLuid As LUID Attributes As Long End Type

' Beginning of Code Private Const EWX_SHUTDOWN As Long = 1 Private Const EWX_FORCE As Long = 4 Private Const EWX_REBOOT = 2

Private 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 Private 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

' Get the LUID for shutdown privilege. LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid

tkp.PrivilegeCount = 1   ' One privilege to set tkp.TheLuid = tmpLuid tkp.Attributes = SE_PRIVILEGE_ENABLED

' Enable the shutdown privilege in the access token of this ' process. AdjustTokenPrivileges hdlTokenHandle, False, tkp, _ Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded

End Sub

Private Sub cmdForceShutdown_Click AdjustToken ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF End Sub  On the File menu, click Save Project. Select a folder and a name for your project. Click OK.