Comment extraire une liste de services ET sous quel compte ils fonctionnent?

13

L'accent de cette question est sur la seconde moitié.

Je sais comment extraire une liste de tous les services et comment filtrer sur leur état. Cependant, ce que je ne sais pas comment faire, c'est d'extraire le compte d'utilisateur que le service est configuré pour "exécuter en tant que".

Je n'ai pas la possibilité d'utiliser PowerShell (malheureusement), donc je recherche une méthode CMD native. J'ai supposé qu'il y aurait un moyen d'utiliser la commande de requête sc mais tout ce qui liste est:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

Pour info - Le système d'exploitation est WIndows 2003 SP2 et j'ai besoin de ces informations pour tous les services, c'est donc un processus de longue haleine si je dois le faire manuellement pour chacun d'eux.

Petay87
la source

Réponses:

20

wmic:
nom et compte de tous les services:
wmic service get name,startname

services démarrés uniquement:
wmic service where started=true get name, startname

services avec un motif spécifique dans le nom:
wmic service where 'name like "%sql%"' get name, startname

joliment formaté en tableau html (puis ouvert dans votre navigateur):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html

Syntaxe complète ici: https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx

wmz
la source
Quelle est la différence entre sc queryet wmic?
Pacerier
1
@Pacerier Différence par rapport à quoi? Ce ne sont que des outils différents (ligne cmd) vous permettant d'interroger / d'interagir avec les services; sc est uniquement destiné à cet usage, tandis que wmic est plus général (car il permet d'interroger différentes parties du système). wmic est également plus facile à utiliser pour ce problème particulier (une seule requête)
wmz
5

Vous pouvez accomplir cela en deux étapes:

  1. Obtenez la liste des services:sc \\localhost query | findstr SERVICE_NAME
  2. Votre pièce manquante: sc \\localhost qc+ SERVICE_NAME +| findstr SERVICE_START_NAME

Je recommanderais un script batch comme celui-ci:

@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

Cela vous donne une sortie comme celle-ci: entrez la description de l'image ici

Bien sûr, vous pouvez nettoyer davantage cette sortie ou écrire dans un fichier CSV de la manière que vous souhaitez.

armani
la source
1

CMD n'a aucun moyen natif de le faire. SC et NET sont des applications intégrées fournies avec Windows, mais cela ne signifie pas qu'elles sont natives. À tout moment, un administrateur peut les supprimer et même CMD est laissé dans le noir.

sc sdshow est ce qui vous donnera des descripteurs de sécurité, mais cela compliquera les choses si vous ne savez pas lire les chaînes SDDL.

Le moyen le plus simple est d'obtenir Sysinternals PsService.exe à partir du package Tools et de l'utiliser comme sécurité [service] psservice. Il répertorie le SDDL dans un format lisible, y compris les noms de compte.

JasonXA
la source
Qu'entendez-vous par «aucune manière native de le faire»? N'est-ce pas C:\Windows\System32\sc.exepour toutes les versions de Windows?
Pacerier
Lire à nouveau. Intégré signifie non amovible comme CMD. Si un administrateur désactive PowerShell, il peut également désactiver sc et net. Le moyen le plus simple consiste à utiliser une application portable qui fait tout par défaut et n'est pas liée au système d'exploitation.
JasonXA
1

Bien que vous ne puissiez pas utiliser PowerShell, vous devriez toujours pouvoir utiliser VBScript pour extraire les informations de WMI:

Voici un script VBS qui répertoriera tous les services et le compte sous lequel ils démarrent:

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

Enregistrez-le puis exécutez-le avec cscript ScriptName.vbs.

objService.State vous donnerait l'état actuel du service (puisque vous avez mentionné que vous cherchiez à le filtrer).

Plus d'informations sur la classe Win32_Service .

Ƭᴇcʜιᴇ007
la source