Как извлечь список сервисов И под каким аккаунтом они работают?
Акцент этого вопроса на второй половине.
Я знаю, как извлечь список всех сервисов и как отфильтровать их состояние. Однако я не знаю, как это сделать, - извлечь учетную запись пользователя, для которой служба настроена на "запуск от имени".
У меня нет возможности использовать PowerShell (к сожалению), поэтому я ищу собственный способ CMD. Я предполагал, что будет способ использовать команду запроса sc, но все, что перечисляет:
SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT
К сведению - ОС - Windows WIndows 2003 с пакетом обновления 2 (SP2), и мне нужна эта информация для всех сервисов, поэтому это сложный процесс, если мне придется делать это вручную для каждой из них.
4 ответа
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
Вы можете сделать это в два этапа:
- Получить список услуг:
sc \\localhost query | findstr SERVICE_NAME
- Ваш недостающий кусок:
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 любым способом, который вам нравится.
CMD has no native way to do it. SC and NET are built-in applications that come with Windows but that doesn't mean they're native. At any time an admin can remove them and then even CMD is left in the dark.
sc sdshow - это то, что даст вам дескрипторы безопасности, но это усложнит ситуацию, если вы не знаете, как читать строки SDDL.
Самый простой способ - получить Sysinternals PsService.exe из пакета Tools и использовать его в качестве psservice security [service]. Он перечислит SDDL в удобочитаемом формате, включая имена учетных записей.
Хотя вы не можете использовать 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.