Как удаленно выполнить команду на windows

Одна из самых популярных задач у системных администраторов это запуск, какой-либо команды на удалённом компьютере, не вставая со своего места. Это может быть необходимо для установки программы или…

Одна из самых популярных задач у системных администраторов это запуск, какой-либо команды на удалённом компьютере, не вставая со своего места. Это может быть необходимо для установки программы или утилиты, изменения каких-либо настроек, или для чего угодно ещё. И конечно, редко речь идёт лишь об одном компьютере, чаще команду нужно выполнить на множестве рабочих станций или серверов.

Так как задача эта популярная, то и способов её решения существует множество. Начиная от групповых политик (в которых можно применять для этой цели сценарии входа в систему или автозагрузки), и заканчивая мощными системами управления, вроде System Center Essentials или System Center Configuration Manager. Но я в этой статье хочу рассмотреть методы, которые доступны сразу из командной строки или файлов сценариев, а также не требуют предварительной установки агентов и прочей суматохи. Впрочем, какие-то предварительные требования конечно есть. Например, у вас должны быть административные полномочия на том компьютере, на котором вы хотите выполнить команду (за исключением сценария с «проксированием», но об этом позже).

PsExec.exe

Один из моих любимых способов для решения этой задачи это утилита командной строки PsExec.exe написанная Марком Руссиновичем, которую вы можете свободно скачать с сайта Windows SysInternals. Ссылку на неё вы можете найти в конце статьи. Она не требует установки в систему, вы можете просто скопировать её в одну из папок, содержащихся в переменной окружения %path% и вызывать из любой оболочки командной строки: Cmd или PowerShell.

Использовать PsExec очень просто. Например, чтобы выполнить ipconfig /flushdns на компьютере main, достаточно запустить следующую команду:

[code]psexec \main ipconfig /flushdns[/code]

Команда ipconfig будет запущена на компьютере main под вашими учетными данными. После завершения работы ipconfig весь текстовый вывод будет передан на ваш компьютер, а кроме того будет возвращён код выхода команды (error code). В случае если команда выполнилась успешно, он будет равен 0.

7 способов выполнить команду на удалённом компьютере

Разумеется, на этом возможности PsExec не заканчиваются. Вызвав утилиту без параметров, можно посмотреть другие доступные опции. Я обращу внимание лишь на некоторые из них.

Ключ -d говорит PsExec что ненужно дожидаться выполнения команды, а достаточно лишь запустить её, и забыть. В этом случае мы не получим выходных данных от консольной утилиты, но зато сможем не дожидаясь завершения предыдущей команды запускать другие. Это очень полезно, если вам необходимо запустить, например установщик программы на нескольких компьютерах.

По умолчанию PsExec выполняет команды в скрытом режиме, то есть на системе где выполняется команда, не будут выводиться никакие окна или диалоги. Однако есть возможность изменить это поведение, с помощью ключа -i . После него можно указать номер сессии, в которой выводить окна, а можно и не указывать, тогда интерфейс будет отображен в консольной сессии.

Таким образом, чтобы вывести окно с информацией о версии операционной системы на компьютере main, следует запустить PsExec таким образом:

[code]psexec -i \main winver.exe[/code]

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

[code]psexec @c:comps.txt systeminfo.exe[/code]

Ну и одной из самых полезных способностей PsExec является возможность интерактивного перенаправления ввода/вывода между компьютерами, что позволяет нам запустить, например, cmd.exe на удалённом сервере, а давать ему команды и получать результаты на локальном компьютере.

7 способов выполнить команду на удалённом компьютере

Каким образом работает PsExec? 

Всё гениальное просто. В ресурсах исполняемого файла PsExec.exe находится другой исполняемый файл – PSEXESVC, который является службой Windows. Перед выполнением команды, PsExec распаковывает этот ресурс на скрытую административную общую папку удалённого компьютера, в файл: \ИмяКомпьютераAdmin$system32psexesvc.exe. Если вы с помощью ключа -c указали что необходимо скопировать исполняемые файлы на эту систему, они тоже скопируются в эту папку.

По завершению подготовительных действий, PsExec устанавливает и запускает службу, используя API функции Windows для управления службами. После того как PSEXESVC запустится, между ним и PsExec создаётся несколько каналов для передачи данных (вводимых команд, результатов, и т.д.). Завершив работу, PsExec останавливает службу, и удаляет её с целевого компьютера.

Windows Management Instrumentation (WMI)

Следующий способ реализации этой популярной задачи, о котором я хочу поведать – использование Windows Management Instrumentation. WMI присутствует во всех операционных системах Microsoft, начиная с Windows 2000, и даже на Windows 9x его можно установить из отдельного пакета. WMI включён по умолчанию, и не требует дополнительной настройки. Для его использования достаточно административных прав, и разрешенного на брандмауэре протокола DCOM. WMI предоставляет огромные возможности для управления системами, но нас сейчас интересует лишь одна из них.

Для запуска процессов нам потребуется метод Create класса Win32_Process. Использовать его достаточно несложно. В PowerShell это делается следующим образом:

[code]$Computer = “main”
$Command = “cmd.exe /c systeminfo.exe > \servershare%computername%.txt”
([wmiclass]”\$Computerrootcimv2:Win32_Process”).create($Command)[/code]

Здесь в качестве запускаемого процесса я указал cmd.exe, а уже ему, в качестве аргументов передал нужную команду. Это необходимо в случае если вам нужно использовать переменные окружения удалённого компьютера или встроенные операторы cmd.exe, такие как «>» для перенаправления вывода в файл. Метод Create не дожидается завершения процесса, и не возвращает результатов, но зато сообщает нам его идентификатор – ProcessID.

Если вы используете компьютер, на котором пока не установлен PowerShell, вы можете вызвать этот метод WMI и из сценария на VBScript. Например, вот так:

Листинг №1 – Запуск процесса используя WMI (VBScript) 

[code]Computer = “PC3”
Command = “cmd.exe /c systeminfo.exe > \servershare%computername%.txt”
Set objWMIService = GetObject(“winmgmts:\” & Computer & “rootcimv2:Win32_Process”)
Result = objWMIService.Create(“calc.exe”, Null, Null, intProcessID)[/code]

Но гораздо проще воспользоваться утилитой командной строки wmic.exe которая предоставляет достаточно удобный интерфейс для работы с WMI и входит в состав операционных систем, начиная с Windows XP. В ней чтобы запустить, например калькулятор на компьютере main достаточно выполнить следующую команду:

[code]wmic /node:main process call create calc.exe[/code]

Разумеется, возможности WMI не ограничиваются только запуском процессов. Если вам интересно дальнейшее изучение этой технологии, я рекомендую ознакомиться со статьями Константина Леонтьева, посвященными WMI, ссылки на которые вы можете найти в конце статьи.

WSH Remote Scripting

Да, как ни странно у Windows Script Host тоже есть возможность запуска сценариев на других компьютерах. Правда эта функция не получила большой популярности, и скорее всего из-за того, что требует слишком много подготовительных мероприятий, а взамен предоставляет совсем немного возможностей. Но я все равно расскажу об этом методе, так, как и он может пригодиться.

Итак, для запуска сценария на другом компьютере с помощью WSH нам понадобится сделать следующее:

  1. Права администратора на удалённом компьютере. Это само собой разумеется, и требуется почти для всех остальных методов запуска, перечисленных в этой статье.
  2. Разрешить WSH Remote Scripting создав в системном реестре строковой параметр Remote равный “1” в ключе реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows Script HostSettings
  3. Из-за ошибки описанной в статье базы знаний Microsoft с номером 311269, на системах с Windows XP может понадобиться выполнить команду wscript –regserver
  4. Если на компьютерах используется брандмауэр, то в нём необходимо разрешить обращения к DCOM. Причем сделать это надо не только на управляемом компьютере, но и на том с которого вы хотите запускать сценарий.
  5. В системах Windows XP с пакетом обновлений 2 и выше, необходимо изменить параметры безопасности DCOM. Это можно сделать с помощью групповой политики. В узле Computer Configuration Windows Settings Security Settings Local Policies Security Options следует установить разрешения следующим образом:
    1. DCOM: Machine Access Restrictions in Security Descriptor Definition Language (SDDL) syntax
      Выдать группам Anonymous Logon и Everyone разрешения Allow Local и Allow Remote Access
    2. DCOM: Machine Launch Restrictions in Security Descriptor Definition Language (SDDL) syntax
      Выдать группе Administrators разрешения Allow Local Launch, Allow Remote Launch, Allow Local Activation, Allow Remote Activation
      Группе Everyone – Allow Local Launch, Allow Local Activation

Ну и после всех этих процедур, можно попробовать запустить свой сценарий на другом компьютере.

Пример сценария, который использует эту технологию:

Листинг №2 – WSH remote scripting (VBScript) 

[code]Set objController = CreateObject(“WshController”)
Set objRemoteScript = objController.CreateScript(“C:test.vbs”, “PC5”)WScript.ConnectObject objRemoteScript, “remote_”
objRemoteScript.Execute
Do While objRemoteScript.Status <> 1
WScript.Sleep 1000
Loop
MsgBox “Script complete”
Sub remote_Error
Dim objError
Set objError = objRemoteScript.Error
WScript.Echo “Error – Line: ” & objError.Line & _
“, Char: ” & objError.Character & vbCrLf & _
“Description: ” & objError.Description[/code]

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

Более подробную статью об этой технологии можно прочитать в статье Advanced VBScript for Microsoft Windows Administrators – Chapter 6: Remote Scripting (см. Ссылки).

Планировщик заданий (Task Scheduler)

Планировщиком заданий можно управлять из командной строки используя две утилиты – at.exe и schtasks.exe. Обе эти утилиты позволяют указать имя удалённого компьютера для создания задания, и, следовательно, позволяют решить нашу задачу. Но подробно мы рассмотрим лишь schtasks.exe, так как она предоставляет гораздо больше возможностей.

Хотя выполнение команд на других компьютерах не является основным предназначением планировщика, тем не менее он позволяет реализовать немало интересных сценариев. Например, с его помощью можно включить установку программного обеспечения в период обеденного перерыва. Или если ваши пользователи обедают в разное время, запуск можно выполнять после определённого периода бездействия компьютера.

[code]schtasks /create /s server6.td.local /tn install /tr \maindatainstall.cmd /sc once /st 13:00 /ru system[/code]

Важно понимать от имени какой учетной записи будет выполняться задача. В этом примере я указал для параметра /ru значение system, следовательно, для выполнения установки учетной записи компьютера будет необходим доступ на чтение в сетевую папку с дистрибутивом программы.

Еще полезным решением, мне кажется запланировать какое-либо действие, на ежедневное выполнение, и удалять задачу лишь при подтверждении его успеха. То есть вы можете создать простой командный файл, который сначала запускает установщик программы, дожидается его завершения, и проверяет – успешно ли установилась программа. Если это так, то он удаляет задание из планировщика на этом компьютере. Пример такого файла:

Листинг №3 – Установка программы с последующим удалением задания (Windows Batch) 

[code]msiexec /qn /package \serversharesubinacl.msi
if exist “c:program filesWindows Resource KitsToolssubinacl.exe” (
subinacl /tn Install_Subinacl /f
)[/code]

WinRM (WS-Management)

WinRM – это реализация открытого стандарта DMTF (Distributed Management Task Force) от Microsoft, которая позволяет управлять системами с помощью веб-служб. Углубляться в устройство технологии я не буду, а лишь кратко опишу, что необходимо для её использования.

Версия WinRM 1 и выше входит в состав операционных систем, начиная с Windows Vista и Windows Server 2008. Для Windows XP и Windows Server 2003 можно установить WinRM в виде отдельного пакета (см. ссылки).

Для того чтобы быстро настроить компьютер для подключений к нему используя стандартные порты и разрешив подключения административным учетным записям, достаточно выполнить команду:

[code]winrm quickconfig[/code]

Чтобы winrm не спрашивал подтверждения, можно добавить к вызову ключ -quiet. Узнать информацию о более тонкой настройке можно посмотреть встроенную справку winrm:

[code]winrm help config[/code]

Если на управляемом компьютере работает веб-сервер, WinRM никак ему не помешает, хоть и использует по умолчанию стандартные порты HTTP. Он будет перехватывать лишь подключения, предназначенные специально для него.

Разумеется, необязательно выполнять эту команду вручную, на каждом компьютере которым вы хотите управлять. Все необходимые настройки легко сделать с помощью групповых политик. Для этого нужно:

  1. Настроить службу WinRM (Windows Remote Management) на автоматический запуск
  2. Настроить элемент групповой политики Computer Configuration Administrative Templates Windows Components Windows Remote Management (WinRM) WinRM Service Allow automatic configuration of listeners. Тут нужно указать диапазоны IP-адресов с которых разрешаются подключения.
  3. Разумеется, еще вам будет необходимо разрешить подключения на соответствующие порты (по умолчанию 80) в брандмауэре Windows.

Независимо от того используется ли порт HTTP (80) или HTTPS (443) трафик, передаваемый WinRM шифруется (если конечно вы не отключите эту опцию). Для аутентификации по умолчанию используется протокол Kerberos.

Но хватит о настройках, лучше перейдем непосредственно к использованию. Хоть утилита winrm позволяет настраивать службу WinRM, а также выполнять, например, WMI запросы, нам более интересна другая – winrs. Буквы RS тут означают Remote Shell. WinRS работает очень похоже на PsExec хотя и использует технологию WinRM. Имя компьютера задаётся ключом -r, а после него следует команда, которую нужно выполнить. Вот несколько примеров:

[code]winrs -r:Core ver.exe[/code]

Так как winrs и так использует cmd.exe в качестве удалённой оболчки, в командах можно легко обращаться к удалённым переменным окружения, или использовать другие встроенные команды cmd.exe:

[code]winrs -r:Core “dir c:temp > c:templist.txt”[/code]

Как и PsExec, утилита winrs позволяет открыть интерактивный сеанс на удалённом компьютере:

[code]winrs -r:main cmd.exe[/code]

Эта функция аналогична telnet сессии, но использование winrs однозначно лучше telnet и даже PsExec, с точки зрения безопасности. Независимо от того используется ли порт HTTP (80) или HTTPS (443), трафик, передаваемый WinRM шифруется (если конечно вы не отключите эту опцию). Для аутентификации по умолчанию используется протокол Kerberos.

Windows PowerShell 2.0 Remoting

Хотя вторая версия Windows PowerShell на момент написания статьи находится еще в состоянии бета тестирования, о её возможностях в области удалённого выполнения команд определённо стоит рассказать уже сейчас. Попробовать его своими руками вы можете либо, загрузив предварительную версию (см. ссылки) либо в составе бета-версии Windows 7 или Windows Server 2008 R2.

Инфраструктура PowerShell Remoting основана на WinRM версии 2.0, и поэтому наследует все преимущества этой технологии, такие как шифрование передаваемых данных, и возможность работать по стандартным портам HTTP/HTTPS. Но благодаря богатым возможностям языка Windows PowerShell, и его способностям работы с объектами, мы получаем еще большие возможности. На данный момент пакет WinRM2.0 тоже находится в состоянии бета-тестирования, и доступен для загрузки только для систем Windows Vista и Windows 2008. В системы Windows 7 и Windows Server 2008R2 он будет встроен изначально, как и PowerShell 2.0.

Обновление: К моменту публикации статьи на ItBand.ru, финальные версии PowerShell 2.0 и WinRM 2.0 доступны уже для всех поддерживаемых платформ. В состав Windows Server 2008R2 и Windows 7 они уже включены как неотъемлемые компоненты системы, а для Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008 все необходимые компоненты можно получить в виде пакета называемого Windows Management Framework.

Перед тем как воспользоваться всеми этими преимуществами, PowerShell Remoting необходимо активизировать, на управляющем, и управляемых компьютерах. Сделать это просто, запустив командлет (команду Windows PowerShell) Enable-PSRemoting. Причем если добавить ключ -Force то никаких подтверждений запрошено не будет. Этот командлет при необходимости вызовет winrs quickconfig, и создаст исключения в брандмауэре Windows, так что никаких дополнительных действий выполнять не нужно.

После этого вы сможете легко выполнять команды на других компьютерах используя командлет Invoke-Command (или его псевдоним icm):

[code]Invoke-Command -ComputerName Main -ScriptBlock {netsh interface dump > c:ipconfig.txt}[/code]

Разумеется команду можно заранее поместить в переменную, а для параметра -ComputerName указать имена не одного, а сразу нескольких компьютеров. Следующая последовательность позволяет вывести версию файла Explorer.exe сразу с трех компьютеров.

[code]$Command = {(get-item c:Windowsexplorer.exe).VersionInfo.FileVersion}
Invoke-Command -ComputerName Main, Server7, Replica -ScriptBlock $Command[/code]

Как видно на, можно передавать сразу несколько команд в одном блоке, помещать их результаты выполнения на нескольких компьютерах в переменную, а затем обрабатывать на рабочей станции используя возможности Windows PowerShell по работе с объектами.

Впрочем, возможности PowerShell Remoting на этом только начинаются. С помощью командлета Enter-PSSession вы можете войти в интерактивную сессию Windows PowerShell на удалённом компьютере. Выйти из такого сеанса можно использовав командлет Exit-PSSession, или просто exit.

Командлет New-PSSession создает сессии на удалённых компьютерах, указатели на которые можно поместить в переменную, а затем передавая её как аргумент для Invoke-Command выполнять команды сразу на нескольких компьютерах, в постоянном окружении. Пример вы можете увидеть на скриншоте, где я выполняю последовательность команд сразу на нескольких компьютерах из списка [code]c:computers.txt.[/code]

Проксирование

Этот метод отличается от всех вышеперечисленных, и служит совсем для других задач, но не менее актуален. Когда делегирование полномочий невозможно, или предоставляет слишком большие возможности, он позволяет разрешить обычному пользователю выполнять некую команду, требующую административных привилегий, никаким образом, не выдавая дополнительных полномочий и не подставляя под угрозу пароль администратора.

Чаще всего такие проблемы люди решают с помощью утилит вроде cpau.exe (см. ссылки) которые создают файл с зашифрованным паролем административной учетной записи, позволяющий запускать определённую программу. Проблема, однако, в том, что хоть пароль и зашифрован, перед запуском программы утилите придётся его расшифровать. А соответственно пользователь может использовать утилиту повторяющую алгоритм расшифровки пароля, и узнать его, чтобы затем использовать для запуска других программ или получения дополнительных привилегий. Практически это конечно достаточно сложно для обычных пользователей, не обладающих специальными знаниями, но, тем не менее, вполне возможно. Еще раз уточню, это не беда конкретной утилиты, а проблема такого подхода вообще.

Еще может показаться, что для решения задачи подойдет параметр /savecred утилиты runas. Но тут есть даже две проблемы. Во-первых, как и вышеописанном случае, пароль сохраняется на компьютере пользователя, а, следовательно, может быть расшифрован, хотя в случае с runas для этого и понадобятся права локального администратора. Во-вторых, runas сохраняет учетные данные, не связывая их с конкретной командой, а, следовательно, пользователь сможет запустить с завышенными правами не только ту команду, доступ к которой вы хотели ему предоставить, но и любую другую.

Чтобы избежать этих проблем, но, тем не менее, разрешить выполнение конкретной команды, можно использовать методику, которая называется “проксированием”.

Работает она следующим образом. На компьютере постоянно работает сценарий с высокими привилегиями. Например, в нашем случае он будет запущен из-под учетной записи, обладающей правами администратора на файловом сервере. По сигналу пользователя он будет выполнять одну, заранее определённую команду. В этом примере – закрывать все файлы, открытые по сети.

Для организации этой системы мы поместим на сервере, например, в папке c:scripts командные файлы Server.cmd и Action.cmd.

Листинг №4 – Server.cmd (Windows Batch) 

[code]set trigger=c:commandSharetrigger.txt
set action=c:scriptsaction.cmd
set log=c:scriptslog.txt
:start
if exist %trigger% start %action% & echo %time% %date%>>%log% & del %trigger%
sleep.exe 5
goto start[/code]

Листинг №5 – Action.cmd (Windows Batch) 

[code]for /f “skip=4 tokens=1” %%a in (‘net files’) do net files %%a /close
exit[/code]

Server.cmd будет ждать знака от пользователя (создание файла в определенном месте), и получив его, запускать файл с командами – Action.cmd. Разумеется, в эту папку пользователи не должны иметь никакого доступа. Автоматический запуск Server.cmd при запуске компьютера можно организовать, просто создав соответствующую задачу в планировщике:

[code]schtasks /create /ru domainadministrator /rp /sc onstart /tn ProxyScript /tr c:scriptsserver.cmd[/code]

После параметра /ru указывается учетная запись, под которой будет выполняться сценарий (в нашем случае она обладает правами администратора на сервере), так как после параметра /rp пароль не указан – он будет запрошен при создании задачи. Параметр /sc позволяет указать момент запуска сценария, в нашем случае – при включении компьютера. Ну а /tn и /tr позволяют указать имя задачи, и исполняемый файл.

Теперь, для того чтобы пользователь мог подать сценарию сигнал, мы создадим папку c:commandShare и сделаем её доступной по сети. Доступ на запись в эту папку должен быть только у тех пользователей, которые будут запускать команду.

После этого достаточно будет поместить пользователю на рабочий стол файл Run.cmd.

Листинг №6 – Run.cmd (Windows Batch) 

[code]echo test > \servercommandSharetrigger.txt[/code]

При его выполнении, от имени пользователя, будет создаваться файл \servercommandSharetrigger.txt. Сценарий Server.cmd, заметив его, запустит на выполнение со своими привилегиями файл Action.cmd, добавит запись в файл c:scriptslog.txt о текущем времени, а затем удалит trigger.txt чтобы не выполнять команду снова до следующего сигнала пользователя.

В сценарии Server.cmd используется утилита Sleep.exe, позволяющая сделать паузу в выполнении сценария на заданный в секундах промежуток времени. Она не входит в состав операционной системы, но её можно взять из набора Resource Kit Tools (см. ссылки) и просто скопировать на любой компьютер.

Ссылки

Скачать PsTool в составе PsExec с этого сайта.

PsExec.exe скачать с сайта Microsoft

Windows SysInternals

Ранее статья была опубликована в журнале Windows IT Pro RE в №4 за 2009 год. 

Василий Гусев 

http://xaegr.wordpress.com/

Is it possible to execute a Windows shell command on a remote PC when I know its login name and password?
Is it possible to do it using client PC’s Windows shell?

Ross Ridge's user avatar

Ross Ridge

37.8k7 gold badges79 silver badges111 bronze badges

asked Aug 13, 2012 at 13:51

bubble's user avatar

0

If you are in a domain environment, you can also use:

winrs -r:PCNAME cmd

This will open a remote command shell.

Code Lღver's user avatar

Code Lღver

15.5k16 gold badges56 silver badges75 bronze badges

answered Jun 16, 2014 at 12:21

user3744855's user avatar

user3744855user3744855

6115 silver badges2 bronze badges

6

psexec \RemoteComputer cmd.exe

or use ssh or TeamViewer or RemoteDesktop!

answered Aug 13, 2012 at 13:56

Raphi Pour's user avatar

Raphi PourRaphi Pour

4194 silver badges7 bronze badges

3

This can be done by using PsExec which can be downloaded here

psexec \computer_name -u username -p password ipconfig

If this isn’t working try doing this :-

  1. Open RegEdit on your remote server.
  2. Navigate to HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem.

  3. Add a new DWORD value called LocalAccountTokenFilterPolicy

  4. Set its
    value to 1.
  5. Reboot your remote server.
  6. Try running PSExec again from
    your local server.

answered Jul 16, 2018 at 11:29

Birat Bade Shrestha's user avatar

4

You can use native win command:

WMIC /node:ComputerName process call create “cmd.exe /c start.exe”

The WMIC is part of wbem win folder: C:WindowsSystem32wbem

answered May 20, 2015 at 9:21

Eyal Sooliman's user avatar

3

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

Я использую 2 средства удаленного выполнения консольных команд: PsExec и WinRM, у каждого из них есть свои преимущества.

PsExec

Одним из отличных решений поставленной в заголовке задачи является использование программы PsExec от великого Марка Руссиновича.

Программа работает по клиент-серверному принципу: на локальной машине выполняется клиент, который посылает команды серверу на удаленном компьютере. Особенностью этой программы является то, что серверная часть устанавливается автоматически непосредственно перед выполнением команды, а затем удаляется. Таким образом для выполнения команд на удаленных машинах достаточно иметь на них административные права.

Если PsExec запускается от имени администратора, который входит в тот же домен, что и удаленны компьютер, то никаких учетных данных даже вводить не нужно. В противном случае, их можно указать в командной строке, либо PsExec сама их запросит. PsExec работает на ОС начиная с Windows 2000 и заканчивая 64-битным Windows Server 2008 R2.

Очень полезными в PsExec являются следующие возможности:

  • Выполнение команды на группе компьютеров. Пример: следующая команда позволяет принудительно применить самые свежие групповые политики:
    psexec @group.txt gpupdate /force
  • Выполнение команд от имени системной учетной записи. Пример: следующая команда заставит удаленную систему принудительно проверить обновления:
    psexec \computer -s wuauclt /detectnow
  • Копирование выполняемой программы на удаленный компьютер перед выполнением. Пример: следующая команда позволит обновить членство данного компьютера в группе безопасности Active Directory (токен доступа) без перезагрузки:
    psexec \computer -c -s klist.exe purge

Трудно переоценить пользу этой программы, если использовать скрипты и возможности консольных команд, встроенных в Windows.

Windows Remote Management

Изначально это была серверная технология для удаленного управления оборудованием, которая появилась в Windows Server 2003 R2 как часть компонента Hardware Management, но недавно Microsoft выпустили пакет Windows Management Framework, который включает в себя PowerShell 2.0 и WinRM 2.0 и устанавливается на клиентские ОС как обновление. Подробности можно прочитать в статье KB968929.

Прелесть WinRM заключается в простоте развертывания в доменной среде через WSUS в качестве факультативного обновления ОС и мощи, которую даёт совместное с PowerShell применение.

Использование WinRM происходит через 2 команды.

winrm.cmd служит для конфигурирования настроек и диагностики клиента и сервера WinRM.

Для того, чтобы сервер WinRM начал принимать команды, должна быть запущена служба Windows Remote Management и произведена её начальная конфигурация. Используйте команду

winrm quickconfig на локальной машине, либо финт ушами
psexec -s \servername winrm quickconfig по сети, используя PsExec от имени системной учетной записи.

Будет предложено автоматически запускать службу WinRM и разрешить уделенные подключения, соглашайтесь ;)

Чтобы успешно подключаться к WinRM серверу (имеется в виду серверная часть, принимающая команды), не входящему в тот же домен, что и ваш клиентский компьютер, необходимо на клиенте этот целевой сервер добавить в «доверенный список» следующей командой:

winrm set winrm/config/client @{TrustedHosts="servername"}, где вместо servername можно указать IP-адрес, либо * (звёздочку).

Для пользователей Windows Vista и Windows 7, работающим не от имени встроенного администратора (обычно так и бывает), нужно выполнить следующую команду

reg add HKLMSOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

По умолчанию, установлено ограничение на 5 одновременных соединений WinRM от клиента, для увеличения этого числа выполните команду

winrm s winrm/config/winrs @{MaxShellsPerUser="X"}

winrs.exe — клиент для отправки запросов к серверной части. Пример: следующая команда принудительно перезагрузит удаленную систему…

winrs -r:servername shutdown /r /t 0

В доменной среде при отправке команд используются учетные данные запустившего пользователя. Для посыла команд от имени другого пользователя используются ключи -u:user -p:pass. Пример: следующая команда очистит локальный кэш DNS-имён на удаленной системе

winrs -r:servername -u:user -p:pass ipconfig /flushdns

PsExec — утилита для удаленного выполнения команд

Выполнение команд на удаленном компьютере — задача довольно распространенная. Это может быть необходимо для изменения настроек системы, установки или удаления программ и много еще для чего. Для решения подобных задач есть довольно много различных инструментов, начиная с серьезных программных комплексов типа System Center Configuration Manager и заканчивая скромными утилитами командной строки. Об одной из таких утилит и пойдет речь в этой статье.

Утилита PsExec входит в состав пакета PsTools компании Sysinternals. Она позволяет выполнять команды на удаленных компьютерах и при этом не требует установки в систему. Для использования утилиты достаточно просто скопировать ее в папку с исполняемыми файлами (напр. C:Windowssystem32) и запустить из любой оболочки командной строки: Cmd или PowerShell.
Принцип работы программы состоит в следующем: в ресурсах исполняемого файла PsExec.exe находится еще один исполняемый файл – PSEXESVC, который является службой Windows. Перед выполнением команды PsExec распаковывает этот ресурс в скрытую административную папку удалённого компьютера Admin$ (C:Windows), в файл C:Windowssystem32psexesvc.exe.

Примечание.
Если вы с помощью ключа -c
указали программе, что необходимо скопировать исполняемые файлы на эту систему, они тоже скопируются в эту папку.

После завершения копирования PsExec устанавливает и запускает службу, используя API функции Windows для управления службами. Затем, после запуска PSEXESVC между ним и PsExec устанавливается соединение для передачи данных (ввода команд и получения результатов). По завершению работы PsExec останавливает службу и удаляет её с целевого компьютера.

Синтаксис PsExec выглядит следующим образом:

psexec \компьютер [-u пользователь [-p пароль]] программа [аргументы]

Имя пользователя и пароль можно и не задавать, тогда удаленный процесс запускается из под той же учетной записи, что и программа PsExec. Однако поскольку удаленный процесс является олицетворением, то он не будет иметь доступа к сетевым ресурсам удаленной системы. Если же задать имя пользователя, то удаленный процесс запустится из под указанной учетной записи и получит доступ к тем же сетевым ресурсам удаленной системы, что и данная учетная запись. Однако имейте ввиду, что пароль передается в удаленную систему открытым текстом.

В качестве примера очистим кэш dns на удаленном компьютере SRV1:

psexec \SRV1 ipconfig /flushdns

Команда будет запущена на компьютере SRV1 под вашими учетными данными. После завершения работы ipconfig весь текстовый вывод будет передан на ваш компьютер, а кроме того будет возвращён код выполнения команды (error code). В случае если команда выполнилась успешно, он будет равен 0.

Если нужно выполнить несколько команд, то лучше установить с удаленным компьютером интерактивный сеанс. Для этого вводим команду psexec \SRV1 cmd
. Теперь команды, вводимые на локальном компьютере будут выполняться на удаленном компьютере SRV1.

PsExec позволяет выполнить команду одновременно на нескольких компьютерах. Для этого можно ввести имена компьютеров через запятую: psexec \SRV1, SRV2
или сохранить их в текстовом файле и затем указать его адрес: psexec @c:comp.txt
. Если же вместо имени компьютера поставить звездочку, вот так: psexec \*
, то команда будет выполнена на всех компьютерах домена.

И еще один интересный способ использования утилиты PsExec. Если не указывать имя компьютера, то по умолчанию команда выполняется в локальной системе. Используя ключ -s
можно запускать программы под учетной записью системы. Например, запустим сеанс командной строки: psexec -s cmd
и затем командой whoami
проверим, под каким пользователем мы сейчас работаем. Эта возможность может пригодиться для отладки программ или доступа к скрытым разделам реестра SAM и SECURITY.

Ну и несколько слов о ключах программы. Все описывать не буду, расскажу о наиболее интересных:

Указанная программа копируется в удаленную систему для выполнения. Например:

psexec \SRV1 -c test.exe

Если этот параметр не задан, то приложение должно находиться в системной папке удаленного компьютера. Если же на удаленном компьютере такая программа уже есть и находится не в системном каталоге, то необходимо указать к ней полный путь (если имя программы содержит пробелы, то его необходимо поместить в кавычки):

psexec \SRV1 «c:program filestest.exe»

Если вместе с ключом -c
использовать ключ -f
то даже если программа уже есть в удаленной системе, она будет перезаписана. А с ключом -v
она перезапишется только в том случае, если копируемая версия программы более новая чем та, что установлена в системе.

Работа программы в интерактивном режиме. По умолчанию PsExec выполняет команды в скрытом режиме, то есть на системе где выполняется команда, не выводятся никакие окна или диалоги. Однако есть возможность изменить это с помощью ключа -i
. После него можно указать номер сессии, в которой выводить окна, а можно и не указывать, тогда интерфейс будет отображен в консольной сессии.

Указывает, что не нужно ждать завершения приложения. В этом случае мы не получим выходных данных от консольной утилиты, но зато сможем не дожидаясь завершения предыдущей команды запускать следующие. Этот параметр следует использовать только при запуске неинтерактивных приложений.

Используется для запуска программы в режиме . Может потребоваться в операционных системах Windows Vista и выше для запуска некоторых программ, вносящих изменения в настройки системы (например regedit).

А с помощью этого ключа можно наоборот понизить полномочия. При запуске процесса пользователю вне зависимости от его принадлежности к группе администраторов предоставляются ограниченные права (права группы «администраторы» отменяются, и пользователю предоставляются только права, назначенные группе «пользователи»).

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

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

Я использую 2 средства удаленного выполнения консольных команд: PsExec и WinRM , у каждого из них есть свои преимущества.

PsExec

Одним из отличных решений поставленной в заголовке задачи является использование программы PsExec от великого Марка Руссиновича .

Программа работает по клиент-серверному принципу: на локальной машине выполняется клиент, который посылает команды серверу на удаленном компьютере. Особенностью этой программы является то, что серверная часть устанавливается автоматически непосредственно перед выполнением команды, а затем удаляется. Таким образом для выполнения команд на удаленных машинах достаточно иметь на них административные права.

Если PsExec запускается от имени администратора, который входит в тот же домен, что и удаленны компьютер, то никаких учетных данных даже вводить не нужно. В противном случае, их можно указать в командной строке, либо PsExec сама их запросит. PsExec работает на ОС начиная с Windows 2000 и заканчивая 64-битным Windows Server 2008 R2.

Очень полезными в PsExec являются следующие возможности:

  • Выполнение команды на группе компьютеров
    . Пример: следующая команда позволяет принудительно применить самые свежие групповые политики:
    psexec @group.txt gpupdate /force
  • Выполнение команд от имени системной учетной записи
    . Пример: следующая команда заставит удаленную систему принудительно проверить обновления:
    psexec \computer -s wuauclt /detectnow
  • Копирование выполняемой программы на удаленный компьютер перед выполнением
    . Пример: следующая команда позволит обновить членство данного компьютера в группе безопасности Active Directory (токен доступа) без перезагрузки:
    psexec \computer -c -s klist.exe purge

Трудно переоценить пользу этой программы, если использовать скрипты и возможности консольных команд, встроенных в Windows.

Windows Remote Management

Изначально это была серверная технология для удаленного управления оборудованием, которая появилась в Windows Server 2003 R2 как часть компонента Hardware Management, но недавно Microsoft выпустили пакет Windows Management Framework, который включает в себя PowerShell 2.0 и WinRM 2.0 и устанавливается на клиентские ОС как обновление. Подробности можно прочитать в статье KB968929 .

Прелесть WinRM заключается в простоте развертывания в доменной среде через WSUS в качестве факультативного обновления ОС и мощи, которую даёт совместное с PowerShell применение.

Использование WinRM происходит через 2 команды.

winrm.cmd
служит для конфигурирования настроек и диагностики клиента и сервера WinRM.

Для того, чтобы сервер WinRM начал принимать команды, должна быть запущена служба Windows Remote Management и произведена её начальная конфигурация. Используйте команду

winrm quickconfig на локальной машине, либо финт ушами
psexec -s \servername winrm quickconfig по сети, используя PsExec от имени системной учетной записи.

Будет предложено автоматически запускать службу WinRM и разрешить уделенные подключения, соглашайтесь;)

Чтобы успешно подключаться к WinRM серверу (имеется в виду серверная часть, принимающая команды), не входящему в тот же домен, что и ваш клиентский компьютер, необходимо на клиенте этот целевой сервер добавить в «доверенный список» следующей командой:

winrm set winrm/config/client @{TrustedHosts=»servername»} , где вместо servername можно указать IP-адрес, либо * (звёздочку).

Для пользователей Windows Vista и Windows 7, работающим не от имени встроенного администратора (обычно так и бывает), нужно выполнить следующую команду

reg add HKLMSOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

По умолчанию, установлено ограничение на 5 одновременных соединений WinRM от клиента, для увеличения этого числа выполните команду

winrm s winrm/config/winrs @{MaxShellsPerUser=»X»}

winrs.exe
— клиент для отправки запросов к серверной части. Пример: следующая команда принудительно перезагрузит удаленную систему…

winrs -r:servername shutdown /r /t 0

В доменной среде при отправке команд используются учетные данные запустившего пользователя. Для посыла команд от имени другого пользователя используются ключи -u:user -p:pass. Пример: следующая команда очистит локальный кэш DNS-имён на удаленной системе

winrs -r:servername -u:user -p:pass ipconfig /flushdns

Служебные программы, такие как Telnet, и программы удаленного управления, такие как PC Anywhere компании Symantec, позволяют выполнять программы в удаленных системах, однако их не так просто установить, поскольку требуется устанавливать еще и клиентское программное обеспечение в тех удаленных системах, к которым необходимо получить доступ. Программа PsExec — это облегченный вариант Telnet. Она позволяет выполнять процессы в удаленных системах, используя для этого все возможности интерактивного интерфейса консольных приложений, и при этом нет необходимости вручную устанавливать клиентское программное обеспечение. Основное достоинство PsExec — это возможность вызывать в интерактивном режиме интерфейс командной строки в удаленных системах и удаленно запускать такие инструменты как IpConfig. Это единственный способ вывести на экран локального компьютера данные об удаленной системе.

Примечание. Некоторые антивирусные сканеры сообщают, что одна или несколько из этих программ заражены вирусом «remote admin». Ни одна из программ, входящих в набор PsTools, не содержит вирусов, но они использовались вирусами, что и приводит к появлению таких предупреждений.

Установка

Просто скопируйте программу PsExec в папку для исполняемых файлов. При вводе команды psexec на экран выводится справка о синтаксисе команды.

Программа PsExec работает в операционных системах Windows Vista, NT 4.0, Win2000, Windows XP и Server 2003, в том числе в 64-разрядных версиях ОС

Использование

В
статье Марка Руссиновича в выпуске журнала Windows IT Pro Magazine за июль 2004 года описаны дополнительные методы работы с программой PsExec
.

использование: psexec [\компьютер[,компьютер2[,…] | @файл][-u пользователь [-p пароль]][-n s][-l][-s|-e][-x][-i [сеанс]][-c [-f|-v]][-w каталог][-d][-<приоритет>][-a n,n,… ] программа [аргументы]

компьютер

Указывает программе PsExec, что нужно запустить приложение на заданном компьютере или компьютерах. Если имя компьютера не указано, то программа PsExec запустит приложение в локальной системе, если же вместо имени компьютера задан символ «звездочка» (\*), то программа PsExec запустит приложение на всех компьютерах текущего домена.

@файл

Указывает программе PsExec, что нужно запустить приложение на всех компьютерах, перечисленных в заданном текстовом файле.

Процессоры, на которых можно запустить приложение, отделяются запятыми, при этом процессоры нумеруются, начиная с 1. Например, чтобы запустить приложение на процессорах втором и четвертом, введите «-a 2,4»

Указанная программа копируется в удаленную систему для выполнения. Если этот параметр не задан, то приложение должно находиться в системной папке удаленной системы.

Указывает, что не нужно ждать завершения приложения. Этот параметр следует использовать только при запуске неинтерактивных приложений.

Указанный профиль учетной записи не загружается.

Указанная программа копируется в удаленную систему, даже если такой файл в удаленной системе уже есть.

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

При запуске процесса пользователю предоставляются ограниченные права (права группы администраторов отменяются, и пользователю предоставляются только права, назначенные группе «пользователи»). В ОС Windows Vista процесс запускается с низким уровнем благонадежности.

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

Позволяет указать необязательный пароль для имени пользователя. Если этот параметр опущен, то будет выдан запрос на ввод пароля, при этом пароль не будет отображаться на экране.

Удаленный процесс запускается из системной учетной записи.

Позволяет указать необязательное имя пользователя для входа в удаленную систему.

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

Позволяет указать для процесса рабочий каталог (путь внутри удаленной системы).

Отображает интерфейс пользователя на рабочем столе Winlogon (только в локальной системе).

-приоритет
(приоритет)

Позволяет задавать для процесса различные приоритеты: -low (низкий), -belownormal (ниже среднего), -abovenormal (выше среднего), -high (высокий) или -realtime (реального времени).

программа

Имя запускаемой программы.

аргументы

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

Чтобы задать имя приложения, которое содержит пробелы, используйте кавычки, например psexec \marklap «c:длинное имяapp.exe». Введенные данные передаются в удаленную систему при нажатии клавиши «Ввод», для завершения удаленного процесса нужно нажать сочетание клавиш Ctrl-C.

Если имя пользователя не задано, то удаленный процесс запускается из той же учетной записи, что и программа PsExec. Однако поскольку удаленный процесс является олицетворением, то он не будет иметь доступа к сетевым ресурсам удаленной системы. Если имя пользователя задано, то удаленный процесс запускается из указанной учетной записи и получает доступ к тем же сетевым ресурсам удаленной системы, что и данная учетная запись. Учтите, что пароль передается в удаленную систему в виде открытого текста.

При обращении к локальной системе эту версию программы PsExec можно использовать вместо программы Runas, поскольку для программы PsExec не требуются права администратора.

Примеры

Эта команда вызывает интерактивный интерфейс командной строки в системе \marklap:

psexec \marklap cmd

Эта команда запускает в удаленной системе программу IpConfig с параметром /all и выводит полученные данные на экран локальной системы:

psexec \marklap ipconfig /all

Эта команда копирует программу test.exe в удаленную систему и выполняет ее в интерактивном режиме.

psexec \marklap -c test.exe

Если в удаленной системе такая программа уже установлена и находится не в системном каталоге, укажите полный путь к этой программе

psexec \marklap c:bintest.exe

Эта команда запускает в интерактивном режиме из системной учетной записи программу Regedit для просмотра данных разделов реестра SAM и SECURITY:

psexec -i -d -s c:windowsregedit.exe

Эта команда используется для вызова программы Internet Explorer от имени пользователя с ограниченными правами:

psexec -l -d «c:program filesinternet exploreriexplore.exe»

Для выполнения команд на удалённом ПК можно использовать утилиту psexec из набора PsTools, который можно скачать с официального сайта Microsoft.

Содержание

  • 1 Запуск командной строки на удалённом ПК
  • 2 Переименование удалённого ПК
  • 3 Отключение брандмауэра
  • 4 Включение удалённого рабочего стола
  • 5 Добавление пользователя в локальную группу

Запуск командной строки на удалённом ПК

Для подключения можно использовать IP адрес или имя компьютера:

psExec64.exe \192.168.2.68 cmd

или если хотим подключиться не от имени текущего пользователя, то:

PsExec.exe \192.168.2.68 -u ДоменПользователь -p Пароль cmd

Если ПК не в домене, то вместо «Домен» указываем имя ПК.

После удачного подключения изменится заголовок окна.

Переименование удалённого ПК

Текущее имя ПК можно увидеть через запрос к значению в реестре:

reg query «HKLMSYSTEMCurrentControlSetControlComputerNameComputerName» /v ComputerName

Изменяем в реестре имя ПК на New-PC-Name:

reg add «HKLMSYSTEMCurrentControlSetControlComputerNameComputerName» /v ComputerName /t REG_SZ /d «New-PC-Name» /f

reg add «HKLMSYSTEMCurrentControlSetServicesTcpipParameters» /v ComputerName /t REG_SZ /d «New-PC-Name» /f

Для вступления в силу нового имени нужно перезагрузить компьютер:

shutdown /r /f /t 180

Здесь мы дали пользователю 3 минуты (180 секунд) на закрытие документов, но можно этот параметр изменить в соответствии со случаем.

Отключение брандмауэра

Отключаем брандмауэр для всех профилей сети:

netsh advfirewall set allprofiles state off

Включение:

netsh advfirewall set allprofiles state on

Включение удалённого рабочего стола

Проверить есть ли доступ к удалённому рабочему столу можно с помощью команды telnet, попробовав подключиться к соответствующему порту. Для Windows штатным является подключение по протоколу RDP на порт 3389 (хотя, конечно, и порт для RDP можно изменить и использовать другие протоколы). В случае открытого порта (подключения разрешены) мы увидим приглашение командной оболочки telnet:

telnet 192.168.2.68 3389

Trying 192.168.2.68…
Connected to 192.168.2.68.
Escape character is ‘^]’.

Если же подключение запрещено, то команда зависнет на этапе «Trying 192.168.2.68…»

Даже если удалённое подключение к рабочему столу отключено его можно удалённо же и включить, а затем подключиться как обычно. Для этого внесём изменение в реестр удалённого ПК.

Если мы получили доступ к командной строке удалённого ПК (см. PsExec выше), то выполняем:

reg add «HKLMSYSTEMCurrentControlSetControlTerminal Server» /v fDenyTSConnections /t REG_DWORD /d 0 /f

Иначе, можно подключиться к реестру через оснастку.

1) Запускаем на удалённом ПК службу «Удаленный реестр«.

  • Входим в локальную оснастку «Службы»:

services.msc

  • Подключаемся к службам удалённого ПК: в боковом меню Службы в контекстном меню выбрать «Подключиться к другому компьютеру…»
  • Находим службу «Удаленный реестр» и меняем тип запуска на «Вручную»
  • Запускаем службу: кнопка «Запустить»

2) Подключаемся к реестру удалённого ПК.

  • На локальном ПК запускаем редактор реестра:

regedit

  • В верхнем меню выбираем: Файл — Подлкючить сетевой реестр…
  • Вводим имя ПК, нажимаем «ОК» и должен появиться дополнительный куст с именем ПК и двумя ветками: HKEY_LOCAL_MACHINE и HKEY_USERS
  • Спускаемся по веткам до HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal Server
  • Меняем параметр fDenyTSсonnections с 1 на 0

Пробуем подключиться:

mstsc

3) Если подлкючиться не удаётся, то нужно ещё донастроить брандмауэр на удалённом ПК

  • Получаем досутп к командной строке удалённого ПК с помощью PsExec:

psExec64.exe \192.168.2.68 cmd

  • Добавляем разрешающее правило в брандмауэр Windows на удалённое подключение к рабочему столу (порт 3389):

netsh advfirewall firewall add rule name=»Allow Remote Desktop» dir=in protocol=TCP localport=3389 action=allow

См. также

  • Включить RDP Windows удаленно и локально, за минуту — подробная инструкция со скриншотами

Добавление пользователя в локальную группу

1) Если у нас есть возможноть удалённого управления ПК, то проще всего запустить на локальном ПК Оснастку управелния компьютером

compmgmt.msc

и подключиться к удалённому ПК:

  1. Щёлкнуть правой клавишей мышы по корневому пункту бокового меню «Управление компьютером» и выбрать в контекстном меню пункт «Подключиться к другому компьютеру…«
  2. Ввести имя или IP адрес ПК или нажать «Обзор…» и поискать в домене

После подключения выбрать в боковом меню: Локальные пользователи и группы — Группы

И добавить нужных пользователей в нужную группу.

2) Если возможности удалённого управления нет, то можно попробовать его получить отключив брандмауэр на удалённом ПК и включив на нём службу «Удаленный реестр» (см. выше). Или получив с помощью утилиты psExec доступ к командной строке на удалённом ПК управлять пользователями и группами через командную строку.

I would like to have a Windows 2003 server fire a script to fire another script in a separate Windows Server 2008 computer.

I have been told that Powershell can do that, and that’s fine, but I need more specific details.

Does anyone have any tips for this?

Thanks!

Daniel's user avatar

Daniel

10.7k22 gold badges82 silver badges114 bronze badges

asked May 14, 2009 at 1:17

Frew Schmidt's user avatar

Frew SchmidtFrew Schmidt

9,30415 gold badges63 silver badges85 bronze badges

1

answered May 14, 2009 at 1:46

benPearce's user avatar

1

Look into the syntax for the AT command. You can use it to schedule a process to run on a remote machine.

The AT command schedules commands and programs to run on a computer at
a specified time and date. The Schedule service must be running to use
the AT command.

AT [\computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\computername] time [/INTERACTIVE]
    [ /EVERY:date[,...] | /NEXT:date[,...]] "command"

\computername     Specifies a remote computer. Commands are scheduled on the
                   local computer if this parameter is omitted.
id                 Is an identification number assigned to a scheduled
                   command.
/delete            Cancels a scheduled command. If id is omitted, all the
                   scheduled commands on the computer are canceled.
/yes               Used with cancel all jobs command when no further
                   confirmation is desired.
time               Specifies the time when command is to run.
/interactive       Allows the job to interact with the desktop of the user
                   who is logged on at the time the job runs.
/every:date[,...]  Runs the command on each specified day(s) of the week or
                   month. If date is omitted, the current day of the month
                   is assumed.
/next:date[,...]   Runs the specified command on the next occurrence of the
                   day (for example, next Thursday).  If date is omitted, the
                   current day of the month is assumed.
"command"          Is the Windows NT command, or batch program to be run.

answered May 14, 2009 at 1:33

cdonner's user avatar

cdonnercdonner

36.6k22 gold badges105 silver badges149 bronze badges

easiest way that is use will be in two steps

a. installing cygwin to remote pc

b. run ssh hudson@mcs ‘/cygdrive/c/path_to_script.bat’

answered Nov 25, 2013 at 13:42

pkm's user avatar

pkmpkm

2,6552 gold badges28 silver badges44 bronze badges

Speaking about PsExec, I would strongly suggest to use Cygwin/OpenSSH instead.

SSH has multiple advantages (over tools like PsExec or even custom-made services).
For example, try to use with PsExec and implement what these bash / ssh command lines do:

ssh user@remotehost "find . -name something" 2> all.errors.txt
ssh user@remotehost "grep -r something ."
if [ "$?" == "0" ]
then
    echo "FOUND"
else
    echo "NOT FOUND"
fi

Good Luck!

  • SSH transfers (!) remote stdout / stderr / exit status to local shell for inspection
    (killer feature and common requirement to integrate remote execution into logic of local scripts)

  • Cygwin/OpenSSH provides standard POSIX shell environment
    (efficient time investment, fundamental tools, cross-platform ready, compatible habits, etc.)

  • You can still/always run all native Windows application
    (including automatic execution of *.bat files by cmd processor)

  • You can configure password-less auth using public keys
    (think about unattended automated tasks)


Tip

There was one requirement I had problems with initially:
background sshd service had to execute apps in user’s graphical session
(to make application window appear in desktop environment).

The acceptable solution for me was running sshd service directly in user’s GUI session
(start automatically when user logs in, follow the link to see configuration file changes):

/usr/sbin/sshd -f /home/user/sshd_config

answered May 23, 2013 at 17:23

uvsmtid's user avatar

uvsmtiduvsmtid

4,0994 gold badges37 silver badges62 bronze badges

5

The accepted solution from http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Q_22959948.html is:

What I provide was a script that takes
parameters… In this case it takes 4.
1) Server: if you pass -server it will
only do that one server 2) List: You
can provide a list file of servers.
3) Service: Name of the service you
want to modify 4) Verbose: is not
used here.

I did have some mistakes that I
changed in the following code. To use
cut/paste the code into a file called
Set-RemoteService.ps1. Make sure to
set your executionpolicy to run
scripts… it will not by default. You
do that by using the
set-executionpolicy cmdlet. PS>
Set-Executionpolicy «RemoteSigned» to
run the script you do PS>
C:PathToScriptSet-RemoteService.ps1
-list c:ServerList.txt -service «DHCP»

######################### Param($server,$list,$service,[switch]$verbose)

if($Verbose){$VerbosePreference =
«Continue»} if($list) {
foreach($srv in (get-content $list))
{
$query = «Select * from Win32_Service where Name=’$service'»
$myService = get-WmiObject -query $query -computer $srv
$myService.ChangeStartMode(«Automatic»)
$myService.Start()
} } if($server) {
$query = «Select * from Win32_Service where Name=’$service'»
$myService = get-WmiObject -query $query -computer $server
$myService.ChangeStartMode(«Automatic»)
$myService.Start() }

answered May 14, 2009 at 1:31

Jonathan Parker's user avatar

Jonathan ParkerJonathan Parker

6,6673 gold badges42 silver badges54 bronze badges

1

I would like to have a Windows 2003 server fire a script to fire another script in a separate Windows Server 2008 computer.

I have been told that Powershell can do that, and that’s fine, but I need more specific details.

Does anyone have any tips for this?

Thanks!

Daniel's user avatar

Daniel

10.7k22 gold badges82 silver badges114 bronze badges

asked May 14, 2009 at 1:17

Frew Schmidt's user avatar

Frew SchmidtFrew Schmidt

9,30415 gold badges63 silver badges85 bronze badges

1

answered May 14, 2009 at 1:46

benPearce's user avatar

1

Look into the syntax for the AT command. You can use it to schedule a process to run on a remote machine.

The AT command schedules commands and programs to run on a computer at
a specified time and date. The Schedule service must be running to use
the AT command.

AT [\computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\computername] time [/INTERACTIVE]
    [ /EVERY:date[,...] | /NEXT:date[,...]] "command"

\computername     Specifies a remote computer. Commands are scheduled on the
                   local computer if this parameter is omitted.
id                 Is an identification number assigned to a scheduled
                   command.
/delete            Cancels a scheduled command. If id is omitted, all the
                   scheduled commands on the computer are canceled.
/yes               Used with cancel all jobs command when no further
                   confirmation is desired.
time               Specifies the time when command is to run.
/interactive       Allows the job to interact with the desktop of the user
                   who is logged on at the time the job runs.
/every:date[,...]  Runs the command on each specified day(s) of the week or
                   month. If date is omitted, the current day of the month
                   is assumed.
/next:date[,...]   Runs the specified command on the next occurrence of the
                   day (for example, next Thursday).  If date is omitted, the
                   current day of the month is assumed.
"command"          Is the Windows NT command, or batch program to be run.

answered May 14, 2009 at 1:33

cdonner's user avatar

cdonnercdonner

36.6k22 gold badges105 silver badges149 bronze badges

easiest way that is use will be in two steps

a. installing cygwin to remote pc

b. run ssh hudson@mcs ‘/cygdrive/c/path_to_script.bat’

answered Nov 25, 2013 at 13:42

pkm's user avatar

pkmpkm

2,6552 gold badges28 silver badges44 bronze badges

Speaking about PsExec, I would strongly suggest to use Cygwin/OpenSSH instead.

SSH has multiple advantages (over tools like PsExec or even custom-made services).
For example, try to use with PsExec and implement what these bash / ssh command lines do:

ssh user@remotehost "find . -name something" 2> all.errors.txt
ssh user@remotehost "grep -r something ."
if [ "$?" == "0" ]
then
    echo "FOUND"
else
    echo "NOT FOUND"
fi

Good Luck!

  • SSH transfers (!) remote stdout / stderr / exit status to local shell for inspection
    (killer feature and common requirement to integrate remote execution into logic of local scripts)

  • Cygwin/OpenSSH provides standard POSIX shell environment
    (efficient time investment, fundamental tools, cross-platform ready, compatible habits, etc.)

  • You can still/always run all native Windows application
    (including automatic execution of *.bat files by cmd processor)

  • You can configure password-less auth using public keys
    (think about unattended automated tasks)


Tip

There was one requirement I had problems with initially:
background sshd service had to execute apps in user’s graphical session
(to make application window appear in desktop environment).

The acceptable solution for me was running sshd service directly in user’s GUI session
(start automatically when user logs in, follow the link to see configuration file changes):

/usr/sbin/sshd -f /home/user/sshd_config

answered May 23, 2013 at 17:23

uvsmtid's user avatar

uvsmtiduvsmtid

4,0994 gold badges37 silver badges62 bronze badges

5

The accepted solution from http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Q_22959948.html is:

What I provide was a script that takes
parameters… In this case it takes 4.
1) Server: if you pass -server it will
only do that one server 2) List: You
can provide a list file of servers.
3) Service: Name of the service you
want to modify 4) Verbose: is not
used here.

I did have some mistakes that I
changed in the following code. To use
cut/paste the code into a file called
Set-RemoteService.ps1. Make sure to
set your executionpolicy to run
scripts… it will not by default. You
do that by using the
set-executionpolicy cmdlet. PS>
Set-Executionpolicy «RemoteSigned» to
run the script you do PS>
C:PathToScriptSet-RemoteService.ps1
-list c:ServerList.txt -service «DHCP»

######################### Param($server,$list,$service,[switch]$verbose)

if($Verbose){$VerbosePreference =
«Continue»} if($list) {
foreach($srv in (get-content $list))
{
$query = «Select * from Win32_Service where Name=’$service'»
$myService = get-WmiObject -query $query -computer $srv
$myService.ChangeStartMode(«Automatic»)
$myService.Start()
} } if($server) {
$query = «Select * from Win32_Service where Name=’$service'»
$myService = get-WmiObject -query $query -computer $server
$myService.ChangeStartMode(«Automatic»)
$myService.Start() }

answered May 14, 2009 at 1:31

Jonathan Parker's user avatar

Jonathan ParkerJonathan Parker

6,6673 gold badges42 silver badges54 bronze badges

1

В этой статье мы рассмотрим особенности использования командлета Invoke-Command для удаленного выполнения команд и скриптов. Возможно запускать команды удаленно на одном компьютере, или параллельно на множестве компьютерах в вашей сети. Командлет Invoke-Command использует возможности удаленного управления, заложенные в PowerShell Remoting. PowerShell Remoting позволяет удаленно подключаться к PowerShell сессиям на компьютерах через службу WinRM (Windows Remote Management) через протокол Web Services for Management (WS-Management). Этот сервис дает возможность принимать команды Powershell и устанавливать сеансы.

Содержание:

  • Настройка WinRM для PowerShell Remoting
  • Удаленное выполнение PowerShell с помощью Invoke-Command
  • Используем Invoke-Command для параллельного запуска команд на нескольких компьютерах

Настройка WinRM для PowerShell Remoting

Для связи между компьютерами в PowerShell Remoting используется протокол HTTP (порт TCP/5985) или HTTPS (порт TCP/5986). По умолчанию используется протокол HTTP, но даже этот трафик шифруется с помощью ключа AES-256 (впрочем, есть угроза атак man-in-the middle). Возможна аутентификация через Kerberos (в домене) или NTLM.

На удаленных компьютерах, к которым вы планируете подключаться должен быть запущена служба WinRM. Проверить это можно так:

Get-Service -Name "*WinRM*" | fl

Если служба не запущена, запустите ее:

Enable-PSRemoting

WinRM has been updated to receive requests.
WinRM service started.
WinRM is already set up for remote management on this computer.

Enable-PSRemoting включить и настроить winrm в Windows

Данная команда запустит службу WinRM (установит автоматический запуск), выставит настройки winrm по-умолчанию и добавит исключение в Windows Firewall. Команда Enable-PSRemoting –Force включает WinRM без запроса пользователя.

Теперь к компьютеру можно подключиться удаленно через PowerShell Remoting.

Обратите внимание, что PowerShell Remoting по-умолчанию не работает, если тип вашей сети определен как общедоступная (Public). В этом случае команда вернет ошибку:

Set-WSManQuickConfig : ... WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again.

Вам нужно изменить тип сети на частную (private), или использовать команду:

Enable-PSRemoting –SkipNetworkProfileCheck.

Также нужно включить правило Window Defender Firewall, которое разрешает доступ к WinRM в общедоступных сетях. Вы можете включить правило брандмауэра с помощью GPO или PowerShell:

Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any

Чтобы проверить подключение к удаленному компьютер через PowerShell Remoting используется команда:

Test-WsMan compname1

Test-WsMan - проверить работу winrm на удаленном компьютере

Если у вас нет домена, или вы обращаетесь к компьютерам через PowerShell Remoting по IP адресам, в этом случае используется для аутентификации используется протокол NTLM. При использовании NTLM, при выполнении команду Invoke-Command появится ошибка:

[192.168.1.201] Connecting to remote server 192.168.1.201 failed with the following error message : The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: thetransport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. + FullyQualifiedErrorId : CannotUseIPAddress,PSSessionStateBroken

Invoke-Command Default authentication may be used with an IP address under the following conditions: thetransport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided

Для корректной работы NTLM аутентификации, на компьютере, с которого вы будете устанавливать подключения нужно выполнить дополнительные действия: выпустить SSL сертификат и исопльзовать его для шифрования HTTPS трафика winrm, или добавить имя/IP адрес хоста в доверенные:

Set-Item wsman:localhostClientTrustedHosts -value 192.168.1.201

Set-Item wsman:localhostClientTrustedHosts

Либо можно разрешить подключение ко все компьютерам (не рекомендуется, т.к. один из главных недостатков NTLM – он не осуществляет проверку подлинности).

Set-Item wsman:localhostClientTrustedHosts -value *

Аналогичные настройки нужно сделать на удаленных хостах.

Чтобы вывести список доверенных хостов, выполните команду:

Get-Item WSMan:localhostClientTrustedHosts

Чтобы применить изменения, перезапустите службу WinRM:

Restart-Service WinRM

Удаленное выполнение PowerShell с помощью Invoke-Command

Командлет Invoke-Command позволяет выполнить команду на одном или нескольких удаленных компьютерах.

Например, для запуска одиночной команды на удаленном компьютере можно использовать такую команду:

Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}

Invoke-Command -ComputerName -ScriptBlock - запуск команд powershell на удаленном компьютере через winrm

Эта команда выведет в вашу консоль значение версии PowerShell, установленной на удаленном компьютере, имя которого указано в параметре
-ComputerName
. В блоке
-ScriptBlock {[cmdlet]}
указывается команда, которую нужно запусть на удаленном компьютере.

По-умолчанию команда, посланная через Invoke-Command выполняется на удалённом компьютере от текущего пользователя. Если нужно выполнить команду от имени другого пользователя, сначала нужно запросить учетные данные пользователя и сохранить их в переменную:

$cred = Get-Credential
Invoke-Command -ComputerName comp-buh2 -Credential $cred -ScriptBlock {Get-NetAdapter}

Эта PowerShell команда выведет список сетевых интерфейсов на удаленном компьютере:

Можно задать несколько команд в блоке ScriptBlock, их нужно разделить точкой с запятой. Например следующая команда выведет текущий часовой пояс и изменит его на другой:

Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Astrakhan Standard Time”}

Invoke-Command несколько команд в блоке ScriptBlock

Invoke-Command позволяет выполнять не только отдельные команды, но и запускать скрипты PowerShell. Для этого используется аргумент
-FilePath
(вместо –ScriptBlock). При этом вы указываете путь к локальному PS1 файлу скрипта на вашем компьютере (вам не нужно копировать файл скрипт на удаленный компьютер):

Invoke-Command -ComputerName Server01 -FilePath c:PSScriptsGetComputerInfo.ps1

Используем Invoke-Command для параллельного запуска команд на нескольких компьютерах

Командлет Invoke-Command можно использовать для параллельного выполнения команд на нескольких удаленных компьютерах.

В самом просто случае имена компьютеров, на которых нужно выполнить команды указываются через запятую:

Invoke-Command server1, server2, server3 -ScriptBlock {get-date}

Invoke-Command параллельный запуск команд на нескольких компьютрах

Список компьютеров можно поместить в переменную (массив):

$servers = @(″server1″,″server2″,″server3″)
Invoke-Command -ScriptBlock { get-date} -ComputerName $servers

Или получить из текстового файла:

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:psservers.txt)

Также можно получить список компьютеров в ADс помощью командлета Get-ADComputer из модуля AD PowerShell:

Чтобы выполнить команду на всех Windows Server в домене, исопльзуйте такой код:

$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {get-date} -ErrorAction SilentlyContinue

Если компьютер выключен, или недоступен, благодаря параметру SilentlyContinue скрипт не будет остановлен и продолжит выполнение на других компьютерах.

Чтобы понять с какого компьютера получены результаты, нужно использовать специальную переменную окружения PSComputerName.

$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime

Invoke-Command вернуть результы с каждого компьютера через PSComputerName

При запуске команды через Invoke-Command на нескольких компьютерах она выполняется параллельно. В Invoke-Command есть ограничение на максимальное количество компьютеров, которыми можно управлять одновременно (ограничение на количество одновременных PSSession). Оно определяется параметром ThrottleLimit (по умолчанию 32). Если вам нужно выполнить команду одновременно более чем на 32 компьютерах (например, на 128), используйте параметр –ThrottleLimit 128 (но это вызывает повышенную нагрузку на ваш компьютер).

Для запуска команд на удаленных компьютерах через Invoke-Command в фоновом режиме используется специальный атрибут
–AsJob
. В этом случае результат выполнения команды не возвращается в консоль. Чтобы получить результаты нужно использовать командлет
Receive-Job
.

Если вы хотите запускать команды на удаленном компьютере интерактивно, используйте командлет Enter-PSSession.

Понравилась статья? Поделить с друзьями:
  • Как удаленно включить удаленный рабочий стол windows 10
  • Как угадать пароль на компьютере windows 10
  • Как увидеть формат файла windows 11
  • Как увидеть фоновые программы в windows 10
  • Как увидеть файлы windows в ubuntu