| Article ID: | T38 |
| Date: | 6/11/99 |
| Product: | VB Guide 2.x (all versions) |
| OS: | Windows NT 4.0 |
| Problem: | How to shut down Windows NT from VB |
You can use the Windows API to shutdown
Windows NT from VB. Because of the security used in Windows NT, it takes
several lines of code to preform this task.
The following code
example comes from Microsoft Article Q161136. See the article for the latest
information. You can find this article by searching the Microsoft Knowledge
base for article Q161136 on the web at http://msdn.microsoft.com.
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
' One privilege to set tkp.
PrivilegeCount=1
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
Note:
You can shutdown SPEL for Windows 2.0, Windows, or reboot from SPEL by
using the Shutdown instruction in a SPEL program. The most common use for this
is for a program that uses the SPEL for Windows Operator Window interface to
display a menu that allows the operator to restart the system.
For
details on Shutdown, search for it in SPEL for Windows 2.0 Help.
