Solved

How to shutdown NT gracefully from VB5

Posted on 1998-09-05
4
221 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 30 total points
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

Background What I'm presenting in this article is the result of 2 conditions in my work area: We have a SQL Server production environment but no development or test environment; andWe have an MS Access front end using tables in SQL Server but we a…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
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…

728 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

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now