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
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.