Акцент в этом вопросе делается на второй половине.
Я знаю, как извлечь список всех служб и как отфильтровать их состояние. Однако я не уверен, как извлечь учетную запись пользователя, для которой служба настроена на "запуск от имени".
У меня нет возможности использовать 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
Это можно сделать в два этапа:
- Получить список услуг:
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-файл любым удобным для вас способом.
решение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.