A ênfase desta questão está no segundo semestre.
Sei como extrair uma lista de todos os serviços e como filtrar seu estado. No entanto, o que não tenho certeza de como fazer é extrair a conta de usuário em que o serviço está configurado para "executar como".
Não tenho a opção de usar o PowerShell (infelizmente), então estou procurando uma forma nativa de CMD. Presumi que haveria uma maneira de usar o comando sc query, mas tudo o que lista é:
SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT
Para sua informação - O sistema operacional é o WIndows 2003 SP2 e preciso dessas informações para todos os serviços, portanto, é um processo demorado se eu tiver que fazê-lo manualmente para cada um deles.
Responder1
wmic:
Nome e conta para todos os serviços:
wmic service get name,startname
iniciou apenas serviços:
wmic service where started=true get name, startname
serviços com padrão específico no nome:
wmic service where 'name like "%sql%"' get name, startname
bem formatado como tabela html (e depois aberto no seu navegador):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html
Sintaxe completa aqui:https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx
Responder2
Você pode fazer isso em duas etapas:
- Obtenha a lista de serviços:
sc \\localhost query | findstr SERVICE_NAME
- Sua peça que falta:
sc \\localhost qc
+ SERVICE_NAME +| findstr SERVICE_START_NAME
Eu recomendaria um script em lote como este:
@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
Isso fornece uma saída como esta:
Claro, você pode limpar ainda mais essa saída ou gravar em um arquivo CSV da maneira que desejar.
Responder3
O CMD não tem uma maneira nativa de fazer isso. SC e NET são aplicativos integrados que acompanham o Windows, mas isso não significa que sejam nativos. A qualquer momento, um administrador pode removê-los e até o CMD fica no escuro.
sc sdshow é o que fornecerá descritores de segurança, mas isso complicará as coisas se você não souber ler strings SDDL.
A maneira mais simples é obter Sysinternals PsService.exe do pacote Ferramentas e usá-lo como segurança psservice [serviço]. Ele listará o SDDL em formato legível, incluindo nomes de contas.
Responder4
Embora você não possa usar o PowerShell, você ainda poderá usar o VBScript para extrair as informações do WMI:
Aqui está um script VBS que listará todos os serviços e a conta como eles iniciam:
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
Salve-o e execute-o com cscript ScriptName.vbs
.
objService.State
forneceria o estado atual do serviço (já que você mencionou que deseja filtrar por ele).
Mais informações sobreClasse Win32_Service.