Redémarrer proprement windows 2000 avec exitwindowsex

Contenu du snippet

Ce code modifie les droits d'exéctution du processus en cours et lui attribut l'autorisation de redémarrer la machine. Ainsi la fonction ExitWindowsEx fonctionne !

Copiez/Collez le code ci-dessous dans un module standard et appelez la méthode rebootComputer() pour redémarrer Windows. Vous pouvez également arrêter l'ordinateur en mettant EWX_SHUTDOWN à la place de EWX_REBOOT.

Source / Exemple :


Option Explicit

'** Benoit    10/03/2003    Redémarrage de l'ordinateur sous Windows NT

Private Type LARGE_INTEGER
    lowpart As Long
    highpart As Long
End Type

Private Type LUID_AND_ATTRIBUTES
        pLuid As LARGE_INTEGER
        Attributes As Long
End Type

Private Const ANYSIZE_ARRAY = 1

Private Type TOKEN_PRIVILEGES
  PrivilegeCount As Long
  Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type

Private Declare Function OpenProcessToken Lib "advapi32.dll" _
                        (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
                        TokenHandle 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 ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LARGE_INTEGER) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
                       

                        

'** Déclaration des droits d'accès
'** Déclaration originale en C :
'#define TOKEN_ASSIGN_PRIMARY    (0x0001)
'#define TOKEN_DUPLICATE         (0x0002)
'#define TOKEN_IMPERSONATE       (0x0004)
'#define TOKEN_QUERY             (0x0008)
'#define TOKEN_QUERY_SOURCE      (0x0010)
'#define TOKEN_ADJUST_PRIVILEGES (0x0020)
'#define TOKEN_ADJUST_GROUPS     (0x0040)
'#define TOKEN_ADJUST_DEFAULT    (0x0080)
'#define TOKEN_ADJUST_SESSIONID  (0x0100)
'
'#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED  |\
'                          TOKEN_ASSIGN_PRIMARY      |\
'                          TOKEN_DUPLICATE           |\
'                          TOKEN_IMPERSONATE         |\
'                          TOKEN_QUERY               |\
'                          TOKEN_QUERY_SOURCE        |\
'                          TOKEN_ADJUST_PRIVILEGES   |\
'                          TOKEN_ADJUST_GROUPS       |\
'                          TOKEN_ADJUST_SESSIONID    |\
'                          TOKEN_ADJUST_DEFAULT)
'
'
'#define TOKEN_READ       (STANDARD_RIGHTS_READ      |\
'                          TOKEN_QUERY)
'
'
'#define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE     |\
'                          TOKEN_ADJUST_PRIVILEGES   |\
'                          TOKEN_ADJUST_GROUPS       |\
'                          TOKEN_ADJUST_DEFAULT)
'
'#define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)

Private Const READ_CONTROL As Long = &H20000

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

Private Const TOKEN_ASSIGN_PRIMARY    As String = &H1
Private Const TOKEN_DUPLICATE         As String = &H2
Private Const TOKEN_IMPERSONATE       As String = &H4
Private Const TOKEN_QUERY             As String = &H8
Private Const TOKEN_QUERY_SOURCE      As String = &H10
Private Const TOKEN_ADJUST_PRIVILEGES As String = &H20
Private Const TOKEN_ADJUST_GROUPS     As String = &H40
Private Const TOKEN_ADJUST_DEFAULT    As String = &H80
Private Const TOKEN_ADJUST_SESSIONID  As String = &H100

Private Const TOKEN_ALL_ACCESS As String = 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_SESSIONID Or _
                          TOKEN_ADJUST_DEFAULT

Private Const TOKEN_READ As String = STANDARD_RIGHTS_READ Or TOKEN_QUERY

Private Const TOKEN_WRITE   As String = STANDARD_RIGHTS_WRITE Or _
                          TOKEN_ADJUST_PRIVILEGES Or _
                          TOKEN_ADJUST_GROUPS Or _
                          TOKEN_ADJUST_DEFAULT

Private Const TOKEN_EXECUTE  As String = STANDARD_RIGHTS_EXECUTE
Private Const SE_PRIVILEGE_ENABLED As Long = &H2

Private Const EWX_POWEROFF As Long = 8
Private Const EWX_FORCE As Long = 4
Private Const EWX_LOGOFF As Long = 0
Private Const EWX_REBOOT As Long = 2
Private Const EWX_SHUTDOWN As Long = 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

Public sGAppPath As String

Public Sub rebootComputer()
  Dim lRet As Long
  Dim lTokenHandle As Long
  Dim tp As TOKEN_PRIVILEGES
  Dim tpNull As TOKEN_PRIVILEGES
  Dim liLUID As LARGE_INTEGER
  Dim lCurrentProcess As Long
  Dim lErr As Long
  Dim lRetLen As Long

  '** Récupération du handle du process en cours
  lCurrentProcess = GetCurrentProcess

  '** Ouverture du symbole
  lRet = OpenProcessToken(lCurrentProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, lTokenHandle)
  If lRet = 0 Then
    MsgBox "Erreur lors de l'ouverture"
    End
  End If

  '** Récupération de l'ID du symbole d'autorisation de redémarrage
  lRet = LookupPrivilegeValue(vbNullString, "SeShutdownPrivilege", liLUID)
  tp.PrivilegeCount = 1
  tp.Privileges(0).pLuid = liLUID
  tp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED

  '** Autorisation du processus pour l'arrêt de l'ordinateur
  lRet = AdjustTokenPrivileges(lTokenHandle, 0, tp, Len(tp), tpNull, lRetLen)

  '** Arrêt de l'ordinateur
  lRet = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT, &HFFFF)
  
End Sub

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.