Crée un nouveau processus et son thread principal en cours d'exécution dans le contexte de sécurité du jeton spécifié
#include <Security.au3>
_Security__CreateProcessWithToken ( $hToken, $iLogonFlags, $sCommandLine, $iCreationFlags, $sCurDir, $tSTARTUPINFO, $tPROCESS_INFORMATION )
$hToken | Le handle sur le jeton principal qui représente un utilisateur |
$iLogonFlags | Les options d'ouverture de session |
$sCommandLine | La ligne de commande à exécuter |
$iCreationFlags | Les flags qui contrôlent la façon dont le processus est créé |
$sCurDir | Le chemin complet vers le répertoire courant pour le processus |
$tSTARTUPINFO | Une (pointeur sur) structure STARTUPINFO |
$tPROCESS_INFORMATION | Une (pointeur sur) structure PROCESS_INFORMATION qui reçoit des informations d'identification pour le nouveau processus |
Succès: | Retourne True. |
Échec: | Retourne False. |
Le nom du module doit être le premier jeton délimité par un espace dans le paramètre $sCommandLine.
Consultez CreateProcessWithTokenW dans la librairie MSDN.
#RequireAdmin ; A un sens pour cet exemple #include <MsgBoxConstants.au3> #include <ProcessConstants.au3> #include <Security.au3> #include <SecurityConstants.au3> #include <StructureConstants.au3> #include <WinAPIHObj.au3> #include <WinAPIProc.au3> Example_ProcessWithTok() Func Example_ProcessWithTok() ; Exécute AutoIt, ce qui dépend faiblement du fait d'avoir des droits d'administrateur complets obtenus à l'aide #RequireAdmin ou par tout autre moyen _RunNonElevated('"'& @AutoItExe & '" /AutoIt3ExecuteLine "MsgBox(4096, ''RunNonElevated'', ''IsAdmin() = ''& "IsAdmin()" & '', PID = ''& "@AutoItPID")"') EndFunc ;==>Example_ProcessWithTok Func _RunNonElevated($sCommandLine = "") ; Si le processus actuel s'exécute avec des droits faibles alors Run une nouvelle fois. If Not IsAdmin() Then Return Run($sCommandLine) ; Structures nécessaires pour créer un processus Local $tSTARTUPINFO = DllStructCreate($tagSTARTUPINFO) Local $tPROCESS_INFORMATION = DllStructCreate($tagPROCESS_INFORMATION) ; Handle de processus de certains processus qui s'exécute avec des droits faibles. Par exemple, "Explorer" Local $hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, ProcessExists("explorer.exe")) ; En cas de réussite If $hProcess Then ; Token... Local $hTokOriginal = _Security__OpenProcessToken($hProcess, $TOKEN_ALL_ACCESS) ; Ferme le handle du processus qui n'est plus nécessaire. _WinAPI_CloseHandle($hProcess) ; En cas de réussite If $hTokOriginal Then ; Duplique le jeton d'origine Local $hTokDuplicate = _Security__DuplicateTokenEx($hTokOriginal, $TOKEN_ALL_ACCESS, $SECURITYIMPERSONATION, $TOKENPRIMARY) ; Ferme le jeton d'origine _WinAPI_CloseHandle($hTokOriginal) ; En cas de réussite If $hTokDuplicate Then ; Crée un processus avec ce nouveau jeton _Security__CreateProcessWithToken($hTokDuplicate, 0, $sCommandLine, 0, @ScriptDir, $tSTARTUPINFO, $tPROCESS_INFORMATION) ; Ferme ce jeton _WinAPI_CloseHandle($hTokDuplicate) ; Ferme les handles obtenus _WinAPI_CloseHandle(DllStructGetData($tPROCESS_INFORMATION, "hProcess")) _WinAPI_CloseHandle(DllStructGetData($tPROCESS_INFORMATION, "hThread")) ; Retour le PID du processus nouvellement créé Return DllStructGetData($tPROCESS_INFORMATION, "ProcessID") EndIf EndIf EndIf EndFunc ;==>_RunNonElevated