9

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

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

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

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

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

4 ответа4

15

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

5

Вы можете сделать это в два этапа:

  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 любым способом, который вам нравится.

2

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

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

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

2

Хотя вы не можете использовать 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .