Функция RunAs

         Описание функции


RunAs

Запускает внешнюю программу от другого пользователя.

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

Параметры

username Имя пользователя.
domain Домен для аутентификации.
password Пароль пользователя.
logon_flag 0 - интерактивный вход без профиля.
1 - интерактивный вход с профилем.
2 - только сетевые учётные данные.
4 - наследование переменных сред процесса вместо пользовательских.
program Полный путь к программе (EXE, BAT, COM или PIF) для запуска (см. примечания).
workingdir [необязательный] Рабочий каталог. Если не указан, то используется значение @SystemDir. Это не путь к программе.
show_flag [необязательный] Режим отображения запускаемой программы:
@SW_HIDE = скрытое окно (или ключевое слово Default)
@SW_MINIMIZE = свернутое окно
@SW_MAXIMIZE = развернутое окно
opt_flag [необязательный] Управление различными опциями взаимодействия процессов родительского и дочернего.
0x1 ($STDIN_CHILD) = предоставить указатель дочернего потока STDIN
0x2 ($STDOUT_CHILD) = предоставить указатель дочернего потока STDOUT
0x4 ($STDERR_CHILD) = предоставить указатель дочернего потока STDERR
0x8 ($STDERR_MERGED) = предоставить указатель STDOUT и STDERR. Подразумевается оба, $STDOUT_CHILD и $STDERR_CHILD.
0x10 ($STDIO_INHERIT_PARENT) = предоставить дочерний от родительского потока STDIO. Этот флаг не может быть совмещен с любым другим флагом STDIO. Этот флаг имеет смысл только, когда родительская программа скомпилирована как консольное приложение.
0x10000 ($RUN_CREATE_NEW_CONSOLE) = дочерний консольный процесс должен быть создан в собственном окне, вместо использования родительского окна. Этот флаг имеет смысл только, когда родительская программа скомпилирована как консольное приложение.

Возвращаемое значение

Успех:Возвращает PID запущенного процесса.
Ошибка:Возвращает 0 и устанавливает @error не равным нулю.

Примечания

Пути с пробелами должны быть заключены в кавычки.

Важно указать рабочий каталог пользователя, чтоб запускаемая программа имела к нему доступ, иначе функция не будет выполнена.

Рекомендуется загружать профиль пользователя только тогда, когда вы уверены, что это необходимо. Существует небольшая вероятность, что профиль может зависнуть в памяти при определенных условиях. Если скрипт с использованием RunAs() случайно запущен от SYSTEM (например, если скрипт запущен как служба) и загружен профиль пользователя, тогда вы должны позаботится чтобы скрипт оставался запущенным до завершения дочернего процесса.

При выполнении скрипта от Администратора, служба Вторичного входа (RunAs) должна быть включена или функция не будет выполнена. Это не относится к случаю, когда запуск происходит от имени SYSTEM.

После запуска внешней программы скрипт продолжает выполняться. Чтобы приостановить выполнение скрипта, ожидая завершения внешней запущенной программы используйте RunAsWait().

Предоставление параметров стандартного ввода/вывода с соответствующими значениями разрешённых взаимодействий с дочерним процессом происходит через функции StderrRead(), StdinWrite() и StdoutRead(). Комбинация (сумма) значений флагов (или использование $STDERR_CHILD, $STDIN_CHILD и $STDOUT_CHILD, определяемых в Constants.au3) управляет несколькими потоками.

Для того чтобы закрыть потоки, должны быть выполнены следующие условия: 1) Дочерний процесс завершён - это конец потока (это происходит, когда дочерний завершён). 2) AutoIt должен читать любой захваченный поток до отсутствия данных. 3) Если STDIN предназначен для дочернего, то должен быть вызван StdinWrite() чтобы закрыть поток. После того как все потоки обнаружены как не нужные, все внутренние ресурсы будут автоматически освобождены.
StdioClose() используется для принудительного закрытия потоков STDIO.

Опции "Вход с профилем" и "Только сетевые учётные данные" несовместимы. Использование обоих создаёт неопределённый результат.

Существует проблема в Windows XP поколения Windows, который предотвращает перенаправление STDIO и показывает флаг работы. Смотрите Базу Знаний Microsoft обновление - KB818858, для получения дополнительной информации о том, какие версии затрагивает, а также хотфикс для исправления. Пользователи использующие Windows 2000, Windows XP SP2 или поздние, или Windows Vista не затрагивает.

См. также

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

Пример

; Введите имя пользователя и пароль для вашей системы.
$sUserName = "Username"
$sPassword = "Password"

; Запускает блокнот развёрнутым на весь экран от имени указанного выше пользователя.
$iPID = RunAs($sUserName, @ComputerName, $sPassword, 0, "notepad.exe", "", @SW_SHOWMAXIMIZED)

; Ожидание 5 секунд до появление окна блокнота
WinWait("[CLASS:Notepad]", "", 5)

; Ожидание 2 секунды.
Sleep(2000)

; Закрывает блокнот используя PID возвращённый функцией RunAs.
ProcessClose($iPID)