Solved

Ctrl-Alt-DEL

Posted on 1999-01-18
9
569 Views
Last Modified: 2008-02-01
I'm trying to automate the Ctrl-Alt-DEL operation using the SendKeys statement. It does not work. Please can someone suggest a solution to this ?
0
Comment
Question by:YourMajesty
  • 3
  • 2
  • 2
  • +1
9 Comments
 

Expert Comment

by:parkerea
Comment Utility
At the risk of asking a stupid question, WHY?
0
 

Expert Comment

by:parkerea
Comment Utility
How familiar are you with the Win32 API?
0
 

Expert Comment

by:qizhizhu
Comment Utility
Use following WIN32 API to enable or disable Ctrl-Alt-Del.

Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long

Regards
Qizhi Zhu
0
 

Author Comment

by:YourMajesty
Comment Utility
Qizhi Zhu,

Two questions before I accept your answer. Does that function do the equivalent of pressing the keys CTRL-ALT-DEL (which I want) or does it just disable the use of them (which I don't want) ?

What are the defintions of the parameters ?

Thanks.

P.S. parkeara - I want the ability of manipulating the menu you see after pressing those keys in NT 4.0
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 

Author Comment

by:YourMajesty
Comment Utility
I reject your answer since you did not reply to my comment
0
 

Expert Comment

by:parkerea
Comment Utility
Although I have used NT only briefly, as I remember the ctl-alt-del brings up the logon screen, or something like that. Are you are actually trying to bring up the NT log on dialog? If so, there may be an NT Windows API call to bring up the logon dialog, rather than trying to simulate the user interaction. I checked the Win32 API documentation I have, but it is mostly for Win 95/98, and has little NT specific info. If you are really trying to bring up the logon dialog, you should probably resubmit your question with a different subject.
0
 

Expert Comment

by:qizhizhu
Comment Utility
Sorry. I did not check the "Experts-Exchange" recently. The API call is similar to pressing the keys CTRL-ALT-DEL. If you need more help, let me know.

qizhizhu@hotmail.com

Regards
qizhi zhu
0
 
LVL 14

Accepted Solution

by:
waty earned 40 total points
Comment Utility
Here is code to shutdown :

Option Explicit

'To try out a shutdown, add two Command buttons and a Text box to the project's form and then paste in the following code. Note you should save your work before running it, because the shutdown will kill VB without asking you to save any changes! Clicking on the first Command button will initiate a shutdown, with a timeout value set to the number of seconds entered into the text box. To stop the shutdown, click the second Command button.
'
'Private Sub Command1_Click()
'    If (MsgBox("Are you sure you want to initiate a forced, timed shutdown?", vbYesNo Or vbQuestion) = vbYes) Then
'    NTForceTimedShutdown CLng(Text1.Text), "You're gonna get shutdown in " & Text1.Text & " s..."
'End If
'End Sub
'
'Private Sub Command2_Click()
'NTAbortTimedShutdown
'End Sub
'
'Private Sub Form_Load()
'Text1.Text = 60
'End Sub

' To Determine if we are running NT or not:
Private Type OSVERSIONINFO
   dwOSVersionInfoSize As Long
   dwMajorVersion As Long
   dwMinorVersion As Long
   dwBuildNumber As Long
   dwPlatformId As Long
   szCSDVersion As String * 128 ' Maintenance string for PSS usage
End Type

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Const VER_PLATFORM_WIN32_NT = 2
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VER_PLATFORM_WIN32s = 0

' To Report API errors:
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000
Private Const FORMAT_MESSAGE_FROM_HMODULE = &H800
Private Const FORMAT_MESSAGE_FROM_STRING = &H400
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long

Private Const eeSSDErrorBase = 1000

' ============================================================================================
' NT Only
Private Type LARGE_INTEGER
   lowpart As Long
   highpart As Long
End Type
Private Type LUID
   lowpart As Long
   highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
   pLuid As LUID
   Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
   PrivilegeCount As Long
   Privileges(0 To 0) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, TokenInformationClass As Integer, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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 Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Private Const SE_PRIVILEGE_ENABLED = &H2

Private Const READ_CONTROL = &H20000
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)

Private Const TOKEN_ASSIGN_PRIMARY = &H1
Private Const TOKEN_DUPLICATE = (&H2)
Private Const TOKEN_IMPERSONATE = (&H4)
Private Const TOKEN_QUERY = (&H8)
Private Const TOKEN_QUERY_SOURCE = (&H10)
Private Const TOKEN_ADJUST_PRIVILEGES = (&H20)
Private Const TOKEN_ADJUST_GROUPS = (&H40)
Private Const TOKEN_ADJUST_DEFAULT = (&H80)
Private Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
      TOKEN_ASSIGN_PRIMARY Or _
      TOKEN_DUPLICATE Or _
      TOKEN_IMPERSONATE Or _
      TOKEN_QUERY Or _
      TOKEN_QUERY_SOURCE Or _
      TOKEN_ADJUST_PRIVILEGES Or _
      TOKEN_ADJUST_GROUPS Or _
      TOKEN_ADJUST_DEFAULT)
Private Const TOKEN_READ = (STANDARD_RIGHTS_READ Or _
      TOKEN_QUERY)
Private Const TOKEN_WRITE = (STANDARD_RIGHTS_WRITE Or _
      TOKEN_ADJUST_PRIVILEGES Or _
      TOKEN_ADJUST_GROUPS Or _
      TOKEN_ADJUST_DEFAULT)
Private Const TOKEN_EXECUTE = (STANDARD_RIGHTS_EXECUTE)

Private Const TokenDefaultDacl = 6
Private Const TokenGroups = 2
Private Const TokenImpersonationLevel = 9
Private Const TokenOwner = 4
Private Const TokenPrimaryGroup = 5
Private Const TokenPrivileges = 3
Private Const TokenSource = 7
Private Const TokenStatistics = 10
Private Const TokenType = 8
Private Const TokenUser = 1

Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long
Private Declare Function AbortSystemShutdown Lib "advapi32.dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Long


Public Function WinError(ByVal lLastDLLError As Long) As String

   Dim sBuff As String
   Dim lCount As Long

   ' Return the error message associated with LastDLLError:
   sBuff = String$(256, 0)
   lCount = FormatMessage( _
         FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _
         0, lLastDLLError, 0&, sBuff, Len(sBuff), ByVal 0)
   If lCount Then
      WinError = Left$(sBuff, lCount)
   End If

End Function

Public Function IsNT() As Boolean

   Static bOnce As Boolean
   Static bValue As Boolean

   ' Return whether the system is running NT or not:
   If Not (bOnce) Then
      Dim tVI As OSVERSIONINFO
      tVI.dwOSVersionInfoSize = Len(tVI)
      If (GetVersionEx(tVI) <> 0) Then
         bValue = (tVI.dwPlatformId = VER_PLATFORM_WIN32_NT)
         bOnce = True
      End If
   End If
   IsNT = bValue

End Function

Private Function NTEnableShutDown(ByRef sMsg As String) As Boolean

   Dim tLUID         As LUID
   Dim hProcess      As Long
   Dim hToken        As Long
   Dim tTP           As TOKEN_PRIVILEGES
   Dim tTPOld        As TOKEN_PRIVILEGES
   Dim lTpOld        As Long
   Dim lR            As Long

   ' Under NT we must enable the SE_SHUTDOWN_NAME privilege in the
   ' process we're trying to shutdown from, otherwise a call to
   ' try to shutdown has no effect!

   ' Find the LUID of the Shutdown privilege token:
   lR = LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tLUID)

   ' If we get it:
   If (lR <> 0) Then

      ' Get the current process handle:
      hProcess = GetCurrentProcess()
      If (hProcess <> 0) Then
         ' Open the token for adjusting and querying (if we can - user may not have rights):
         lR = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken)
         If (lR <> 0) Then

            ' Ok we can now adjust the shutdown priviledges:
            With tTP
               .PrivilegeCount = 1
               With .Privileges(0)
                  .Attributes = SE_PRIVILEGE_ENABLED
                  .pLuid.highpart = tLUID.highpart
                  .pLuid.lowpart = tLUID.lowpart
               End With
            End With

            ' Now allow this process to shutdown the system:
            lR = AdjustTokenPrivileges(hToken, 0, tTP, Len(tTP), tTPOld, lTpOld)

            If (lR <> 0) Then
               NTEnableShutDown = True
            Else
               Err.Raise eeSSDErrorBase + 6, App.EXEName & ".mShutDown", "Can't enable shutdown: You do not have the privileges to shutdown this system. [" & WinError(Err.LastDllError) & "]"
            End If

            ' Remember to close the handle when finished with it:
            CloseHandle hToken
         Else
            Err.Raise eeSSDErrorBase + 6, App.EXEName & ".mShutDown", "Can't enable shutdown: You do not have the privileges to shutdown this system. [" & WinError(Err.LastDllError) & "]"
         End If
      Else
         Err.Raise eeSSDErrorBase + 5, App.EXEName & ".mShutDown", "Can't enable shutdown: Can't determine the current process. [" & WinError(Err.LastDllError) & "]"
      End If
   Else
      Err.Raise eeSSDErrorBase + 4, App.EXEName & ".mShutDown", "Can't enable shutdown: Can't find the SE_SHUTDOWN_NAME privilege value. [" & WinError(Err.LastDllError) & "]"
   End If

End Function

Public Function NTForceTimedShutdown(Optional ByVal lTimeOut As Long = -1, Optional ByVal sMsg As String = "", Optional ByVal sMachineNetworkName As String = vbNullString, Optional ByVal bForceAppsToClose As Boolean = False, Optional ByVal bReboot As Boolean = False) As Boolean

   Dim lR As Long

   If IsNT Then
      ' Make sure we have enabled the privilege to shutdown
      ' for this process if we're running NT:
      If Not (NTEnableShutDown(sMsg)) Then
         Exit Function
      End If

      ' This is the code to do a timed shutdown:
      lR = InitiateSystemShutdown(sMachineNetworkName, sMsg, lTimeOut, bForceAppsToClose, bReboot)
      If (lR = 0) Then
         Err.Raise eeSSDErrorBase + 2, App.EXEName & ".mShutDown", "InitiateSystemShutdown failed: " & WinError(Err.LastDllError)
      End If

   Else
      Err.Raise eeSSDErrorBase + 1, App.EXEName & ".mShutDown", "Function only available under Windows NT."
   End If

End Function

Public Function NTAbortTimedShutdown(Optional ByVal sMachineNetworkName As String = vbNullString)

   AbortSystemShutdown sMachineNetworkName

End Function

0
 
LVL 14

Expert Comment

by:waty
Comment Utility
Simpler version :
' *** Exit windows with one of the following results. dwReserved = 0
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Public Sub ShutDownWindows(ByVal uFlags As Long)
   ' #VBIDEUtils#************************************************************
   ' * Programmer Name  : Waty Thierry
   ' * Web Site         : www.geocities.com/ResearchTriangle/6311/
   ' * E-Mail           : waty.thierry@usa.net
   ' * Date             : 26/11/98
   ' * Time             : 15:05
   ' * Module Name      : Lib_Module
   ' * Module Filename  : Lib.bas
   ' * Procedure Name   : ShutDownWindows
   ' * Parameters       :
   ' *                    ByVal uFlags As Long
   ' **********************************************************************
   ' * Comments         : Exit the Windows
   ' *
   ' *
   ' **********************************************************************
   
   Call ExitWindowsEx(uFlags, 0)

End Sub


0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Article by: Martin
Here are a few simple, working, games that you can use as-is or as the basis for your own games. Tic-Tac-Toe This is one of the simplest of all games.   The game allows for a choice of who goes first and keeps track of the number of wins for…
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.
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…
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…

771 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

11 Experts available now in Live!

Get 1:1 Help Now