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

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

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:

  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

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.Stateforneceria o estado atual do serviço (já que você mencionou que deseja filtrar por ele).

Mais informações sobreClasse Win32_Service.

informação relacionada