Запуск удаленного рабочего стола из командной строки. Удаленный доступ к рабочему столу (Remote Desktop)

В предыдущих серверных версиях Windows для удаленного управления сервером администратор должен был использовать службы терминалов. Минусом подобного решения являлась необходимость развертывания службы терминалов даже в том случае, когда администратору требовалось только одно удаленное подключение с целью выполнения рутинных административных задач. В системах Windows XP и Windows Server 2003 имеется стандартный механизм Remote Desktop for Administration, или просто Remote Desktop, который позволяет подключаться удаленно и выполнять необходимые операции по управлению сервером. Этот механизм в своей основе использует службы терминалов и поддерживает два одновременных удаленных подключения (в Windows XP - одно). Администратор может с любого рабочего места администрировать все серверы, находящиеся под управлением Windows Server 2003, подключаясь к ним удаленно.

Примечание
Механизм Remote Desktop for Administration no своей сути аналогичен режиму Remote Administration, который поддерживали службы терминалов Windows 2000. В Windows Server 2003 задача удаленного администрирования балы отделена от служб терминалов и реализована в рамках отдельного механизма. Отделение механизма удаленного администрирования от служб терминалов позволило свести нагрузку на сервер к минимуму в ситуации, когда необходимо только управление сервером с другого компьютера.

В системах Windows XP и Windows Server 2003 имеется также функция Remote Assistance, позволяющая пользователю инициировать доступ к своему компьютеру и получить помощь в сложных ситуациях (см. след, раздел).

Примечание
По умолчанию функции Remote Desktop и Remote Assistance отключены.

Кроме этого, если на некотором компьютере под управлением Windows XP или Windows Server 2003 установлен веб-сервер в составе служб Internet Information Services (IIS), то через этот компьютер можно осуществлять удаленный доступ к любой системе Windows XP или Windows Server 2003, находящейся в той же локальной сети, из веб-браузера (Internet Explorer 4.0 и выше), работающего в любой операционной системе. Такая возможность позволяет, например, на маломощном компьютере под управлением Windows 95 запустить браузер и, введя имя удаленной системы Windows Server 2003 на базе какого-нибудь мощнейшего процессора, работать на ней в полноэкранном режиме.
Все сессии удаленного доступа шифруются, чтобы исключить несанкционированный доступ к данным и системам: протокол RDP, использующийся при этом, шифруется с помощью алгоритма RC4.

Разрешение удаленного доступа

Для управления режимом удаленного доступа (не путайте его с удаленным доступом через коммутируемое подключение!) используется вкладка Remote (Удаленное использование) окна свойств системы System Properties (рис. 10.9). (Для быстрого доступа к этому окну можно использовать клавиши +.)
Чтобы пользователи могли с других компьютеров обратиться к вашей системе, установите флажок Allow users to connect remotely to this computer. Нажав кнопку Select Remote Users, вы можете явно указать, каким пользователям разрешен удаленный доступ (рис. 10.10): эти пользователи будут включены в локальную группу Remote Desktop Users. По умолчанию только администраторы имеют удаленный доступ к компьютеру.
Использовать учетные записи без пароля для удаленного доступа нельзя. Если на компьютере имеются такие записи, то при установке флажка Allow users to connect remotely to this computer появится предупреждение, показанное на рис. 10.11.

Рис. 10.9. Окно управления функциями Remote Desktop и Remote Assistance

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


Рис. 10.11. Напоминание о том, что учетные записи без пароля нельзя использовать для удаленного доступа к компьютеру

Для инициализации сеанса удаленного доступа служит утилита Remote Desktop Connection (она запускается из подменю Start | All Programs | Accessories | Communications или же при помощи команды mstsc из командной строки). Введите имя или IP-адрес удаленного компьютера и нажмите кнопку Connect (рис. 10.12) - и через несколько мгновений вы увидите окно, приглашающее зарегистрироваться в удаленной системе!

Внимание

Рис. 10.11. Напоминание о том, что учетные записи без пароля нельзя использовать для удаленного доступа к компьютеру

Запуск и конфигурирование сеанса удаленного доступа

Для инициализации сеанса удаленного доступа служит утилита Remote Desktop Connection (она запускается из подменю Start | All Programs | Accessories | Communications или же при помощи команды mstsc из командной строки). Введите имя или IP-адрес удаленного компьютера и нажмите кнопку Connect (рис. 10.12) - и через несколько мгновений вы увидите окно, приглашающее зарегистрироваться в удаленной системе!



Рис. 10.12. Из этого окна можно инициировать сеанс работы с удаленным компьютером

Внимание

В системах Windows XP при входе в систему с помощью Remote Desktop текущий пользователь «выталкивается» из системы, при этом текущий сеанс не закрывается. Если удаленный пользователь входит с именем уже зарегистрированного пользователя, то он получает рабочую среду- открытые окна, запущенные программы - этого пользователя, который в свою очередь может снова войти в систему и вытолкнуть «пришельца». Только при использовании Remote Assistance возможна одновременная работа двух пользователей в одном сеансе. В Windows Server 2003 такого не происходит, поскольку в них для удаленного администрирования разрешены две сессии. Однако, если использовать команду mstsc /console, можно получить такой же режим работы, как и в Windows XP - т. е. с «выталкиванием».
В окне Remote Desktop Connection нажмите кнопку Options и внимательно просмотрите все вкладки, на которых определяются параметры удаленного подключения. Можно, например, устанавливать размер экрана, глубину цвета (до 24 бит), скорость подключения и пр. Обратите внимание на вкладку Local Resources (рис. 10.13).

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

По умолчанию звук с удаленного компьютера переназначается на локальный компьютер, и, работая на удаленном компьютере, можно выполнять печать на локальном принтере. Если установить флажок Disk drives, то можно одновременно пользоваться дисками обеих систем. Это очень удобно, например, для копирования файлов: «легким движением руки» в окне программы Windows Explorer (где будут отображаться диски обоих компьютеров) вы можете переписать любую информацию с удаленного компьютера на свой локальный диск.
Вкладка Experience (рис. 10.14) позволяет адаптировать сессию удаленного доступа к параметрам соединения: можно отключать некоторые возможности графики для низкоскоростных каналов и включать все возможности при соединении по локальной сети.

Рис. 10.14. Настройка параметров удаленного доступа в зависимости от скорости коммуникационного канала

Для переключения окна сессии из полноэкранного режима в экран фиксированного размера и наоборот используются клавиши ++

В системах Windows Server 2003 для работы со службами терминалов используется оснастка Remote Desktops. Она может использоваться и для удаленного доступа к компьютерам. На рис. 10.15 для примера показано одновременное подключение к двум удаленным компьютерам (Remote Server и Domain Controller). Каждый сеанс предварительно создается и конфигурируется (см. корень оснастки и дерево сеансов удаленного доступа), после чего его можно легко инициировать, указав курсором в списке. Так же легко можно и переключаться между различными сеансами.


Рис. 10.15. Окно оснастки Remote Desktops с двумя одновременными сеансами удаленного доступа

Выход из сеанса

При работе в сеансе удаленного доступа к компьютеру администратор имеет три возможности завершения сеанса (в любом случае он должен открыть меню Start (Пуск) и нажать кнопку Shut Down (Конец работы)):

  • можно выключить компьютер, выбрав в окне Shut Down Windows опцию Shut down;
  • можно выйти из системы, выбрав опцию Log off;
  • можно прервать текущий сеанс, выбрав опцию Disconnect - при этом при повторном подключении к этому компьютеру с ранее использованным именем администратор получит ту же рабочую среду (открытые окна и запущенные программы), которую он «оставил» при отключении от сеанса.

Удаленный доступ через Интернет

Чтобы обратиться к компьютеру через Интернет, в поле адреса браузера введите http://<имя_cepвepa>/TSWeb , где имя_сервера - DNS-имя веб- сервера (компьютера с установленными службами IIS) или его IP-адрес.


Рис. 10.16. Окно интернет-подключения к удаленному компьютеру

После соединения с сервером появится веб-страница «Remote Desktop Web Connection» (Интернет-подключение к удаленному рабочему столу) (рис. 10.16), где в поле Server (Сервер) вы должны указать имя или адрес того компьютера, к которому хотите подключиться, после чего нажмите кнопку Connect (Подключить). Обратите внимание на то, что имена веб-сервера и целевого компьютера могут различаться: т. е. вы «входите» в сеть через один компьютер, а подключаетесь к любому другому.

Внимание
Чтобы описанный режим работал, в составе службы WWW (World Wide Web Service) на сервере должен быть установлен компонент Remote Desktop Web Connection (Интернет-подключение к удаленному рабочему столу).

При первом выполнении описанной процедуры с сервера загрузится компонент ActiveX, который нужно установить на локальном компьютере. Его окно показано на рис. 10.17. Нажмите кнопку Yes (Да).


Рис. 10.17. Предупреждение об установке ActiveX-компонента на локальном компьютере

После этого выполняется подключение к выбранному (целевому) компьютеру и появляется традиционное окно регистрации. На рис. 10.18 для примера показано окно браузера Internet Explorer, в котором отображается сессия работы на удаленном компьютере. Обратите внимание, что в окне адреса указан IP-адрес одного компьютера (через который мы вошли в сеть), а подключение выполнено к другому компьютеру - его адрес указан в нижней части экрана. Напомним, что такую картинку можно получить в любой операционной системе, где установлен Internet Explorer версии 4.0 и выше. В полноэкранном режиме работы панели браузера не отображаются совсем, и мы увидим только рабочий стол удаленного компьютера.

Рис. 10.17. Предупреждение об установке ActiveX-компонента на локальном компьютере

После этого выполняется подключение к выбранному (целевому) компьютеру и появляется традиционное окно регистрации. На рис. 10.18 для примера показано окно браузера Internet Explorer, в котором отображается сессия работы на удаленном компьютере. Обратите внимание, что в окне адреса указан IP-адрес одного компьютера (через который мы вошли в сеть), а подключение выполнено к другому компьютеру - его адрес указан в нижней части экрана. Напомним, что такую картинку можно получить в любой операционной системе, где установлен Internet Explorer версии 4.0 и выше. В полноэкранном режиме работы панели браузера не отображаются совсем, и мы увидим только рабочий стол удаленного компьютера.



Возникла задача выполнить кое-какую операцию с помощью командной строки на другом компьютере, само собой идти к пользователю запускать командную строку и вбивать команды- не наш метод, нам надо не вставая с кресла запустить командную строку удаленного компьютера и выполнить необходимые действия в командной строке. Конечно, подобное действие можно выполнить с помощью программ удаленного подключения, но это не всегда удобно и требует наличия подобной программы у вас и у пользователя (клиент- сервер). Процедуру по подключению к командной строки другого компьютера, можно выполнить значительно просто, с помощью команды PSEXEC .

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

Эта утилита ставиться на только на компьютер администратора. Для установки необходимо ее скачать, вот ссылка на официальный сайт Microsoft . После скачивания архива его необходимо разархивировать, в разархивированной папке найти файл PsExec.exe. Нажмите на нем два раза, появиться окно с лицензионным соглашением, нажимаем "Agree ".

Разберем синтаксис команды:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры работы команды PSEXEC:

1) Для того чтобы запустить командную строку другого компьютера, необходимо ввести
psexec \\<имя компьюетра> cmd

например:
psexec \\WIN782 cmd



после этого можете вводить необходимые вам команды.

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

psexec \\<имя компьютера> -c test.exe

например:
psexec \\ WIN782 -c test.exe

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

psexec \\WIN782 c:\temp\test.exe

Вам наверняка захочется воспользоваться функцией поддержки нескольких мониторов, встроенной в средство « » Windows Vista (Remote Desktop). Эта функция позволяет растянуть рабочий стол удаленного компьютера на все мониторы, подключенные к локальной системе.

Однако найти ее не так-то легко - доступ к ней осуществляется не из графического пользовательского интерфейса средства, а из командной строки.

Ограничения

Поддержка нескольких мониторов при подключении к удаленному рабочему столу - функция очень удобная, но у нее есть два ограничения:

1. Все подключенные к системе мониторы должны иметь одинаковое разрешение.

2. Разрешение экрана всех мониторов, в том числе на удаленной системе, не должно превышать 4096 x 2048 пикселей.

Командная строка

Чтобы запустить средство «Подключение к удаленному рабочему столу» с функцией поддержки нескольких мониторов, нужно вызвать командную строку и ввести следующую команду:


После этого откроется стандартное диалоговое окно «Подключение к удаленному рабочему столу» (Remote Desktop Connection), где необходимо настроить параметры соединения (см. рис. A).

Рисунок A. При запуске подключения к удаленному рабочему столу из командной строки настройки подключения придется заполнять вручную.

Как только соединение будет установлено, рабочий стол удаленной системы появится на всех подключенных к локальной системе мониторах. Если вам нужен и локальный, и удаленный рабочий стол, размер последнего можно ограничить одним монитором - для этого нужно нажать кнопку «Свернуть в окно» (Restore Down) в окне удаленного рабочего стола. Для этого можно воспользоваться и клавишной комбинацией .

После того, как окно удаленного рабочего стола появится на мониторе, его можно растянуть мышью на весь экран. Имейте в виду: при уменьшении размера окна растянутого удаленного стола для того, чтобы увидеть весь экран, придется воспользоваться полосами горизонтальной и вертикальной прокрутки, как показано на рис. B. Но его всегда можно восстановить, нажав кнопку «Развернуть» (Maximize).



Рисунок B. При уменьшении размера окна растянутого удаленного стола для того, чтобы увидеть весь экран, придется воспользоваться полосами горизонтальной и вертикальной прокрутки.

Создание ярлыка

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

Нажмите правой кнопкой мыши в любом месте рабочего стола и выберите пункт контекстного меню «Создать | Ярлык» (New | Shortcut). В диалоговом окне мастера «Создать ярлык» (Create Shortcut) введите команду mstsc /span и путь к файлу RDP, как показано на рис. C. Если в адресе файла есть пробелы, не забудьте заключить его в двойные кавычки. Теперь нажмите «Далее» (Next), присвойте ярлыку подходящее имя, например, «Saturn - Подкл. с неск. мониторами» и нажмите «Готово» (Finish).



Рисунок C. Для подключения с использованием файла RDP и параметров командной строки можно создать стандартный ярлык Windows.

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

А что думаете вы?

Сколько мониторов подключено к вашему компьютеру? Часто ли вы пользуетесь подключением к удаленному рабочему столу? Будете ли вы пользоваться функцией поддержки нескольких мониторов средства «Подключение к удаленному рабочему столу» Vista? Поделитесь с нами своим мнением в комментариях!

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

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

PsExec.exe

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

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

psexec \\main ipconfig /flushdns

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


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

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

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

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

psexec -i \\main winver.exe

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

psexec @c:\comps.txt systeminfo.exe

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


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

Всё гениальное просто. В ресурсах исполняемого файла PsExec.exe находится другой исполняемый файл – PSEXESVC, который является службой Windows. Перед выполнением команды, PsExec распаковывает этот ресурс на скрытую административную общую папку удалённого компьютера, в файл: \\ИмяКомпьютера\Admin$\system32\psexesvc.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 это делается следующим образом:

$Computer = "main"
$Command = "cmd.exe /c systeminfo.exe >
("\\$Computer\root\cimv2:Win32_Process").create($Command)

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

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

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

Computer = "PC3"
Command = "cmd.exe /c systeminfo.exe > \\server\share\%computername%.txt"
Set objWMIService = GetObject("winmgmts:\\" & Computer & "\root\cimv2:Win32_Process")
Result = objWMIService.Create("calc.exe", Null, Null, intProcessID)

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

wmic /node:main process call create calc.exe

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

WSH Remote Scripting

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

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

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

    Разрешить WSH Remote Scripting создав в системном реестре строковой параметр Remote равный "1" в ключе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings

    Из за ошибки описанной в статье базы знаний Microsoft с номером 311269, на системах с Windows XP может понадобиться выполнить команду wscript –regserver

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

    В системах 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

      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)

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
WScript.Quit –1
End Sub

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

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

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

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

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

schtasks /create /s server6.td.local /tn install /tr \\main\data\install.cmd /sc once /st 13:00 /ru system

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

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

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

msiexec /qn /package \\server\share\subinacl.msi
if exist "c:\program files\Windows Resource Kits\Tools\subinacl.exe" (
subinacl /tn Install_Subinacl /f

WinRM (WS-Management)

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

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

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

winrm quickconfig

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

winrm help config

Если на управляемом компьютере работает веб-сервер, 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, а после него следует команда которую нужно выполнить. Вот несколько примеров:

winrs -r:Core ver.exe

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

winrs -r:Core "dir c:\temp > c:\temp\list.txt"

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

winrs -r:main cmd.exe

Эта функция аналогична 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.

Обновление: К моменту публикации статьи на сайт, финальные версии 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):

Invoke-Command -ComputerName Main -ScriptBlock {netsh interface dump > c:\ipconfig.txt}

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

$Command = {(get-item c:\Windows\explorer.exe).VersionInfo.FileVersion}
Invoke-Command -ComputerName Main, Server7, Replica -ScriptBlock $Command


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

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

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


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

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

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

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

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

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

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

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

set trigger=c:\commandShare\trigger.txt
set action=c:\scripts\action.cmd
set log=c:\scripts\log.txt
:start
if exist %trigger% start %action% & echo %time% %date%>>%log% & del %trigger%
sleep.exe 5
goto start

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

for /f "skip=4 tokens=1" %%a in (‘net files’) do net files %%a /close
exit

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

schtasks /create /ru domain\administrator /rp /sc onstart /tn ProxyScript /tr c:\scripts\server.cmd

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

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

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

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

echo test > \\server\commandShare\trigger.txt

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

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