Почему не всегда срабатывает ExitWindowsEx? - VB

Узнай цену своей работы

Формулировка задачи:

Вот пример применения API-функции:
, где:

EWX_SHUTDOWN = &H1&

Если функция выполняется в коде, то максимум что она делает - завершает все приложения. Пробовал изменить параметры:
, где

EWX_FORCE = &H4&

Это тоже не помогло. Только сеанс завершался и всё. Программа запускается от имени Администратора. Замечу, что если в IDE в Immediate-окне ввести строку:

Call ExitWindowsEx(EWX_FORCE + EWX_SHUTDOWN, &H0)

, то API-функция сработает, но в контексте приложения - нет. Пока что единственный выход нашёлся в использовании программы Shutdown.exe, которая входит в комплект поставки Windows.

Решение задачи: «Почему не всегда срабатывает ExitWindowsEx?»

textual
Листинг программы
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
    
    Private Const EWX_LogOff As Long = 0
    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()
 
    '********************************************************************
    '* This procedure sets the proper privileges to allow a log off or a
    '* shut down to occur under Windows NT.
    '********************************************************************
 
        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
        'Use the GetCurrentProcess function to set the hdlProcessHandle
        'variable.
        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 cmdLogoff_Click()
        ExitWindowsEx (EWX_LogOff), &HFFFF
    End Sub
 
    Private Sub cmdForceLogoff_Click()
        ExitWindowsEx (EWX_LogOff Or EWX_FORCE), &HFFFF
    End Sub
 
    Private Sub cmdShutdown_Click()
        AdjustToken
        ExitWindowsEx (EWX_SHUTDOWN), &HFFFF
    End Sub
 
    Private Sub cmdForceShutdown_Click()
        AdjustToken
        ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
    End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.2 из 5
Похожие ответы