UDF > Security >


_Security__CreateProcessWithToken

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 )

Paramètres

$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

Valeur de retour

Succès: Retourne True.
Échec: Retourne False.

Remarque

Le nom du module doit être le premier jeton délimité par un espace dans le paramètre $sCommandLine.

En relation

_Security__DuplicateTokenEx

Voir aussi

Consultez CreateProcessWithTokenW dans la librairie MSDN.

Exemple

#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