HOWTO: Shutdown Windows NT, Windows 95, and 98 from VB Code

ID: Q161136


The information in this article applies to:


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.


MORE INFORMATION

Step-by-Step Example

  1. Start a new Standard EXE project. Form1 is added by default.


  2. Add a CommandButton (named cmdForceShutdown) to Form1.


  3. 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
     


  4. On the File menu, click Save Project. Select a folder and a name for your project. Click OK.



REFERENCES

Microsoft Win32 SDK

Additional query words: kbVBp500 kbVBp kbdsi kbDSupport kbNoKeyWord kbVBp600


Keywords          : 
Version           : WINDOWS:5.0,6.0
Platform          : WINDOWS 
Issue type        : kbhowto 

Last Reviewed: May 14, 1999