- Get-Service: проверка состояния служб Windows в PowerShell
- Что это за процесс services.exe в Windows и может ли он быть вирусом?
- Назначение оригинального файла
- Поиски проблемы
- Удаление вируса и восстановление работы Windows
- Управляем службами Windows с помощью PowerShell. Часть 2
- STOP-SERVICE
- START-SERVICE
- RESTART-SERVICE
- ПРИОСТАНОВКА И ВОЗОБНОВЛЕНИЕ РАБОТЫ
- УДАЛЕННЫЕ СЛУЖБЫ
- УСТАНАВЛИВАЕМ УДАЛЕННЫЙ СТАТУС
- УСТАНАВЛИВАЕМ ТИП АВТОЗАПУСКА СЛУЖБЫ
Get-Service: проверка состояния служб Windows в PowerShell
С помощью командлета Get-Service можно получить список всех установленных в системе служб, их состояние и тип запуска. Этот и другие командлеты для получения статуса и управления службами Windows впервые появился в версии Powershell 1.0. В этой статье мы разберем типовые примеры использования Get-Service для получения статуса служб на локальном или удаленных компьютерах, типе запуска служб и покажем как определять зависимости служб.
Получить список служб, установленных на локальном или удаленном компьютере можно с помощью командлета Get-Service. Команда Get-Service без параметров возвращает список всех служб на локальной системе.
Данная команда выведет список всех служб и их статус (запущена или остановлена) и отображаемое имя (Display Name).
Если вам нужно вывести только запушенные службы, воспользуемся такой командой:
Оператор конвейера (|) передает результаты командлету Where-Object, который отбирает только те службы, для которых параметр Status имеет значение Running. В том случае, если нужно вывести только остановленные службы, укажите значение Stopped.
Получить все свойства объекта службы можно с помощью командлета Get-Member.
Как вы видите, данный объект имеет тип (Typename) System.ServiceProcess.ServiceController. На скриншоте выведены все доступные свойства и методы объектов служб в системе (большинство из них не используются при отображении по умолчанию).
Чтобы вывести определенные свойства службы, нужно воспользоваться возможностями выбора свойств объектов с помощью командлета Select. Например, нам нужно вывести имя, статус и доступные возможности службы Windows Update:
get-service wuauserv | select Displayname,Status,ServiceName,Can*
DisplayName : Windows Update
Status : Stopped
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
К примеру, чтобы получить тип запуска служб Windows, выполните команду (работает в PowerShel 5.1):
Get-Service | select -property name,starttype
Можно отфильтровать полученный список по имени службы, используя звездочку как подстановочный знак:
Так можно отсортировать список служб компьютера в порядке убывания по значению свойства Status. Запущенные службы отображаются раньше остановленных.
get-service s* | sort-object status -Descending
В том случае, если нужно проверить наличие (существование) службы в системе (как правило, это может понадобиться в различных скриптах), вы можете воспользоваться такой конструкцией:
if (Get-Service «ServiceTest» -ErrorAction SilentlyContinue)
<
Write-host «ServiceTest exists»
>
Командлет Get-Service можно использовать для получения статуса служб не только на локальном, но и удаленных компьютерах. Для этого нужно использовать аргумент –Computername. Подключение к удаленным компьютерам осуществляется не через PowerShell Remoting (WinRM), а через службу Service Manager (по аналогии с командой sc.ex).
get-service wuauserv -ComputerName remotePC1
Если вы используете PowerShell v3 или выше, то можно опросить статус службы сразу на множестве удаленных компьютерах, их имена нужно перечислить через запятую.
get-service spooler -ComputerName remotePC1,remotePC2, remotePC3| format-table Name,Status,Machinename –autosize
Командлет format-table используется в данном примере для получения более удобного табличного представления состояния служб.
Командлет Get-Service имеет еще два параметра, которые удобно использовать при администрировании служб. Параметр DependentServices получает службы, которые зависят от данной службы. Параметр RequiredServices получает службы, от которых зависит данная служба.
Приведенная ниже команда выводит список служб, требуемых службе LanmanWorkstation для запуска.
Get-Service -Name LanmanWorkstation –RequiredServices
Status Name DisplayName
—— —- ————
Running NSI Network Store Interface Service
Running MRxSmb20 SMB 2.0 MiniRedirector
Running Bowser Browser Support Driver
Следующая команда выводит зависимые службы (подробнее о настройке зависимостей служб в Windows), которым требуется служба LanmanWorkstation.
Get-Service -Name LanmanWorkstation -DependentServices
Что это за процесс services.exe в Windows и может ли он быть вирусом?
Системный процесс под названием services.exe не получится увидеть, открыв Диспетчер задач системы Windows. В первую очередь, потому что по умолчанию в открывающемся окне показываются только программы запущенные от имени пользователя. А services.exe запускается от самой системы. И в большинстве случаев не имеет никакого отношения к вредоносным кодам и вирусам. Значит ли это, что services.exe не может навредить компьютеру? Нет – вероятность замены, а точнее маскировки настоящего вируса под системный процесс существует. Не слишком большая – но всё равно требующая от владельца ПК решить проблему, чтобы вместо этого не пришлось переустанавливать Windows.
Назначение оригинального файла
Настоящий файл Services, как можно понять уже по его названию, представляет собой программу, предназначенную для взаимодействия с сервисными процессами. А ещё – для запуска, остановки и работы ряда служб (включая службы драйверов) и баз данных, и даже для передачи запросов управления. Называется такая утилита Service Control Manager и входит в состав операционных систем Виндовс, начиная с версий 2000 и XP. Места она на самом деле, когда под процесс не маскируется вирус, занимает очень мало и совершенно не мешает работе компьютера.
Существует небольшая вероятность того, что системную программу заразит вредоносный код, попавший на ПК из-за установки программного обеспечения из непроверенных источников или присланного по электронной почте вложения. Иногда это могут быть кейлоггеры, которые передают информацию о паролях пользователей посторонним лицам, черви, трояны. А иногда даже вирус типа malware, подготавливающий среду для работы других вредоносных кодов.
Поиски проблемы
Пользователь ПК может попробовать самостоятельно проверить, является ли services.exe вирусом – или это всё-таки обычный процесс. В первую очередь, следует перейти к Диспетчеру задач, нажав кнопки Ctr + Shift + Esc, найти программу Services и открыть контекстное меню. Здесь нужно выбрать «Открыть место хранения файла» и перейти к папке, где расположено ПО. И, если это System32, процесс, скорее всего, не является вирусом. Если папка другая – есть риск, что services.exe заражён.
Второй признак проблемы – большой объём занимаемой процессом памяти. Именно это, кстати, обычно и вызывает подозрения по поводу Services – программа загружает процессор и ОЗУ, компьютер работает медленнее. В нормальных условиях размер составляет всего несколько мегабайт, и в папке, и в Диспетчере задач. Но, заметив, что процесс занимает 200-300 или даже больше 1 ГБ операционной памяти, стоит заподозрить его подмену вирусом.
Удаление вируса и восстановление работы Windows
Первый этап проверки файла на заражение вирусами – сканирование системы с помощью антивирусной программы. Например – уже установленного антивируса, хотя он уже пропустил заражение компьютера и вряд ли может считаться подходящим вариантом. Также стоит попробовать Dr.Web CureIt! или Malwarebytes – первая программа полностью бесплатная, вторая – бесплатна только в течение месяца.
Второй этап – использование утилиты Registry Reviver, позволяющей оптимизировать реестр системы и даже сократить время запуска компьютера. Есть и другие способы решения проблемы с реестром, включая его ручную очистку с помощью утилиты regedit – но использовать этот способ стоит, только если пользователь хорошо понимает, что делает. Иначе изменения реестра могут привести к ещё большим проблемам, чем добавил пользователю вирус.
Управляем службами Windows с помощью PowerShell. Часть 2
Продолжаем знакомиться с тем, как осуществлять управление службами Windows с использованием PowerShell. В предыдущем посте мы рассмотрели, как получить статус службы на локальном и удаленном компьютере, произвести фильтрацию служб (например, найти только остановленные службы) и определить зависимые службы. В этом посте будут рассмотрены такие достаточно тривиальные вещи, как:
- Остановка службы
- Запуск службы
- Перезапуск службы
- Приостановка и возобновление работы
- Управление удаленными службами
- Настраиваем автозагрузку службы
Мы уделим большее внимание разбору команд в PowerShell для осуществления выше перечисленного на локальном компьютере. В разделе “управление службами удаленных компьютерах” мы рассмотрим, ограничения работы в PowerShell v2 и v3. Подробности под катом.
Так как команда для получения статуса службы называется Get-Service, догадаться о том, как пишутся другие команды не составит труда. На худой конец мы можем спросить у PowerShell обо всех командах, так или иначе относящихся к работе со службами. Обратите внимание, что мы использовали параметр –noun для получения всех команд, связанных со службами.
Взглянем на эти команды внимательнее.
STOP-SERVICE
Чтобы остановить службу, мы должны уточнить ее имя.
Однако в конвейер ничего не будет передано. Некоторые командлеты, такие как Stop-Service, созданы таким образом, что по умолчанию они не записывают объект в конвейер. Мы же заставим это сделать, использовав параметр –Passthru.
Если служба не запущена, то командлет ничего не выведет, равно как и не выдаст никакой ошибки. Поэтому иногда лучше передать объект в Stop-Service (естественно использовав при этом параметр –whatif).
Параметр –WhatIf был добавлен для того, чтобы мы посмотрели, что будет, если командлет будет запущен. Когда я удостоверюсь, что это именно та служба, которая меня интересует, я просто удалю -Whatif и остановлю службу.
Как я уже упомянул выше, если служба уже остановлена, то командлет ничего не сделает. И использование Stop-Service в этом случае никому не навредит. Однако я все же предпочитают более цивилизованный подход, а именно:
Если служба запущена, то объект передается в конвейер и отправляется в Stop-Service. Ниже приведен вариант с остановкой нескольких служб.
Некоторые службы не захотят останавливаться – в силу наличия зависимых служб – что мы и видим на скриншоте ниже.
В таком случае используем параметр –Force. В большинстве случаев это работает, но без “защиты от дурака”. Помните, что команда также остановит зависимые службы.
START-SERVICE
Запуск службы осуществляется аналогичным образом. Он поддерживает параметр –Whatif, и вам придется использовать –Passthru, чтобы увидеть объекты.
И снова: если служба уже запущена, командлет ничего не сделает. Однако вы можете попытаться запустить службу и получите такую ошибку.
Причиной тому в большинстве случаев является выключенные службы. Как конфигурировать настройки службы, я расскажу в следующей статье.
Если вы хотите запустить службы и все службы, зависимые от нее, используйте следующее выражение:
Мы должны явно получить зависимые службы, потому что Start-Service не запустит автоматически их.
RESTART-SERVICE
Вы удивитесь, но перезапуск службы работает также как два предыдущих примера. Используйте –Passthru, если хотите убедиться, что служба запущена.
Так как мы осуществляем остановку службы, нам может понадобиться параметр –Force.
ПРИОСТАНОВКА И ВОЗОБНОВЛЕНИЕ РАБОТЫ
Работа некоторых служб может быть приостановлена на некоторое время, а затем возобновлена, и мы можем это сделать через PowerShell. Однако если служба не удовлетворяет требованиям, мы получим такие ошибки. (на примере показано, что мы пытались приостановить службу bits)
В чем же проблема? Смотрим на объект (используя Get-Service).
Если значение свойства CanPauseAndContinue равно True, значит мы можем приостанавливать и возобновлять работу службы. Найдем такие службы:
Как мы видим, не так много служб удовлетворяют этому требованию.
Готовы возобновить работу службы? Используйте следующее выражение:
Оба командлета также поддерживают –Whatif.
УДАЛЕННЫЕ СЛУЖБЫ
Как вы могли обратить внимание, все примере выше мы демонстрировали на локальном машине. И это неслучайно. К сожалению даже в PowerShell v3, ни у одного из этих командлетов нет параметра, который позволял бы управлять службой на удаленном компьютере. Get-Service, конечно, поддерживает параметр –Computername, но не более. Службу лицезреть вы сможете, а что-либо с ней сделать не получится. Нет, можно, конечно, если удаленный компьютер работает с PS v2 и включен PowerShell Remoting. Тогда мы можете использовать все выше приведенные команды, используя Invoke-Command для удаленного компьютера или PSSession. С другой стороны, проще управлять одной службой на нескольких серверах.
Управление службами на удаленных компьютерах не ограничивается вышеперечисленным, но это уже будет предмет рассмотрения последующих статей.
Все эти командлеты могут быть использованы в конвейерном выражении и зачастую это лучший вариант. Использование Get-Service для получения объектов и последующая передача их в подходящий командлет.
УСТАНАВЛИВАЕМ УДАЛЕННЫЙ СТАТУС
Итак, мы выяснили, что у командлета Stop-Service отсутствует такой полезный параметр как –Computername. Мы можете использовать эти команды в удаленной сессии, обратившись к командлету Invoke-Command, что уже само по себе продуктивно, если вы работаете со службой на нескольких компьютерах. Одно можно запускать, останавливать, перезапускать, ставить на паузу и запускать заново, используя Set-Service.
Эта команда поддерживает параметр –WhatIf. Вы также должны использовать –Passthru для передачи объектов в конвейер.
Валидными значениям для параметра –Status являются “запущена” (running), “остановлена” (stopped) и “на паузе” (paused). Помните, что у службы есть зависимые службы, мы не сможете изменять ее, что и продемонстрировано на скриншоте ниже.
К сожалению, у Set-Service отсутствует параметр –Force, поэтому придется вернуться к использованию PowerShell remoting и Invoke-Command. Если вы хотите перезапустить удаленную службу, используйте следующую команду:
Не забудьте использовать –Passthru, в противном случае вторая команда Set-Service ничего не осуществит.
Что по мне, так я предпочитаю работать сразу с несколькими службами, которые я не могу удаленно остановить, используя Set-Service, хотя их запуск проблем составляет. Я использую Invoke-Command. Но помните, что используя параметр –Computername PowerShell осуществляет подключение, используя RPC и DCOM, что может привести к проблемам с файрволом. Invoke-Command использует PowerShell remoting, который мы может быть еще не настроили или не включили.
УСТАНАВЛИВАЕМ ТИП АВТОЗАПУСКА СЛУЖБЫ
Set-Service полезнен, когда вы хотите включить или отключить службу, используя параметр –StartupType. Если Вы настроили службу, используя значения Automatic, Manual or Disabled. К сожалению, не существует варианта для Automatic (Delayed).
Однако, просто взглянув на объект, мы не сможем сказать, к какому типу автозагрузки он относится.
Как это сделать – одна из тем следующей статьи.
Помните, что изменение типа автозагрузки не повлияет на текущий статус службы.
Так что если вы хотите выключить и остановить (или включить и запустить) службу, передайте объект в подходящий командлет.
Технически, Set-Service позволяет вам изменить отображаемое имя службы и описание, но лично мне никогда не приходилось использовать в своей работе. Я использую Set-Service для включения и выключения служб. Если необходимо управлять службами удаленно, то я использую Invoke-Command.
Все, что я продемонстрировал в последних статьях, было связано с использованием специфических типов объектов службы, которые, как вы могли заметить, имеют некоторые ограничения. В следующей статье мы рассмотрим другие возможности по управлению службами, которые призваны обойти эти ограничения.