Выполнение удаленных команд
Одна команда Windows PowerShell позволяет запускать команды на одном или сотнях компьютеров. Windows PowerShell поддерживает удаленные вычисления с использованием различных технологий, включая WMI, RPC и WS-Management.
PowerShell поддерживает удаленное взаимодействие WMI, WS-Management и SSH. В PowerShell 7 и более поздних версиях RPC поддерживается только в Windows.
Дополнительные сведения о удаленном взаимодействии в PowerShell см. в следующих статьях:
- Удаленное взаимодействие через SSH в PowerShell
- Удаленное взаимодействие через WSMan в PowerShell
Удаленное взаимодействие с Windows PowerShell без настройки
Многие командлеты Windows PowerShell имеют параметр ComputerName, который позволяет собирать данные и изменять параметры одного или нескольких удаленных компьютеров. Эти командлеты используют разные протоколы связи и работают во всех операционных системах Windows без специальной настройки.
В эти командлеты входят следующие:
Обычно командлеты, которые поддерживают удаленное взаимодействие без специальной настройки, имеют параметр ComputerName, но не имеют параметра Session. Чтобы найти эти командлеты в сеансе, введите:
Get-Command | Where-Object
Удаленное взаимодействие Windows PowerShell
Благодаря использованию протокола WS-Management служба удаленного взаимодействия Windows PowerShell позволяет запустить любую команду Windows PowerShell на одном или нескольких удаленных компьютерах. Вы можете устанавливать постоянные подключения, запускать интерактивные сеансы и выполнять скрипты на удаленных компьютерах.
Чтобы использовать службу удаленного взаимодействия Windows PowerShell, удаленный компьютер должен быть настроен для удаленного управления. Дополнительные сведения, в том числе инструкции, см. в разделе about_Remote_Requirements.
После настройки службы удаленного взаимодействия Windows PowerShell вы получите доступ ко многим стратегиям удаленного взаимодействия. В этой статье перечислены только некоторые из них. См. дополнительные сведения об удаленном взаимодействии.
Запуск интерактивного сеанса
Чтобы запустить интерактивный сеанс с одним удаленным компьютером, используйте командлет Enter-PSSession. Например, чтобы запустить интерактивный сеанс с удаленным компьютером Server01, введите:
Enter-PSSession Server01
В командной строке отобразится имя удаленного компьютера. Все команды, введенные в командной строке, запускаются на удаленном компьютере, а результаты отображаются на локальном компьютере.
Чтобы завершить интерактивный сеанс, введите:
Exit-PSSession
Дополнительные сведения о командлетах и Exit-PSSession см. в Enter-PSSession следующих разделах:
Выполнение удаленной команды
Чтобы выполнить команду на одном или нескольких компьютерах, используйте командлет Invoke-Command. Например, чтобы выполнить команду Get-UICulture на удаленных компьютерах Server01 и Server02, введите:
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock
Выходные данные будут возвращены на ваш компьютер.
LCID Name DisplayName PSComputerName ---- ---- ----------- -------------- 1033 en-US English (United States) server01.corp.fabrikam.com 1033 en-US English (United States) server02.corp.fabrikam.com
Запуск сценария
Чтобы запустить скрипт на одном или нескольких удаленных компьютерах, используйте параметр FilePath командлета Invoke-Command . Сценарий должен быть включен или доступен для локального компьютера. Результаты будут возвращены на локальный компьютер.
Например, следующая команда выполняет DiskCollect.ps1 скрипт на удаленных компьютерах Server01 и Server02.
Invoke-Command -ComputerName Server01, Server02 -FilePath c:\Scripts\DiskCollect.ps1
Установка постоянного подключения
Используйте командлет New-PSSession для создания постоянного сеанса на удаленном компьютере. В следующем примере создаются удаленные сеансы на удаленных компьютерах Server01 и Server02. Объекты сеанса хранятся в переменной $s .
$s = New-PSSession -ComputerName Server01, Server02
После установки сеансов в них можно выполнить любую команду. Так как сеансы являются постоянными, вы можете собирать данные из одной команды и использовать их в другой.
Например, следующая команда выполняет Get-HotFix команду в сеансах в переменной $s и сохраняет результаты в переменной $h . Переменная $h создается в каждом сеансе из $s , но она не существует в локальном сеансе.
Invoke-Command -Session $s
Теперь вы можете использовать данные в переменной $h с другими командами в том же сеансе. Результаты отобразятся на локальном компьютере. Пример:
Invoke-Command -Session $s >
Расширенная служба удаленного взаимодействия
PowerShell включает командлеты, которые позволяют:
- Настройка и создание удаленных сеансов на локальном и удаленном концах
- Создание настраиваемых и ограниченных сеансов
- Импорт команд из удаленного сеанса, которые фактически выполняются неявно в удаленном сеансе
- Настройка безопасности удаленного сеанса
PowerShell в Windows включает поставщик WSMan. Поставщик создает диск WSMAN: , который позволяет перемещаться по иерархии параметров конфигурации на локальном и удаленном компьютерах.
См. дополнительные сведения о поставщике WSMan и командлетах WS-Management или введите команду Get-Help wsman в консоли Windows PowerShell.
Дополнительные сведения можно найти в разделе
- Вопросы и ответы об удаленном взаимодействии PowerShell
- Register-PSSessionConfiguration
- Import-PSSession
Справку по ошибкам службы удаленного взаимодействия см. в разделе about_Remote_Troubleshooting.
См. также:
- about_Remote
- about_Remote_Requirements
- about_Remote_Troubleshooting
- about_PSSessions
- about_WS-Management_Cmdlets
- Invoke-Command
- Import-PSSession
- New-PSSession
- Register-PSSessionConfiguration
- Поставщик WSMan
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Выполнение команд на удалённом Windows
Для запуска команд на удалённом компьютере Windows можно использовать утилиту psexec.exe от Microsoft. Команды можно объединить в bat файл как обычно. Пример удаления установленной на удалённом компьютере программы utorrent:
@echo off taskkill /F /IM utorrent.exe "C:\Users\sklad5\AppData\Roaming\uTorrent\uTorrent.exe" /UNINSTALL /s RD /S /Q "C:\Users\sklad5\AppData\Roaming\uTorrent\"
- Завершаем запущенный процесс utorrent.exe
- Удаляем utorrent, ключ /s означает что удаление будет проходить без каких либо вопросов, т.е. пользователь не будет видеть и знать что сейчас удаляется программа.
- Удаляем каталог программы.
Утилита wmic.exe
Утилита wmic.exe позволяет управлять структурой WMI (Windows Management Instrumentation) не только на локальном компьютере, но и удалённо.
Введя в командной строке команду wmic , получим следующее приглашение:
wmic:root\cli>
Список установленных с помощью msi установщика программ:
/node:\\192.168.1.3 product get name
Удаление программы 7-Zip:
wmic:root\cli>/node: \\192.168.1.3 product where name="7-Zip 9.20" call uninstall
См. также
- Удаленное удаление программ с компьютера — более пространный источник для этой статьи.
7 способов выполнить команду на удаленном компьютере
Одна из самых популярных задач у системных администраторов – это запуск какой-либо команды на удалённом компьютере, Это может быть необходимо для установки программы или утилиты, изменения каких-либо настроек и т. д. Речь редко заходит лишь об одном компьютере, чаще команду нужно выполнить на множестве рабочих станций или серверов.
Так как задача эта популярная, то и способов её решения существует множество. Начиная от групповых политик (в которых можно применять для этой цели сценарии входа в систему или автозагрузки), и заканчивая мощными системами управления, вроде System Center Essentials или System Center Configuration Manager. Но я в этой статье хочу рассмотреть методы, которые доступны сразу из командной строки или файлов сценариев, а так же не требуют предварительной установки агентов и прочей суматохи. Впрочем, какие-то предварительные требования конечно есть. Например, у вас должны быть административные полномочия на том компьютере, на котором вы хотите выполнить команду (за исключением сценария с «проксированием», но об этом позже).
Один из моих любимых способов для решения этой задачи это утилита командной строки 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 > \\server\share\%computername%.txt”
([wmiclass]”\\$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 следует установить разрешения следующим образом: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 указывается путь к файлу сценария, который будет выполнен на удаленном компьютере и собственно имя этого компьютера.
Планировщик заданий (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 — это реализация открытого стандарта DMTF (Distributed Management Task Force) от Microsoft, которая позволяет управлять системами с помощью веб-служб. Углубляться в устройство технологии я не буду, а лишь кратко опишу, что необходимо для её использования.
Версия WinRM 1 и выше входит в состав операционных систем, начиная с Windows Vista и Windows Server 2008. Для Windows XP и Windows Server 2003 можно установить WinRM в виде отдельного пакета (см. ссылки).
Для того чтобы быстро настроить компьютер для подключений к нему используя стандартные порты и разрешив подключения административным учетным записям, достаточно выполнить команду:
Чтобы winrm не спрашивал подтверждения, можно добавить к вызову ключ -quiet. Узнать информацию о более тонкой настройке можно посмотреть встроенную справку winrm:
winrm help config
Если на управляемом компьютере работает веб-сервер, WinRM никак ему не помешает, хоть и использует по умолчанию стандартные порты HTTP. Он будет перехватывать лишь подключения предназначенные специально для него.
Разумеется необязательно выполнять эту команду вручную, на каждом компьютере которым вы хотите управлять. Все необходимые настройки легко сделать с помощью групповых политик. Для этого нужно:
Настроить службу WinRM (Windows Remote Management) на автоматический запуск Настроить элемент групповой политики Computer Configuration \ Administrative Templates \ Windows Components \ Windows Remote Management (WinRM) \ WinRM Service \ Allow automatic configuration of listeners. Тут нужно указать диапазоны IP-адресов с которых разрешаются подключения. Разумеется, еще вам будет необходимо разрешить подключения на соответствующие порты (по умолчанию 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.
Обновление: К моменту публикации статьи на 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):
Invoke-Command -ComputerName Main -ScriptBlock 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 (см. ссылки) и просто скопировать на любой компьютер.
Решили выучить иностранный язык? Домашний репетитор по английскому языку поможет вам в этом. Там же вы сможете попрактиковаться с другими пользователями.
- Метки: http, ip, url, выполнить, команду, компьютере, протокол, способов, удаленном
- Познавательные статьи
Уточнения, корректировки и обсуждения статьи «7 способов выполнить команду на удаленном компьютере» — под данным текстом, в комментариях.
Ответственность, за все изменения, внесённые в систему по советам данной статьи, Вы берёте на себя.
Копирование статьи «7 способов выполнить команду на удаленном компьютере», без указания ссылки на сайт первоисточника Компьютерные сети и многоуровневая архитектура интернета (conlex.kz), строго запрещено.
2 Комментариев для “ 7 способов выполнить команду на удаленном компьютере ”
Единственная проблема с PsExec – все параметры нужно выстраивать в логическую цепочку их выполнения. Например я хочу скопировать файл на удаленную машину и там его запустить: psexec \\RemoteMachine -u user -p pass -c -f “C:\folder\program.exe” – так сработает, но если я поставлю параметр -f в конец команды и запущу ее еще раз – получу ошибку вроде “file exists”, если же попробую перенести имя пользователя и пароль – не смогу зайти на удаленный компьютер, и т. п.
Ammyy Admin :
Разумеется команду можно заранее поместить в переменную, а для параметра -ComputerName указать имена не одного, а сразу нескольких компьютеров. Следующая последовательность позволяет вывести версию файла Explorer.exe сразу с трех компьютеров.
Добавить комментарий Отменить ответ
Поиск
Рубрики
- Windows
- Автомобили
- Бытовая техника
- Железо
- Канальный уровень и локальные сети
- Введение и терминология
- Обнаружение и исправление ошибок
- Протоколы коллективного доступа
- Протоколы произвольного доступа
- Протоколы разделения канала
- Базы данных
- Доступ к сети и ее физическая среда
- Доступ к сети
- Физическая среда передачи
- Виды задержек
- Задержка ожидания и потеря пакетов
- Задержки и маршруты в Интернете
- Возникновение компьютерных сетей и Интернета: 1972-1980
- Новейшие разработки
- Развитие коммутации пакетов: 1961-1972
- Распространение Интернета: 1990-е
- Распространение компьютерных сетей: 1980-1990
- Службы с установлением и без установления соединения
- Многоуровневая структура
- Сетевые устройства и уровни коммуникационной модели
- Стек протоколов Интернета
- Что такое протокол?
- Коммутация каналов и коммутация пакетов
- Передача сообщений
- Электромобили
- Гаджеты
- Железо
- Программное обеспечение
- Социальные сети
- Web и HTTP
- Взаимодействие пользователя с сервером
- Метод GET с условием
- Обзор HTTP
- Область применения HTTP
- Постоянные и непостоянные соединения
- Формат HTTP-сообщения
- Интернет-приложения, рассматриваемые на этом сайте
- Протоколы прикладного уровня
- Службы протоколов транспортного уровня
- Службы, необходимые приложению
- Одноранговое разделение файлов
- DNS-записи
- DNS-сообщения
- Общие принципы функционирования DNS
- Протоколы доступа к электронной почте
- Форматы сообщений электронной почты и MIME
- Групповая маршрутизация
- Групповая маршрутизация в Интернете
- Общий случай групповой маршрутизации
- Адресация в протоколе IPv4
- Протоколы внутренней маршрутизации
- Мобильный протокол IP
- Управление мобильной связью
- Алгоритм маршрутизации, основанный на состоянии линий
- Контроль перегрузок в TCP
- Выравнивание скоростей передачи
- Модель задержек протокола TCP
- Причины и следствия перегрузки
- Создание протокола надежной передачи данных
- Время оборота и интервал ожидания
- Надежная передача данных
- Структура ТСР-сегмента
Выполнить команду на удалённом компьютере
Как выполнить команду на удалённом компьютере? Самый распространенный вопрос у системных администраторов. К этому можно отнести запуск какой либо команды на удалённом компьютере, не вставая со своего места. Можно конечно использовать DameWare Mini Remote Control но это не то. И это и то может быть необходимо для установки программы или утилиты, изменения каких либо настроек, или для чего угодно ещё. И конечно, редко речь идёт лишь об одном компьютере, чаще команду нужно выполнить на множестве рабочих станций или серверов.
Так как задача эта популярная, то и способов её решения существует множество. Начиная от групповых политик (в которых можно применять для этой цели сценарии входа в систему или автозагрузки), и заканчивая мощными системами управления, вроде System Center Essentials или System Center Configuration Manager. Но я в этой статье хочу рассмотреть методы, которые доступны сразу из командной строки или файлов сценариев, а так же не требуют предварительной установки агентов и прочей суматохи. Впрочем, какие-то предварительные требования конечно есть. Например, у вас должны быть административные полномочия на том компьютере, на котором вы хотите выполнить команду (за исключением сценария с «проксированием», но об этом позже).
Выполнить команду на удалённом компьютере через PsExec.exe
Один из моих любимых способов для решения этой задачи это утилита командной строки PsExec.exe написанная Марком Руссиновичем, которую вы можете свободно скачать с сайта Windows SysInternals. Ссылку на неё вы можете найти в конце статьи. Она не требует установки в систему, вы можете просто скопировать её в одну из папок, содержащихся в переменной окружения %path% и вызывать из любой оболочки командной строки: Cmd или PowerShell.
Использовать PsExec очень просто. Например, чтобы выполнить ipconfig /flushdns на компьютере main, достаточно запустить следующую команду:
Команда ipconfig будет запущена на компьютере main под вашими учетными данными. После завершения работы ipconfig весь текстовый вывод будет передан на ваш компьютер, а кроме того будет возвращён код выхода команды (error code). В случае если команда выполнилась успешно, он будет равен 0.

Разумеется, на этом возможности PsExec не заканчиваются. Вызвав утилиту без параметров, можно посмотреть другие доступные опции. Я обращу внимание лишь на некоторые из них.
Ключ -d говорит PsExec что ненужно дожидаться выполнения команды, а достаточно лишь запустить её, и забыть. В этом случае мы не получим выходных данных от консольной утилиты, но зато сможем не дожидаясь завершения предыдущей команды запускать другие. Это очень полезно, если вам необходимо запустить, например установщик программы на нескольких компьютерах.
По умолчанию PsExec выполняет команды в скрытом режиме, то есть на системе где выполняется команда, не будут выводиться никакие окна или диалоги. Однако есть возможность изменить это поведение, с помощью ключа -i . После него можно указать номер сессии, в которой выводить окна, а можно и не указывать, тогда интерфейс будет отображен в консольной сессии.
Таким образом, чтобы вывести окно с информацией о версии операционной системы на компьютере main, следует запустить PsExec таким образом:
Если вы хотите выполнить команду сразу на нескольких компьютерах, вам пригодится возможность прочитать их имена из текстового файла списка.
Ну и одной из самых полезных способностей 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 предоставляет огромные возможности для управления системами, но нас сейчас интересует лишь одна из них.
Возможно вам будет интересно: Как запустить и остановить службы через cmd (командной строки)
Для запуска процессов нам потребуется метод Create класса Win32_Process. Использовать его достаточно несложно. В PowerShell это делается следующим образом:
$Computer = «main»
$Command = «cmd.exe /c systeminfo.exe > \\server\share\%computername%.txt»
([wmiclass]»\\$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 следует установить разрешения следующим образом:
DCOM: Machine Access Restrictions in Security Descriptor Definition Language (SDDL) syntax
Выдать группам Anonymous Logon и Everyone разрешения Allow Local и Allow Remote AccessDCOM: 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 не спрашивал подтверждения, можно добавить к вызову ключ -quiet. Узнать информацию о более тонкой настройке можно посмотреть встроенную справку winrm:
Если на управляемом компьютере работает веб-сервер, WinRM никак ему не помешает, хоть и использует по умолчанию стандартные порты HTTP. Он будет перехватывать лишь подключения предназначенные специально для него.
Разумеется необязательно выполнять эту команду вручную, на каждом компьютере которым вы хотите управлять. Все необходимые настройки легко сделать с помощью групповых политик. Для этого нужно:
- Настроить службу WinRM (Windows Remote Management)на автоматический запуск
- Настроить элемент групповой политики Computer Configuration \ Administrative Templates \ Windows Components \ Windows Remote Management (WinRM) \ WinRM Service \ Allow automatic configuration of listeners. Тут нужно указать диапазоны IP-адресов с которых разрешаются подключения.
- Разумеется, еще вам будет необходимо разрешить подключения на соответствующие порты (по умолчанию 80) в брандмауэре Windows.
Независимо от того используется ли порт HTTP (80) или HTTPS (443) трафик передаваемый WinRM шифруется (если конечно вы не отключите эту опцию). Для аутентификации по умолчанию используется протокол Kerberos.
Но хватит о настройках, лучше перейдем непосредственно к использованию. Хоть утилита winrm позволяет настраивать службу WinRM, а так же выполнять например WMI запросы, нам более интересна другая – winrs. Буквы RS тут означают Remote Shell. WinRS работает очень похоже на PsExec хотя и использует технологию WinRM. Имя компьютера задаётся ключом -r, а после него следует команда которую нужно выполнить. Вот несколько примеров:
Так как winrs и так использует cmd.exe в качестве удалённой оболчки, в командах можно легко обращаться к удалённым переменным окружения, или использовать другие встроенные команды cmd.exe:
Как и PsExec, утилита winrs позволяет открыть интерактивный сеанс на удалённом компьютере:
Эта функция аналогична 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):
Invoke-Command -ComputerName Main -ScriptBlock c:\ipconfig.txt>
Разумеется команду можно заранее поместить в переменную, а для параметра -ComputerName указать имена не одного, а сразу нескольких компьютеров. Следующая последовательность позволяет вывести версию файла Explorer.exe сразу с трех компьютеров.
Возможно вам будет интересно: Восстановить несохраненные файлы EXCEL 2010

Как видно на, можно передавать сразу несколько команд в одном блоке, помещать их результаты выполнения на нескольких компьютерах в переменную, а затем обрабатывать на рабочей станции используя возможности 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
exitServer.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 (см. ссылки) и просто скопировать на любой компьютер.