Тарифы Услуги Сим-карты

Командная строка удаленного компьютера. Удаленное удаление программ при помощи WMI

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

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

Установка

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

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

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

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

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

компьютер

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

@файл

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

программа

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

аргументы

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

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

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

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

Примеры

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

psexec \\marklap cmd

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

psexec \\marklap ipconfig /all

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

psexec \\marklap -c test.exe

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

psexec \\marklap c:\bin\test.exe

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

psexec -i -d -s c:\windows\regedit.exe

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

psexec -l -d "c:\program files\internet explorer\iexplore.exe"

Этот урок покажет, как удалить файл через командную строку в Windows (7, 8, XP, Vista). В этом помогут команды DEL или ERASE, которые используются тогда, когда Вы не можете обычным способом удалить файл. Для , DEL и ERASE не подойдут.

Естественно, для начала . С этим действием Вы получите наилучшие результаты.

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

В cmd введите DEL /? и нажмите Enter, чтобы предварительно ознакомиться с параметрами команд. Если сделали правильно, Вы увидите разъяснения (скриншот ниже).

Использование cmd при загрузке Windows

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

  1. Откройте командную строку при загрузке Windows
  2. В cmd введите DiskPart и нажмите Enter
  3. Далее потребуется написать list volume и еще раз нажать энтер (см. скриншот ниже). Это позволит увидеть букву диска, в котором нужно удалить файл.
  4. После получения сведений, напечатайте exit и кликните Enter.

Теперь смело вводите варианты команд удаления, которые расписаны ниже.

Такими действиями Вы удалите любой файл на компьютере посредством командной строки.

Удаление конкретного файла

Для удаления конкретного элемента Вам надо знать его имя и расширение. В противном случае возрастает вероятность удалить не то, что надо!

В cmd введите следующую команду и нажмите энтер:

DEL /F /S /Q /A "Полный путь элемента с расширением"

Например, если я хочу, удалить с именем «delete» и с расширением (.bat), расположенный на диске C в папке «мусор», нужно ввести команду:

DEL /F /S /Q /A "C:\мусор\delete.bat"

Удаление всех файлов с подтверждением и без из командной строки

В таком случае Вы должны подтвердить или опровергнуть действия буквами (Y - да / N - нет), чтобы удалить все файлы в основном каталоге и вложенных папках.

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

DEL /F /S /Q /A "Полный путь к папке\*"

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

DEL /F /S /Q /A "D:\в корзину\*"

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

DEL /P /F /S /A "D:\эксперимент\*"

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

DEL /F /S /Q /A "Полный путь к папке\*.расширение"

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

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

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

Так как задача эта популярная, то и способов её решения существует множество. Начиная от групповых политик (в которых можно применять для этой цели сценарии входа в систему или автозагрузки), и заканчивая мощными системами управления, вроде 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 >
(»\\$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 (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. Он будет перехватывать лишь подключения предназначенные специально для него.

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

Настроить службу 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 {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 (см. ссылки) и просто скопировать на любой компьютер.

Пригодится

Решили выучить иностранный язык? Домашний репетитор по английскому языку поможет вам в этом. Там же вы сможете попрактиковаться с другими пользователями.

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

  • Серверное администрирование ,
  • Системное администрирование ,
  • Терминология IT
  • В наше время даже для собак придумали удаленное управление .


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


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


    Когда-то давно я устроился работать в организацию в период эпидемии Kido\Conficker . Наиболее простым способом выяснить, все ли хорошо в ИС компании, была славная утилита от Касперского под названием Kido Killer , которая проверяла наличие вируса и устраняла его. Запускать программу на доброй сотне машин руками было невесело, поэтому пришлось знакомиться с автоматизацией.

    Если в операционных системах *nix для удаленного запуска, как правило, используется SSH, то у Windows способов запуска программ и скриптов воистину как песка в пустыне. Я разберу основные варианты, как общеизвестные, так и экзотические. Таких очевидных вещей как telnet-сервер касаться не буду, тем более Microsoft уже убрала его из современных ОС.

    Способы старые, временем проверенные

    Psexec

    Пожалуй, это первое, что приходит на ум, когда идет речь об удаленном запуске программ. Утилита от Марка Руссиновича используется еще со времен Windows NT и до сих пор применяется. Помимо основной функции, можно использовать ее и как Runas, и для запуска программ в пользовательской сессии терминального сервера. Psexec также позволяет задавать ядра процессора, на которых будет запускаться программа, и ее приоритет в системе.


    В качестве примера посмотрим, установлено ли обновление, закрывающее нашумевшую уязвимость SMB на списке компьютеров:


    psexec @computers.txt /u USER /p PASS cmd.exe /v /c ""systeminfo | find "KB4012212" || echo !computername! >> \\server\share\log.txt"""

    В файле computers.txt находится список компьютеров. Для запуска по всему домену можно использовать \\*. В файле \\server\share\log.txt будут появляться имена рабочих станций или серверов без обновления. Если в домене существуют компьютеры с *nix на борту или нет доступа к административному сетевому ресурсу Admin$ ― команда на этой машине не выполнится, но обработка продолжится. Чтобы скрипт не зависал при каждой попытке подключения, можно задать тайм-аут с помощью ключа -n .


    Если компьютер выключен ― мы об этом не узнаем. Поэтому лучше предварительно проверять доступность машин или собирать в файле информацию об успешном или неудачном выполнении.


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


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

    WMIC

    Для управления системами Windows с помощью разных графических утилит часто используется WMI (Windows Management Instrumentation) ― реализация объектно-ориентированного стандарта управления WBEM. В качестве утилиты с графическим интерфейсом для работы с WMI можно использовать wbemtest.exe.


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


    wmic /node:"servername" qfe get hotfixid | find "KB4012212"

    Использовать список компьютеров также можно командой /node:"@computers.txt".


    Еще при помощи WMI можно запускать программы – синтаксис предельно прост:


    wmic /node:"servername" process call create "cmd /c somecommands"

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


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

    Групповые политики и скрипты

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



    Скрипты, выполняющиеся при старте и завершении системы.



    Скрипты, выполняющиеся при входе и выходе пользователя из системы.


    Скрипты, настраиваемые в пользовательском разделе, выполняются от имени пользователя, а в разделе компьютера ― под аккаунтом SYSTEM.

    Назначенные задания

    Довольно интересный способ, заслуживающий право на жизнь. Назначенные задания можно создавать из командной строки при помощи утилиты schtasks.exe , выполнять их, затем удалять. Подробнее с синтаксисом можно ознакомиться в документации , я же разберу пример использования назначенных заданий в доменной среде. Предположим, нам нужно выполнить команду как можно быстрее вне зависимости от того, выключен компьютер или нет. Для этого используются так называемые предпочтения групповых политик (Group Policy Preference).


    Искать установку назначенных заданий следует в конфигурации компьютера или пользователя ― «Настройка ― Параметры панели управления ― Назначенные задания».



    Создание нового назначенного задания.


    Для выполнения команды или скрипта ASAP понадобится создать «Немедленную задачу (Windows 7 и выше)». Если вдруг в инфраструктуре остались машины под управлением Windows XP, то подойдет «Очередное задание (Windows XP)».


    Стоит сделать несколько политик с соответствующими WMI-фильтрами или создать два разных назначенных задания в одной политике с нацеливанием ― например, при помощи того же WMI-фильтра. Это поможет избежать конфликтов в разнородной среде со старыми и новыми Windows.


    Пример WMI-фильтра для применения политики только на компьютерах с Windows XP:


    SELECT * FROM Win32_OperatingSystem WHERE Version LIKE "5.1%" AND ProductType = "1"

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



    Запускаем немедленную задачу только один раз.


    При использовании таких назначенных заданий программа запустится, как только компьютер получит обновление групповой политики. Это удобно: не нужно проверять доступность компьютеров в случае Psexec и wmic и заставлять пользователей перезагружать машины, как в случае скриптов групповых политик. При необходимости можно скопировать файл скрипта локально в разделе «Настройка ― Конфигурация Windows ― Файлы».


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

    Через реестр

    Модификация реестра на пользовательских машинах ― странный вариант, лишь на случай крайней необходимости. Можно использовать ветки Run или RunOnce. Подробнее о них ― в документации . Сама модификация реестра может проводиться через групповые политики или из командной строки ― например, такой командой:


    reg add \\COMPUTER\HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce /v script /t Reg_SZ /d "script.cmd"

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


    Есть и другие способы, такие как правка ярлыков в папке «Автозагрузка» или добавление в ярлык к популярной программе && script.cmd , но эти методы уже из серии «можно, но не нужно».


    Теперь перейдем к новым инструментам.

    Способы новые или куда же без PowerShell

    PowerShell, оправдывая свое название, может подключаться к удаленным компьютерам при помощи WMI, RPC и WS-Management (WSMan). Использование последнего метода требует предварительной настройки.


    Командлеты, не требующие предварительной настройки, как правило, имеют параметр ComputerName, но не имеют параметра Session. Посмотреть список таких командлетов можно командой:


    Get-Command | where { $_.parameters.keys -contains "ComputerName" -and $_.parameters.keys -notcontains "Session"}

    Для настройки WSMan в общем случае достаточно выполнить команду Enable-PSRemoting-Force. Она запустит службу удаленного управления WinRM и пропишет исключения в фаерволе ― в принципе, это можно сделать для всего домена при помощи групповых политик. Подробнее настройка описана в документации .


    После того как все компьютеры будут готовы принимать запросы, мы сможем подключаться при помощи соответствующих командлетов PowerShell. Для проверки возможности подключения используется командлет Test-WSMan .



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


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


    Invoke-Command -ComputerName COMPUTER -ScriptBlock { COMMAND } -credential USERNAME

    Где COMPUTER ― имя компьютера, COMMAND ―– имя команды, а USERNAME ― имя пользователя, если оно нужно.



    Смотрим содержимое диска С удаленного компьютера.


    Если же нам нужно получить полноценную консоль ― не автоматизации ради, а ради управления конкретным компьютером, ― то можно использовать командлет Enter-PSSession.



    Работаем в консоли удаленного компьютера.


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


    Конечно, кроме встроенных средств и небольших утилит, существует множество программ для управления структурой. Помимо взрослых решений, для управления конфигурациями вроде Chef, Ansible и MS SCCM можно использовать и средства мониторинга вроде Zabbix, и даже консоль управления антивирусом Касперского.


    В период гетерогенных структур хорошо бы иметь возможность унифицированного управления Windows и Linux. Это можно сделать и с помощью PowerShell, что само по себе достойно отдельной статьи ― стоит такую сделать или уже лишнее?


    Теги:

    • удаленный запуск
    • wmi
    • powershell
    Добавить метки