Como extraio uma lista de serviços E em que conta eles são executados?

13

A ênfase desta questão está no segundo semestre.

Eu 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á definido como "executar como".

Como não tenho a opção de usar o PowerShell (infelizmente), estou procurando uma maneira 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

FYI - O sistema operacional é o Windows 2003 SP2 e eu preciso dessas informações para todos os serviços, por isso é um processo demorado, se necessário fazê-lo manualmente para cada um deles.

Petay87
fonte

Respostas:

20

wmic:
Nome e conta de todos os serviços:
wmic service get name,startname

apenas serviços iniciados:
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 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

wmz
fonte
Qual é a diferença entre sc querye wmic?
Pacerier 11/02
11
@Pacerier Diferença em relação a quê? São apenas ferramentas diferentes (linha de cmd) que permitem consultar / interagir com serviços; sc é apenas para esse propósito, enquanto o wmic é mais geral (pois permite consultar várias partes do sistema). wmic também é mais fácil de usar para este problema particular (somente uma consulta)
wmz
5

Você pode fazer isso em duas etapas:

  1. Obtenha a lista de serviços:sc \\localhost query | findstr SERVICE_NAME
  2. 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: insira a descrição da imagem aqui

Obviamente, você pode limpar ainda mais essa saída ou gravar em um arquivo CSV da maneira que desejar.

Armani
fonte
1

O CMD não possui uma maneira nativa de fazer isso. SC e NET são aplicativos integrados que acompanham o Windows, mas isso não significa que são nativos. A qualquer momento, um administrador pode removê-los e até o CMD é deixado no escuro.

O sc sdshow é o que fornecerá descritores de segurança, mas isso complicará as coisas se você não souber ler as strings SDDL.

A maneira mais simples é obter o Sysinternals PsService.exe do pacote Tools e usá-lo como psservice security [service]. Ele listará o SDDL em formato legível, incluindo nomes de contas.

JasonXA
fonte
O que você quer dizer com "nenhuma maneira nativa de fazer isso"? Não está presente em C:\Windows\System32\sc.exetodas as versões do Windows?
Pacerier
Leia de novo. Incorporado significa não removível como o CMD. Se um administrador desabilitar o PowerShell, ele também poderá desativar o sc e o net. A maneira mais simples é usar um aplicativo portátil que faça tudo por padrão e não esteja vinculado ao sistema operacional.
JasonXA
1

Embora você não possa usar o PowerShell, ainda poderá usar o VBScript para obter as informações do WMI:

Aqui está um script VBS que lista todos os serviços e a conta que eles iniciam como:

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 (desde que você mencionou que deseja filtrar por ele).

Mais informações sobre a classe Win32_Service .

Ƭᴇcʜιᴇ007
fonte