Functions > Process >


RunAs

Exécute un programme externe dans le contexte d'un utilisateur différent.

RunAs ( "username", "domain", "password", logon_flag, "program" [, "workingdir" [, show_flag [, opt_flag]]] )

Paramètres

username Le nom de l'utilisateur avec lequel se connecter.
domain Le domaine pour s'authentifier.
password Le mot de passe de l'utilisateur.
logon_flag     $RUN_LOGON_NOPROFILE (0) - Ouverture de session interactive avec aucun profil.
    $RUN_LOGON_PROFILE (1) - Ouverture de session interactive avec un profil.
    $RUN_LOGON_NETWORK (2) - Identification réseau uniquement.
    $RUN_LOGON_INHERIT (4) - Hériter l'environnement du processus appelant à la place de l'environnement de l'utilisateur.

Les constantes sont définies dans "AutoItConstants.au3".
program Le chemin d'accès complet du programme (EXE, BAT, COM, ou PIF) à exécuter (Voir Remarques).
workingdir [optionnel] Le répertoire de travail. S'il n'est pas spécifié, la valeur de @SystemDir sera utilisée. Ce n'est pas le chemin du programme.
show_flag [optionnel] Le flag "mode d'affichage" du programme exécuté:
    @SW_HIDE = Fenêtre cachée (ou mot-clé Default)
    @SW_MINIMIZE = Fenêtre réduite
    @SW_MAXIMIZE = Fenêtre maximisée
opt_flag [optionnel] Options diverses liées à la façon dont les processus parent/enfant inter-agissent.
    $STDIN_CHILD (0x1) = Fournit un handle pour le flux STDIN de l'enfant
    $STDOUT_CHILD (0x2)= Fournit un handle pour le flux STDOUT de l'enfant
    $STDERR_CHILD (0x4) = Fournit un handle pour le flux STDERR de l'enfant
    STDERR_MERGED (0x8) = Fournit le même handle pour STDOUT et STDERR. Implique à la fois $STDOUT_CHILD et $STDERR_CHILD.
    $STDIO_INHERIT_PARENT (0x10) = Fournit l'enfant avec les flux STDIO du parent. Ce flag ne peut pas être jumelé à un autre flag STDIO. Ce flag n'est utile que lorsque le parent est compilé comme une application Console.
    $RUN_CREATE_NEW_CONSOLE (0x10000) = Le processus de la console de l'enfant doit être créé avec sa propre fenêtre au lieu d'utiliser la fenêtre du parent. Ce flag n'est utile que lorsque le parent est compilé comme une application Console.

Les constantes sont définies dans "AutoItConstants.au3".

Valeur de retour

Succès: Retourne le PID du processus qui a été lancé.
Échec: Retourne 0 et définit @error <> 0.

Remarques

Les chemins avec des espaces doivent être placés entre guillemets.

Il est important de spécifier un répertoire de travail accessible par l'utilisateur sur lequel vous exécutez le programme, sinon la fonction échouera.

Il est recommandé de charger le profil de l'utilisateur que si vous êtes sûr d'en avoir besoin. Il y a une petite chance qu'un profil soit bloqué en mémoire pour de bonnes raisons. Si un script qui exécute RunAs() arrive à être exécuté sous le compte SYSTEM (par exemple, si le script est exécuté en tant que service) et que le profil de l'utilisateur est chargé, vous devez veiller à ce que le script continue de s'exécuter jusqu'à ce que le processus enfant se termine.

Lors de l'exécution en tant qu'administrateur, l'ouverture de session secondaire (RunAs()) service doit être activée ou cette fonction échouera. Ceci ne s'applique pas lors de l'exécution sous le compte SYSTEM.

Après avoir exécuté le programme demandé le script continue. Pour mettre en pause l'exécution du script jusqu'à ce que le programme soit terminé, utilisez la fonction RunAsWait() à la place.

Fournir le paramètre Standard I/O avec les valeurs propres permet une interaction avec le processus de l'enfant à travers les fonctions StderrRead(), StdinWrite() et StdoutRead(). Combiner les valeurs des indicateurs (ou utiliser $STDERR_CHILD, $STDIN_CHILD & $STDOUT_CHILD, défini dans Constants.au3) pour gérer plus d'un flux.

Pour les flux de fermeture, les conditions suivantes doivent être remplies:
1) Le processus enfant a fermé la fin de son flux (ce qui arrive lorsque l'enfant ferme).
2) AutoIt doit lire tous les flux capturés jusqu'à il n'y a pas plus de données.
3) Si STDIN est fourni pour l'enfant, StdinWrite() doit être appelée pour fermer le flux. Une fois que tous les flux sont détectés comme n'étant plus nécessaires, toutes les ressources internes seront automatiquement libérées.

StdioClose() force le flux STDIO à se fermer.

Les options "charger le profil" et "informations d'identification réseau seules" sont incompatibles. Les utiliser ensemble provoquera des résultats indéfinis.

Il y a un problème dans la génération des Windows XP qui empêche la redirection STDIO et le flag "mode d'affichage" de fonctionner. Consultez l'article de la la Base de connaissances Microsoft KB818858 pour plus d'informations sur quelles versions sont concernées ainsi que d'un correctif pour ce problème. Les utilisateurs de Windows XP SP2 ou plus, ou Windows Vista ou plus ne sont pas affectés.

En relation

ProcessClose, Run, RunAsWait, RunWait, ShellExecute, ShellExecuteWait, StderrRead, StdinWrite, StdioClose, StdoutRead

Exemple

#include <AutoItConstants.au3>

Example()

Func Example()
    ; Change le nom d'utilisateur et le mot de passe pour des valeurs appropriées à votre système.
    Local $sUserName = "Username"
    Local $sPassword = "Password"

    ; Exécute le Bloc-notes avec la fenêtre agrandie. Le Bloc-notes est exécuté sous l'utilisateur spécifié.
    Local $iPID = RunAs($sUserName, @ComputerName, $sPassword, $RUN_LOGON_NOPROFILE, "notepad.exe", "", @SW_SHOWMAXIMIZED)

    ; Attend 10 secondes pour que la fenêtre du bloc-notes apparaisse.
    WinWait("[CLASS:Notepad]", "", 10)

    ; Attend 2 secondes.
    Sleep(2000)

    ; Ferme le processus Notepad en utilisant le PID retourné par RunAs.
    ProcessClose($iPID)
EndFunc   ;==>Example