[AutoIt] Запуск программы по сети на нескольких компьютерах одновременно

Данный скрипт запускает несколько процессов wmic, которые запускают процессы на удаленных компьютерах с помощью WMI.
Далее в цикле проверяем, завершился ли процесс wmic и если да, читаем его вывод в поиске ID процесса на удаленном компе. Если ProcessID не найден, значит произошла ошибка. Выводим все в консоль.
Если процессы на завершатся в течение 30 секунд, прерываем их.

#include <WinAPIMisc.au3>
#include <Array.au3>

Opt("ExpandEnvStrings", 1)
Opt("ExpandVarStrings", 1)

Func ReadOutput($processId)
	$output = StdoutRead($processId)
	$output = _WinAPI_OemToChar(StringStripWS($output, 3))
	Return $output
EndFunc

Func BatchExecute(ByRef $computers, $command, $user = "", $password = "")
	Local $array[0][4]
	Local $account = ($user == "" ? "" : "/user:$user$ /password:$password$")
	ConsoleWrite("Запуск процессов выполнения команды '$command$'..." & @CRLF)
	For $i = 0 To UBound($computers) - 1
		$computer = $computers[$i]
		$processId = Run('wmic /privileges:enable $account$ /node:$computer$ process call create "$command$"', @WindowsDir, @SW_HIDE, 0x8)
		_ArrayAdd($array, "$computer$|$processId$|0|0")
	Next
	ProcessResults($array, 30000) ; Ждем завершения 30 секунд, если за это время не будет произведён запуск, прерываем процесс
EndFunc

Func ProcessResults(ByRef $array, $summaryDelay)
	Local $pending = Ubound($array)
	Local $timer = TimerInit()
	Local $timeout = False
	While True
		For $i = 0 To UBound($array) - 1
			If Int($array[$i][3]) == 0 And ((Not ProcessExists($array[$i][1])) Or $timeout) Then
				$pending -= 1
				$array[$i][3] = 1
				$computer = $array[$i][0]
				$processId = $array[$i][1]
				$output = ReadOutput($processId)
				$match = StringRegExp($output, "ProcessId\s=\s(\d+)", 1)
				If @error Then
					$array[$i][2] = -1
					If $timeout And ProcessExists($processId) Then
						ProcessClose($processId)
						ConsoleWrite("$computer$: Ошибка. Истекло время ожидания." & @CRLF)
					Else
						ConsoleWrite("$computer$: Ошибка. Не удалось подключиться." & @CRLF)
					EndIf
				Else
					$array[$i][2] = $match[0]
					ConsoleWrite("$computer$: Процесс запущен с ID = " & $match[0] & "." & @CRLF)
					If $timeout And ProcessExists($processId) Then
						ProcessClose($processId)
						ConsoleWrite("$computer$: Ошибка. Истекло время ожидания." & @CRLF)
					EndIf
				EndIf
			EndIf
		Next
		If $pending == 0 Then ExitLoop
		If TimerDiff($timer) > $summaryDelay Then
			$timeout = True
		EndIf
		Sleep(200)
	WEnd
EndFunc

Пример использования:

Local $array[] = ["asus-pc", "localhost", "127.0.0.1", "your-pc-name", "ndstation", "pc24", "192.168.1.123"]
BatchExecute($array, 'shutdown -s -f -t 0', "domain\user", "password") ; используем имя и пароль доменного пользователя, если компьютер не в домене, можно указать просто user
BatchExecute($array, 'cmd /c "\\netshare\somescript.bat"', ".\localUser", "password") ; запуск процесса на удаленных компьютерах от имени локального (относительно удаленного компа) пользователя, если компьютер в домене, то запись localUser без ./ приведет к ошибке
BatchExecute($array, 'shutdown -r -t 30') ; используем учетную запись текущего пользователя, кстати на localhost процесс запускается только так

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Syntax highlight code surrounded by the <pre class="brush: lang">...</pre> tags, where lang is one of the following language brushes: autoit, bash, csharp, cpp, delphi, erlang, php, plain, powershell, sql.
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Syntax highlight code surrounded by the <pre class="brush: lang">...</pre> tags, where lang is one of the following language brushes: autoit, bash, csharp, cpp, delphi, erlang, php, plain, powershell, sql.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
9 + 0 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.