Как проверить статус службы windows

Время на прочтение
7 мин

Количество просмотров 94K


Туториал


Recovery Mode


Перевод


Начинаем серию переводов, посвященную управлению службами Windows с помощью PowerShell 2.0 и 3.0.
В данном посте будут рассмотрены следующие вопросы управления службами Windows:

  • Получаем статус службы на локальном компьютере
  • Получаем статус службы на удаленном компьютере
  • Осуществляем фильтрацию служб (например, остановленные службы)
  • Зависимые службы

Обозначим начальные условия: Вы работаете под Windows 7 и выше и у Вас имеются права администратора. Все команды рекомендуются выполнять в лабораторной или виртуальной среде, перед тем, как применять в “полевых условиях”.

ПОЛУЧАЕМ СТАТУС СЛУЖБЫ

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

PS C:\> get-service

PowerShell, как правило, не чувствителен к регистру. Вывод приведен на скриншоте ниже.

Каждая строка представляет собой объект службы (service object).Каждый сервисный объект, как правило, имеет свои свойства. Вы можете открыть их, просто передав эти объекты в другую команду, Get-Member.

PS C:\> get-service | get-member

Результаты приведены на скриншоте ниже.

Параметр Typename сверху говорит о том, что за объект перед нами; в данном случае это System.ServiceProcess.ServiceController. На скриншоте также обведены свойства объекта. Это атрибуты, которые описывают этот тип объекта. Хотя большинство из них не используются при отображении по умолчанию, вы можете использовать их, если вы их знаете.
Например, нам интересно посмотреть информацию только о Windows Update. Через Get-Service получим информацию только о некоторых ее свойствах.

PS C:\> get-service wuauserv | select Displayname,Status,Can*
DisplayName : Windows Update
Status : Stopped
CanPauseAndContinue : False
CanShutdown : False
CanStop : False

Как я узнал, что могу напечатать имя службы? Посмотрел с помощью Get-Service.
PS C:\> help get-service

Вы можете получить полную справочную информацию, напечатав:

PS C:\> help get-service –full

Информацию о службе можно получить по ее имени или даже начальным буквам имени.

PS C:\> get-service wi*
Status Name DisplayName
------ ---- -----------
Stopped WiaRpc Still Image Acquisition Events
Running WinDefend Windows Defender Service
Running WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...
Running Winmgmt Windows Management Instrumentation
Running WinRM Windows Remote Management (WS-Manag...

Или если вам удобнее работать с отображаемыми именами, используйте параметр –Displayname.

PS C:\> get-service -DisplayName "windows a*"
Status Name DisplayName
------ ---- -----------
Stopped AllUserInstallA... Windows All-User Install Agent
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio

Я должен использовать имя параметра, чтобы PowerShell воспринимал значения в качестве отображаемого имени, а не фактического имени службы. Команда будет выглядеть так:

PS C:\> get-service "windows a*"

Параметр –Name можно не печатать.

ПОЛУЧАЕМ СТАТУС СЛУЖБЫ НА УДАЛЕННЫХ КОМПЬЮТЕРАХ

До этого нас интересовало получение информации о статусе служб на локальном компьютере. Однако управление службами осуществляется на удаленных компьютерах. Если посмотреть справку по Get-Service, то можно увидеть наличие у этого командлета параметра –Computername. В данном случае подключение к удаленным компьютерам осуществляется без включения функции удаленного управления PowerShell. Если вы можете управлять службами, используя инструменты командной строки (sc.exe или консоль управления Service Manager), вы можете использовать PowerShell. Давайте взглянем на пример:

PS C:\> get-service spooler -ComputerName novo8
Status Name DisplayName
------ ---- -----------
Running spooler Print Spooler

Любая команда, которую я демонстрировал, можно использовать для передачи удаленному компьютеру. Даже нескольким компьютерам, если у вас есть соответствующие права на удаленном компьютере. Если вы используете PowerShell v3, то можно легко выбрать одну службу на множестве компьютеров.

PS C:\> get-service wuauserv -ComputerName chi-dc01,chi-dc02,chi-dc03
Status Name DisplayName
------ ---- -----------
Running wuauserv Windows Update
Stopped wuauserv Windows Update
Running wuauserv Windows Update

Для наглядности представления отформатируем вывод.

PS C:\> get-service wuauserv -ComputerName chi-dc01,chi-dc02,chi-dc03 | format-table Name,Status,Machinename -autosize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc03
wuauserv Stopped chi-dc02
wuauserv Running chi-dc01

Тот же самый результат, но в PowerShell v2.

PS C:\> 'chi-dc01','chi-dc02','chi-dc03'| foreach {get-service wuauserv -computername $_} | Format-Table Name,Status,Machinename -AutoSize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc01
wuauserv Stopped chi-dc02
wuauserv Running chi-dc03

ОСУЩЕСТВЛЯЕМ ФИЛЬТРАЦИЮ (ИСПОЛЬЗУЯ WHERE-OBJECT)

Фильтрация служб осуществляется с помощью командлета Where-Object (where – сокращение для командлета). Все, что нам нужно от PowerShell в этом случае, так это получить только те службы, у которых статус равен “stopped”.

PS C:\> get-service | where {$_.status -eq 'stopped'}

PowerShell получает информацию обо всех службах и передает их (с помощью “|”) в следующую команду, которая осуществляет просмотр каждого объекта. Если свойство статуса объекта равно “stopped”, она остается в конвейере (pipeline), в противном случае она из него исключается. В конце выражение PowerShell отображает те объекты, которые остались в конвейере.
Результаты приведены ниже.

Теперь давайте попробуем найти одну службу на нескольких машинах. Вывод отформатируем в таблицу.

PS C:\> get-service -computername @('chi-dc01','chi-dc02','chi-dc03') | where {$_.name -eq 'wuauserv'} | format-table Name,Status,Machinename -autosize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc02
wuauserv Running chi-dc01
wuauserv Running chi-dc03

Мы даже можем комбинировать запрос отдельных служб с их фильтрацией.

PS C:\> get-service "win*" -comp chi-dc03 | where {$_.status -eq 'running'}
Status Name DisplayName
------ ---- -----------
Running Winmgmt Windows Management Instrumentation
Running WinRM Windows Remote Management (WS-Manag...

Эта команда находит все службы на компьютере CHI-DC03, которые начинаются с ‘WIN’, но отображает только те, которые запущены.
Также можно сгруппировать объекты по свойству статуса (status property).

PS C:\> $dc03 = get-service -computername chi-dc03 | Group-Object -Property Status

Переменная $dc03 является объектом GroupInfo.

PS C:\> $dc03
Count Name Group
----- ---- -----
64 Running {System.ServiceProcess.ServiceController, Sy...
79 Stopped {System.ServiceProcess.ServiceController, Sy...

Свойство Group представляет собой коллекцию связанных служб.

PS C:\> $dc03.Get(0).group

Написанное выше проще понять, если взглянуть на скриншот.

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

PS C:\> $hash = get-service -computername chi-dc03 | Group-Object -Property Status -AsHashTable
PS C:\> $hash
Name Value
---- -----
Running {System.ServiceProcess.ServiceController, Sys...
Stopped {System.ServiceProcess.ServiceController, Sys...

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

PS C:\> $hash.running.count

Однако ничего не произойдет. Потому что свойство Status является просто перечислением (enumeration) для [System.ServiceProcess.ServiceControllerStatus] .NET клас и такие свойства, как Running и Stopped представляют собой целые числа. PowerShell осуществляет конвертацию, чтобы представить в более наглядной форме.

PS C:\> $hash = get-service -computername chi-dc03 | Group-Object -Property Status –AsHashTable –AsString

В чем суть параметра –AsString, на мой взгляд, достаточно очевидно. Теперь работать с хеш-таблицей стало проще.

PS C:\> $hash.running.count
62
PS C:\> $hash.running[0..3]
Status Name DisplayName
------ ---- -----------
Running ADWS Active Directory Web Services
Running AppHostSvc Application Host Helper Service
Running BFE Base Filtering Engine
Running BrokerInfrastru... Background Tasks Infrastructure Ser...

Следующей задачей на повестке дня является проверка зависимостей сервера (server dependencies).

Требуемые службы

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

PS C:\> get-service dns -ComputerName chi-dc03 –RequiredServices
Status Name DisplayName
------ ---- -----------
Running Afd Ancillary Function Driver for Winsock
Running Tcpip TCP/IP Protocol Driver
Running RpcSs Remote Procedure Call (RPC)
Running NTDS Active Directory Domain Services

Параметр –RequiredServices передаст объект в конвейер для каждой требуемой службы. Вы можете даже пойти дальше и проверить требуемые службы для работы данной службы.

PS C:\> get-service dns -ComputerName chi-dc03 -RequiredServices | select name,@{name="computername";expression={$_.machinename}} | get-service -RequiredServices
Status Name DisplayName
------ ---- -----------
Running RpcEptMapper RPC Endpoint Mapper
Running DcomLaunch DCOM Server Process Launcher

Параметр –Computername командлета Get-Service возьмет вывод, но только для тех объектов, у которых есть объект свойство Computername – именно поэтому я использую хеш-таблицу с Select-Object. Как мы видим проблем со службой DNS на компьютере CHI-DC03 нет.

ЗАВИСИМЫЕ СЛУЖБЫ

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

PS C:\> get-service dns -ComputerName chi-dc03 -DependentServices
PS C:\> get-service lanmanworkstation -ComputerName chi-dc03 -DependentServices
Status Name DisplayName
------ ---- -----------
Stopped SessionEnv Remote Desktop Configuration
Running Netlogon Netlogon
Running Dfs DFS Namespace
Running Browser Computer Browser

Требуемые и зависимые службы также являются частью каждого объекта службы.

PS C:\> get-service rpcss | Select *services
RequiredServices DependentServices
---------------- -----------------
{RpcEptMapper, DcomLaunch} {WwanSvc, wuauserv, WSearch, wscsvc...}

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

PS C:\> get-service –DependentServices

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

PS C:\> get-service dns -comp chi-dc01,chi-dc03 -RequiredServices | Sort Machinename,Name | Format-table -GroupBy machinename

Результаты видны на скриншоте ниже.

Чтобы получить подобные результаты в PowerShell v2, вам придется передать имена компьютеров (computernames) в Get-Service.

PS C:\> "chi-dc01","chi-dc03" | foreach { get-service dns -comp $_ -RequiredServices} | Sort Machinename,Name | format-table -GroupBy machinename

В следующей статье будет рассмотрен запуск, остановка и перезапуск служб.
Конец перевода.

Upd:
В посте приведены переводы статей с портала 4sysops.com
Managing Services the PowerShell way – Part 1
Managing Services the PowerShell way – Part 2

P.S. Хотим также поделиться нашей бесплатной программой для управления службами Windows – NetWrix Service Monitor. Программа отслеживает все автоматически запускаемые службы на группе серверов и в случае внезапного сбоя одной или нескольких из них отправляет уведомления по электронной почте. Функция перезапуска гарантирует, что все подконтрольные службы будут работать без простоев. Программа проста в настройке: устанавливаем, вводим имена компьютеров и указываем нужный адрес электронной почты.

С помощью командлета Get-Service можно получить список всех установленных в системе служб, их состояние и тип запуска. Этот и другие командлеты для получения статуса и управления службами Windows впервые появился в версии Powershell 1.0. В этой статье мы разберем типовые примеры использования Get-Service для получения статуса служб на локальном или удаленных компьютерах, типе запуска служб и покажем как определять зависимости служб.

Получить список служб, установленных на локальном или удаленном компьютере можно с помощью командлета Get-Service. Команда Get-Service без параметров возвращает список всех служб на локальной системе.

Get-Service

Данная команда выведет список всех служб и их статус (запущена или остановлена) и отображаемое имя (Display Name).

проверка состояния служб с помощью powershell - Get-Service

Если вам нужно вывести только запушенные службы, воспользуемся такой командой:

Get-Service | Where-Object {$_.Status -EQ "Running"}

Оператор конвейера (|) передает результаты командлету Where-Object, который отбирает только те службы, для которых параметр Status имеет значение Running. В том случае, если нужно вывести только остановленные службы, укажите значение Stopped.

powershell: получаем список запущенных служб в системе

Получить все свойства объекта службы можно с помощью командлета Get-Member.

get-service | get-member

Как вы видите, данный объект имеет тип (Typename) System.ServiceProcess.ServiceController. На скриншоте выведены все доступные свойства и методы объектов служб в системе (большинство из них не используются при отображении по умолчанию).

get-service | get-member

Чтобы вывести определенные свойства службы, нужно воспользоваться возможностями выбора свойств объектов с помощью командлета Select. Например, нам нужно вывести имя, статус и доступные возможности службы Windows Update:

get-service wuauserv | select Displayname,Status,ServiceName,Can*

DisplayName : Windows Update
Status : Stopped
CanPauseAndContinue : False
CanShutdown : False
CanStop : False

получить статус службы из powershell

К примеру, чтобы получить тип запуска служб Windows, выполните команду (работает в PowerShel 5.1):

Get-Service | select -property name,starttype

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

get-service wi*

Так можно отсортировать список служб компьютера в порядке убывания по значению свойства 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

Get-Service -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

Как в командном файле получить список служб Windows? Как узнать, установлена ли определённая служба? Как проверить её состояние? Как её перезапустить?
Получить ответы на эти важные вопросы помогут команды SC и NET.

Для получения списка служб используется команда:

sc query type= service

Она перечисляет службы, выводя для каждой следующую информацию:

Имя_службы: wuauserv
Выводимое_имя: Центр обновления Windows
        Тип                : 20  WIN32_SHARE_PROCESS  
        Состояние          : 4  RUNNING 
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
        Код_выхода_Win32   : 0  (0x0)
        Код_выхода_службы  : 0  (0x0)
        Контрольная_точка  : 0x0
        Ожидание           : 0x0

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

SERVICE_NAME: wuauserv
DISPLAY_NAME: Automatic Updates
        TYPE               : 20  WIN32_SHARE_PROCESS 
        STATE              : 4  RUNNING 
                                (STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0	(0x0)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

Проверить наличие определённой службы можно поиском, например:
sc query type= service | findstr /i "wuauserv"
Если служба существует, вывод будет содержать строчку, а код возврата будет 0.
Если такой службы нет, вывод будет пустым, а код возврата 1.

Важно! В качестве строки поиска здесь используется внутреннее имя службы, которое не зависит от языковых настроек (DISPLAY_NAME зависит).

Для проверки конфигурации и статуса можно использовать команду SC QUERY , команда работает с внутренними именами, поэтому для проверки службы Планировщик задач можно написать SC QUERY schedule, и это будет работать везде. Проверить, запущена ли служба, можно по наличию строки RUNNING или STOPPED:

sc query schedule | find "RUNNING"

Команда NET START перечисляет все запущенные службы по одной на строчку, что делает работу с ней простой, например, проверить, что служба запущена, можно командой NET START | find «Планировщик заданий». Но необходимо учитывать, что эта команда работает с пользовательскими именами (Display Name) служб и приведённая команда не сработает в англоязычных региональных настройках.

Is there any Windows command which will show the status of a single service?

For example, I want to know whether «IIS admin service» is running or not. If it is running the command ouput should be «running».

I tried sc query type= service state= all | find "IIS Admin Service" which displayed the output:

«DISPLAY_NAME: IIS Admin Service»

I also tried net start "IIS Admin Service" | find "Running" which displays:

The requested service has already been started.

More help is available by typing NET HELPMSG 2182.

But it doesn’t give me an output such as

«service name» = running / disabled / stopped

Is there a command which has output in this format?

TRiG's user avatar

TRiG

1,1813 gold badges13 silver badges30 bronze badges

asked Feb 8, 2016 at 15:32

vikas's user avatar

Use the service name and not the display name

sc query iisadmin

jscott's user avatar

jscott

24.5k8 gold badges79 silver badges100 bronze badges

answered Feb 8, 2016 at 15:45

jonathan warren's user avatar

2

You can use Powershell thus:

Get-Service -name 'IIS Admin Service'

jscott's user avatar

jscott

24.5k8 gold badges79 silver badges100 bronze badges

answered Feb 8, 2016 at 15:48

vigilem's user avatar

vigilemvigilem

5792 silver badges7 bronze badges

This works fine:

sc query "service name" | FIND /C "RUNNING"

%ERRORLEVEL% is either 0 of the service is running, or 1 if it’s not. No need for 3rd party tools.

To catch the output of FIND you can use something like this:

sc query "service name" | FIND /C "RUNNING" >NUL && echo Service is running || echo Service is stopped

answered Jan 25 at 10:10

Antoine Megens's user avatar

If you’re willing to use the excellent Cygwin bash, you can simply write:

sc query "Bonjour Service" |grep -qo RUNNING && echo "Bonjour is ok!" || echo "Apple Bonjour Service not running"

The trick here is to have a proper grep available, so that in this way you can catch the true/false (success) status of command. Here -q is for silent and -o is for just returning the exact match and can probably be omitted. And yes, you need to put your «sc.exe» in your PATH.

answered Dec 18, 2017 at 7:57

not2qubit's user avatar

not2qubitnot2qubit

2811 gold badge3 silver badges10 bronze badges

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

I would like to be able to query whether or not a service is running from a windows batch file. I know I can use:

sc query «ServiceName»

but, this dumps out some text. What I really want is for it to set the errorlevel environment variable so that I can take action on that.

Do you know a simple way I can do this?

UPDATE
Thanks for the answers so far. I’m worried the solutions that parse the text may not work on non English operating systems. Does anybody know a way around this, or am I going to have to bite the bullet and write a console program to get this right.

asked Dec 9, 2008 at 15:37

Scott Langham's user avatar

Scott LanghamScott Langham

58.8k40 gold badges132 silver badges204 bronze badges

2

sc query "ServiceName" | find "RUNNING"

answered Dec 9, 2008 at 15:46

Igal Serban's user avatar

Igal SerbanIgal Serban

10.6k3 gold badges36 silver badges40 bronze badges

5

Let’s go back to the old school of batch programing on windows

net start | find "Service Name"

This will work everywhere…

RealHowTo's user avatar

RealHowTo

35k11 gold badges72 silver badges85 bronze badges

answered Mar 23, 2011 at 14:22

Shahin's user avatar

ShahinShahin

1911 silver badge2 bronze badges

6

if you don’t mind to combine the net command with grep you can use the following script.

@echo off
net start | grep -x "Service"
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:end

answered Dec 9, 2008 at 15:48

5

You could use wmic with the /locale option

call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running
if %ErrorLevel% EQU 0 (
    echo Running
) else (
    echo Not running
)

answered Dec 28, 2008 at 19:05

NicJ's user avatar

NicJNicJ

4,0701 gold badge25 silver badges18 bronze badges

Thinking a little bit outside the box here I’m going to propose that powershell may be an answer on up-to-date XP/2003 machines and certainly on Vista/2008 and newer (instead of .bat/.cmd). Anyone who has some Perl in their background should feel at-home pretty quickly.


$serviceName = "ServiceName";
$serviceStatus = (get-service "$serviceName").Status;

if ($serviceStatus -eq "Running") {
    echo "Service is Running";
}
else {
    #Could be Stopped, Stopping, Paused, or even Starting...
    echo "Service is $serviceStatus";
}

Another way, if you have significant investment in batch is to run the PS script as a one-liner, returning an exit code.


@ECHO off
SET PS=powershell -nologo -command
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}"

ECHO.%ERRORLEVEL%

Running as a one-liner also gets around the default PS code signing policy at the expense of messiness. To put the PS commands in a .ps1 file and run like powershell myCode.ps1 you may find signing your powershell scripts is neccessary to run them in an automated way (depends on your environment). See http://www.hanselman.com/blog/SigningPowerShellScripts.aspx for details

answered Jul 20, 2009 at 20:48

@ECHO OFF
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING
REM "MSSQLSERVER" is the name of Service for sample
sc query "MSSQLSERVER" %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo Oh noooo.. trouble mas bro
goto end
:started
echo "SQL Server (MSSQLSERVER)" is started
goto end
:stopped
echo "SQL Server (MSSQLSERVER)" is stopped
echo Starting service
net start "MSSQLSERVER"
goto end
:erro
echo Error please check your command.. mas bro 
goto end

:end

answered Dec 23, 2016 at 2:42

Muhammad Imron's user avatar

1

I would suggest
WMIC Service WHERE "Name = 'SericeName'" GET Started

or WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId (ProcessId will be zero if service isn’t started)

You can set the error level based on whether the former returns «TRUE» or the latter returns nonzero

answered Dec 14, 2012 at 20:27

Mark Sowul's user avatar

Mark SowulMark Sowul

10.3k1 gold badge45 silver badges51 bronze badges

1

sc query "servicename" | findstr STATE

for example:

sc query "wuauserv" | findstr STATE

To report what the Windows update service is doing, running/paused etc.
This is also for Windows 10. Thank me later.

General Failure's user avatar

answered Dec 1, 2016 at 5:08

Quack's user avatar

QuackQuack

391 bronze badge

Try

sc query state= all 

for a list of services and whether they are running or not.

answered Dec 9, 2008 at 15:47

Galwegian's user avatar

GalwegianGalwegian

41.5k16 gold badges112 silver badges158 bronze badges

I’ve found this:

  sc query "ServiceName" | findstr RUNNING  

seems to do roughly the right thing. But, I’m worried that’s not generalized enough to work on non-english operating systems.

RealHowTo's user avatar

RealHowTo

35k11 gold badges72 silver badges85 bronze badges

answered Dec 9, 2008 at 15:48

Scott Langham's user avatar

Scott LanghamScott Langham

58.8k40 gold badges132 silver badges204 bronze badges

2

Just to add on to the list if you are using Powershell.

sc.exe query "ServiceName" | findstr RUNNING

The command below does not work because sc is an alias to Set-Content within Powershell.

sc query "ServiceName" | findstr RUNNING

find also does not work on Powershell for some reason unknown to me.

sc.exe query "ServiceName" | find RUNNING

answered Aug 4, 2016 at 9:07

Chris Voon's user avatar

Chris VoonChris Voon

1,9742 gold badges18 silver badges11 bronze badges

SERVICO.BAT
@echo off
echo Servico: %1
if "%1"=="" goto erro
sc query %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:erro
echo sintaxe: servico NOMESERVICO
goto end

:end

thor's user avatar

thor

21.5k31 gold badges88 silver badges174 bronze badges

answered Dec 5, 2016 at 18:53

Luis Ramos's user avatar

I noticed no one mentioned the use of regular expressions when using find/findstr-based Answers. That can be problematic for similarly named services.

Lets say you have two services, CDPUserSvc and CDPUserSvc_54530

If you use most of the find/findstr-based Answers here so far, you’ll get false-positives for CDPUserSvc queries when only CDPUserSvc_54530 is running.

The /r and /c switches for findstr can help us handle that use-case, as well as the special character that indicates the end of the line, $

This query will only verify the running of the CDPUserSvc service and ignore CDPUserSvc_54530

sc query|findstr /r /c:"CDPUserSvc$"

answered Feb 13, 2018 at 5:45

kayleeFrye_onDeck's user avatar

A suggested approach can be found in an answer to a related question: target very specific things which are locale-independent. In this case, for obtaining service status from sc.exe, the integer which identifies the state was found to be independent of active language and, therefore, robust.

Short example (additional details in the linked answer):

for /F "skip=3 tokens=3" %%i in ('""%windir%\system32\sc.exe" query "W32Time" 2^>nul"') do (
  if "%%i"=="4" (
    echo 'W32Time' service is running
    goto :SkipRemainingIterations
  )
)
:SkipRemainingIterations

answered Jun 15 at 23:03

Helder Magalhães's user avatar

Use Cygwin Bash with:

sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"

(Make sure you have sc.exe in your PATH.)

answered Dec 18, 2017 at 8:02

not2qubit's user avatar

not2qubitnot2qubit

14.7k8 gold badges97 silver badges137 bronze badges

I have created one based from above but will show if the service is installed first then get whether it is running or not.

sc query "YourService" | find /i "failed" 2>&1>nul && echo.'YourService Not Installed' || (sc query "YourService"| find /i "running" 2>&1>nul && echo.Yes || echo.No)

answered Nov 1, 2021 at 15:52

MSBUTech's user avatar

1

  • Как проверить ссд диск на исправность windows 10
  • Как проверить скорость интернета ростелеком на компьютере windows
  • Как проверить сколько озу в windows 10
  • Как проверить скорость интернета на ноутбуке windows 10
  • Как проверить статус активации windows 10