?
Solved

How to shutdown NT gracefully from VB5

Posted on 1998-09-05
4
Medium Priority
?
235 Views
Last Modified: 2010-04-30
I'm having trouble to find out how to shutdown my NT workstation from a vb5 program. If any program's are running I want them to close  properly before my NT goes down. is that possible and if so how ? I need this both for workstation and server (NT 4.0)
0
Comment
Question by:FrederikBonte
  • 3
4 Comments
 
LVL 4

Accepted Solution

by:
mcix earned 120 total points
ID: 1433191
This code will force a shutdown from VB:
      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

-------------

As far as programs shutting down gracefully that is up to the author of a program.  In VB apps, a message is sent to your application that triggers the Form_QueryUnload Event.  From there you can decide whether or not you want to exit/shutdown and any clean-up code that may be required.
0
 

Author Comment

by:FrederikBonte
ID: 1433192
Could you also give me the code to just 'close all programs and logon as a different user'. The code you gave me was a big help, thanks.
0
 
LVL 4

Expert Comment

by:mcix
ID: 1433193
Either of these two methods will work..

Private Const EWX_LogOff As Long = 0      
Private Const EWX_FORCE As Long = 4

ExitWindowsEx (EWX_LogOff), &HFFFF

or

ExitWindowsEx (EWX_LogOff Or EWX_FORCE), &HFFFF


0
 
LVL 4

Expert Comment

by:mcix
ID: 1433194
For more info on this topic look at:

http://support.microsoft.com/support/kb/articles/q168/7/96.asp

It describes what we are talking about here...
0

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Most everyone who has done any programming in VB6 knows that you can do something in code like Debug.Print MyVar and that when the program runs from the IDE, the value of MyVar will be displayed in the Immediate Window. Less well known is Debug.Asse…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

568 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question