Как извлечь список служб и узнать, под какой учетной записью они работают?

Как извлечь список служб и узнать, под какой учетной записью они работают?

Акцент в этом вопросе делается на второй половине.

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

У меня нет возможности использовать PowerShell (к сожалению), поэтому я ищу собственный способ CMD. Я предполагал, что будет способ использовать команду sc query, но все, что там перечислено, это:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

К вашему сведению: у меня установлена ​​ОС Windows 2003 SP2, и мне нужна эта информация для всех служб, так что это будет долгий процесс, если мне придется делать это вручную для каждой из них.

решение1

wmic:
Название и счет для всех услуг:
wmic service get name,startname

только запущенные службы:
wmic service where started=true get name, startname

услуги с определенным шаблоном в названии:
wmic service where 'name like "%sql%"' get name, startname

красиво отформатированный как html-таблица (и затем открытый в вашем браузере):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html

Полный синтаксис здесь:https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx

решение2

Это можно сделать в два этапа:

  1. Получить список услуг:sc \\localhost query | findstr SERVICE_NAME
  2. Ваша недостающая часть: sc \\localhost qc+ SERVICE_NAME +| findstr SERVICE_START_NAME

Я бы порекомендовал такой пакетный скрипт:

@echo off
setlocal EnableDelayedExpansion
sc \\localhost query | findstr SERVICE_NAME > services.lst
for /f "tokens=1,2" %%A in (services.lst) do (
    echo %%B
    sc \\localhost qc %%B | findstr SERVICE_START_NAME
)
del services.lst

Это даст вам такой вывод: введите описание изображения здесь

Конечно, вы можете дополнительно очистить этот вывод или записать его в CSV-файл любым удобным для вас способом.

решение3

У CMD нет собственного способа сделать это. SC и NET — встроенные приложения, которые идут с Windows, но это не значит, что они собственные. В любой момент администратор может удалить их, и тогда даже CMD останется в неведении.

sc sdshow — это то, что даст вам дескрипторы безопасности, но это усложнит ситуацию, если вы не знаете, как читать строки SDDL.

Самый простой способ — получить Sysinternals PsService.exe из пакета Tools и использовать его как psservice security [service]. Он выведет список SDDL в читаемом формате, включая имена учетных записей.

решение4

Хотя вы не можете использовать PowerShell, вы все равно сможете использовать VBScript для извлечения информации из WMI:

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

strComputer = "."

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service")

For Each objService in colServices 
    wscript.echo objService.Name & ": " & objService.StartName
Next

Сохраните его и запустите с помощью cscript ScriptName.vbs.

objService.Stateвыдаст вам текущее состояние сервиса (поскольку вы упомянули, что хотите отфильтровать по нему).

Дополнительная информация оКласс Win32_Service.

Связанный контент