이 질문의 강조점은 후반부에 있습니다.
모든 서비스 목록을 추출하는 방법과 서비스 상태를 필터링하는 방법을 알고 있습니다. 그러나 어떻게 해야할지 잘 모르겠는 것은 서비스가 "다음 계정으로 실행"으로 설정된 사용자 계정을 추출하는 것입니다.
(안타깝게도) PowerShell을 사용할 수 있는 옵션이 없어서 기본 CMD 방식을 찾고 있습니다. sc query 명령을 사용하는 방법이 있을 것이라고 가정했지만 그 목록은 모두 다음과 같습니다.
SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT
참고 - OS는 WIndows 2003 SP2이고 모든 서비스에 대해 이 정보가 필요하므로 각 서비스에 대해 수동으로 수행해야 하는 경우 프로세스가 오래 걸립니다.
답변1
wmic:
모든 서비스의 이름 및 계정:
wmic service get name,startname
시작된 서비스만:
wmic service where started=true get name, startname
이름에 특정 패턴이 있는 서비스:
wmic service where 'name like "%sql%"' get name, startname
html 테이블로 형식이 잘 지정되어 있습니다(브라우저에서 열림).
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html
전체 구문은 다음과 같습니다.https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx
답변2
이 작업은 다음 두 단계로 수행할 수 있습니다.
- 서비스 목록을 가져옵니다.
sc \\localhost query | findstr SERVICE_NAME
- 누락된 부분:
sc \\localhost qc
+ SERVICE_NAME +| findstr SERVICE_START_NAME
다음과 같은 배치 스크립트를 권장합니다.
@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
그러면 다음과 같은 출력이 제공됩니다.
물론 원하는 방식으로 해당 출력을 추가로 정리하거나 CSV 파일에 쓸 수 있습니다.
답변3
CMD에는 이를 수행할 수 있는 기본 방법이 없습니다. SC와 NET은 Windows와 함께 제공되는 기본 제공 애플리케이션이지만 이것이 기본이라는 의미는 아닙니다. 관리자는 언제든지 이를 제거할 수 있으며 CMD도 어둠 속에 남겨질 수 있습니다.
sc sdshow는 보안 설명자를 제공하지만 SDDL 문자열을 읽는 방법을 모르면 상황이 복잡해집니다.
가장 간단한 방법은 도구 패키지에서 Sysinternals PsService.exe를 가져와서 psservice 보안[서비스]으로 사용하는 것입니다. 계정 이름을 포함하여 SDDL이 읽을 수 있는 형식으로 나열됩니다.
답변4
PowerShell을 사용할 수 없더라도 VBScript를 사용하여 WMI에서 정보를 가져올 수는 있습니다.
다음은 모든 서비스와 서비스가 시작되는 계정을 나열하는 VBS 스크립트입니다.
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
저장한 후 로 실행해 보세요 cscript ScriptName.vbs
.
objService.State
서비스의 현재 상태를 알려줄 것입니다(귀하가 이를 기준으로 필터링하려고 한다고 언급했으므로).
자세한 내용은Win32_Service 클래스.