Funktionreferenz


RunAs

Beschreibung anzeigen in

Startet ein externes Programm im Kontext eines anderen Benutzers.

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

Parameter

username Benutzername, mit dem eingeloggt wird.
domain Domäne, gegenüber der man sich authentifiziert.
password Passwort des Benutzers.
logon_flag     $RUN_LOGON_NOPROFILE (0) - Interaktives Logon ohne Profil.
    $RUN_LOGON_PROFILE (1) - Interaktives Logon mit Profil.
    $RUN_LOGON_NETWORK (2) - Nur Netzwerk-Authentifizierung.
    $RUN_LOGON_INHERIT (4) - Übernehme die Umgebung des aufrufenden Prozesses statt der Umgebung des Benutzers.

Die Konstanten sind in "AutoItConstants.au3" definiert.
program Der komplette Pfad des Programms (.EXE, .BAT, .COM oder .PIF), die ausgeführt werden soll. (siehe Bemerkungen)
workingdir [optional] Arbeitsverzeichnis. Wenn nicht angegeben, wird @SystemDir verwendet. Dies ist nicht der Pfad des Programms.
show_flag [optional] Legt die Sichtbarkeit des ausgeführten Programms fest:
    @SW_HIDE = Verstecktes Fenster (benutzt alternativ das Schlüsselwort Default).
    @SW_MINIMIZE = Minimiertes Fenster.
    @SW_MAXIMIZE = Maximiertes Fenster.
opt_flag [optional] Steuert verschiedene Optionen, die die Interaktion zwischen Parent- und Child-Prozess betreffen (STDIO).
    $STDIN_CHILD (0x1) = Stellt ein Handle zum STDIN-Stream des Child-Fensters bereit.
    $STDOUT_CHILD (0x2) = Stellt ein Handle zum STDOUT-Stream des Child-Fensters bereit.
    $STDERR_CHILD (0x4) = Stellt ein Handle zum STDERR-Stream des Child-Fensters bereit.
    $STDERR_MERGED (0x8) = Stellt das selbe Handle für den STDOUT- und STDERR-Stream bereit (Setzt $STDOUT_CHILD und $STDERR_CHILD).
    $STDIO_INHERIT_PARENT (0x10) = Stellt dem Child-Fenster das Handle zum STDIO-Stream des Parent-Fensters bereit. Kann nicht mit einem anderen STDIO-Flag kombiniert werden. Dieses Flag ist nur dann sinnvoll, wenn die Parent-Anwendung als Kommandozeilenapplikation kompiliert wurde.
    $RUN_CREATE_NEW_CONSOLE (0x10000) = Der Child-Kommandozeilenprozess wird in einem eigenen Kommandozeilenfenster ausgeführt. Dieses Flag ist nur dann sinnvoll, wenn die Parent-Anwendung als Kommandozeilenapplikation kompiliert wurde.

Die Konstanten sind in "AutoItConstants.au3" definiert.

Rückgabewert

Erfolg: Die PID des Prozesses, der gestartet wurde.
Fehler: 0 und setzt das @error Flag auf ungleich null.

Bemerkungen

Pfade mit Leerzeichen müssen in Anführungszeichen gesetzt werden.

Es ist wichtig, ein Arbeitsverzeichnis anzugeben, für den der Benutzer Zugriffsrechte hat, in dessen Kontext der Prozess ausgeführt wird, anderenfalls schlägt der Aufruf der Funktion RunAs() fehl.

Es ist empfehlenswert, nur dann das "fremde" Benutzerprofil zu verwenden, wenn es auch wirklich benötigt wird. Es besteht eine geringe Wahrscheinlichkeit, dass das Profil unter bestimmten Bedingungen im Speicher hängen bleibt. Wenn ein Skript RunAs() benutzt, um einen Prozess unter dem SYSTEM-Account zu starten (z.B. um als Dienst zu fungieren), und ein Benutzerprofil ist aktiv, muss dafür gesorgt werden, dass das Skript nicht beendet wird, bevor der Child-Prozess geschlossen wurde.

Wenn man als Administrator angemeldet ist, muss der Service 'Sekundäre Anmeldung' (RunAs()) aktiv sein, sonst schlägt die Funktion fehl. Dies gilt nicht, wenn das SYSTEM-Konto aktiv ist.

Nach dem Start des angeforderten Programms wird das Skript weiter ausgeführt. Soll die Ausführung des Skripts angehalten werden, bis das gestartete Programm beendet ist, so ist statt der RunAs() Funktion die RunAsWait() Funktion zu verwenden.

Das Bereitstellen der Standard-I/O-Parameter mit den geeigneten Werten ist Voraussetzung für die Interaktion des Child-Prozesses mit den Funktionen StderrRead(), StdinWrite() und StdoutRead().
Um mehrere I/O-Streams zu verwalten, kombiniert man die „Flag“-Werte (oder man benutzt $STDERR_CHILD, $STDIN_CHILD & $STDOUT_CHILD, die in Constants.au3 definiert sind).

Um die I/O-Streams zu schließen, müssen folgende Bedingungen erfüllt sein:
1) Der Child-Prozess hat seine Seite des Streams geschlossen (das ist der Fall, wenn der Child-Prozess geschlossen wird).
2) AutoIt muss gekaperte Streams auslesen, bis keine Daten mehr enthalten sind.
3) Wenn STDIN dem Child-Prozess zugewiesen ist, muss StdinWrite() aufgerufen werden, um den Stream zu schließen. Sobald alle Streams als nicht mehr benötigt erkannt werden, werden alle intern verwendeten Ressourcen automatisch freigegeben.
StdioClose() kann verwendet werden, um das Schließen der STDIO-Streams zu erzwingen.

StdioClose() kann verwendet werden, um die STDIO-Streams zu erzwingen..

Die 'logon_flags' mit Profil (0 oder 1) und Netzwerk-Authentifizierung (2) sind inkompatibel. Wenn beide in Kombination benutzt werden, kann das zu unvorhersehbaren Ergebnissen führen!

Aufgrund eines Problems, das Windows XP mit der Fenstererzeugung hat, kann die STDIO-Umleitung und Steuerung der Sichtbarkeit blockiert werden (siehe den Microsoft Knowledge Base Artikel KB818858 für weitere Informationen darüber, welche Versionen betroffen sind und wie das Problem umgangen werden kann). Benutzer von Windows XP SP2 (oder später) oder Windows Vista (oder später) sind nicht betroffen.

Verwandte Funktionen

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

Beispiel

#include <AutoItConstants.au3>

Example()

Func Example()
    ; Hier den Benutzername und Passwort eingeben, die dem System entsprechen.
    Local $sUserName = "Benutzername"
    Local $sPassword = "Passwort"

    ; Startet den Editor mit einem maximierten Fenster. Der Editor läuft unter dem obigen Benutzer.
    Local $iPID = RunAs($sUserName, @ComputerName, $sPassword, $RUN_LOGON_NOPROFILE, "notepad.exe", "", @SW_SHOWMAXIMIZED)

    ; Wartet 10 Sekunden bis das Editorfenster erscheint.
    WinWait("[CLASS:Notepad]", "", 10)

    ; Wartet 2 Sekunden.
    Sleep(2000)

    ; Schließt den Editor Prozess mit Hilfe der PID die durch RunAs zurückgegeben wurde.
    ProcessClose($iPID)
EndFunc   ;==>Example