L'accent de cette question est sur la seconde moitié.
Je sais comment extraire une liste de tous les services et comment filtrer leur état. Cependant, ce que je ne sais pas comment faire est d'extraire le compte d'utilisateur pour lequel le service est défini sur "exécuter en tant que".
Malheureusement, je n'ai pas la possibilité d'utiliser PowerShell. Je recherche donc une méthode CMD native. J'ai supposé qu'il y aurait un moyen d'utiliser la commande sc query mais tout ce qui est répertorié est:
SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT
FYI - Le système d’exploitation est Windows 2003 SP2 et j’ai besoin de ces informations pour tous les services. La procédure est donc longue si je dois le faire manuellement pour chacun d’eux.
wmic:
Nom et compte pour 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é comme 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
Vous pouvez accomplir cela en deux étapes:
sc \\localhost query | findstr SERVICE_NAME
sc \\localhost qc
+ SERVICE_NAME + | findstr SERVICE_START_NAME
Je recommanderais un script batch comme ceci:
@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:
Bien sûr, vous pouvez nettoyer davantage cette sortie ou écrire dans un fichier CSV de la manière que vous souhaitez.
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 reste dans le noir.
sc sdshow est ce qui vous donnera les 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 en tant que sécurité psservice [service]. Il listera le SDDL dans un format lisible, y compris les noms de compte.
Bien que vous ne puissiez pas utiliser PowerShell, vous devriez quand même pouvoir utiliser VBScript pour extraire les informations de WMI:
Voici un script VBS qui listera tous les services et le compte sous lequel ils commencent:
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 dit que vous cherchiez à filtrer par celui-ci).
Plus d'informations sur la classe Win32_Service .