2014-01-25 3 views
2

서비스 내 서비스 이름을 가져오고 싶습니다. 대략적인 아이디어는 프로세스 ID를 얻고 프로세스 ID를 WMI, ServiceCotroller 또는 EnumServicesStatusEx() API에 의해 열거 된 서비스와 비교하는 것입니다.서비스 내 서비스 이름 받기

서비스가 도메인 계정 (로컬 관리자가 아님)에서 실행 중입니다. 실행중인 서비스 내부의 서비스를 열거하려면 실행중인 서비스 자체가 열거 형에서 누락되었습니다.

서비스 계정을 로컬 관리자로 이동하면 실행중인 서비스가 발견됩니다. 그래서 코드 문제가 아닙니다. (코드 문제가있는 경우 동작은 동일해야합니다 : 서비스를 찾을 수 없습니다.)

로직을 콘솔 응용 프로그램 (또는 powershell)으로 추출하고 서비스 계정에서 응용 프로그램 또는 powershell을 실행하면 해당 서비스도 검색됩니다. 따라서 허가 문제가 아닙니다. (사용 권한 문제가 있으면 동작이 동일해야합니다. 서비스를 찾을 수 없습니다.)

서비스 계정이 관리자가 아니고 서비스가 아닌 경우 서비스를 열거 할 수 없습니다. 그것은 매우 전선 문제입니다.

MSDN에서 EnumServicesStatusEx에 대한 설명서를 확인하고 로컬 관리자가 로컬 인증 된 사용자보다 추가 SC_MANAGER_LOCK을 찾았습니다. 이유인가? 하지만 서비스 열거와 잠금을 연결할 수는 없습니다.

또는 누군가가 서비스 내부에서 서비스 이름을 쿼리하는 방법을 지정하십시오.

감사합니다.

현재 Windows 2008 R2입니다.

관련 질문 : How to get name of windows service from inside the service itself이 발견되었습니다. 1st answer은 허용되지 않습니다. 공통 라이브러리를 제공하고 설치 프로그램을 제어 할 수 없습니다. 2nd answer은 나와 같은 생각입니다. 나는 그것이 나의 결과와 같아야한다고 생각한다.

답변

0

는 그것은 허가 문제입니다.

psservice.exe security InstrumentationTestService 

을 나는 다음과 같은 결과를 얻었다 : 시스 인 터널에서

실행 PsService를 좋아 그것은 내 서비스 계정이 서비스 상태를 조회 할 권한이 없음을 나타냅니다

PsService v2.24 - Service information and configuration utility 
Copyright (C) 2001-2010 Mark Russinovich 
Sysinternals - www.sysinternals.com 

SERVICE_NAME: InstrumentationTestService 
DISPLAY_NAME: InstrumentationTestService 
     ACCOUNT: LocalSystem 
     SECURITY: 
     [ALLOW] NT AUTHORITY\SYSTEM 
       Query status 
       Query Config 
       Interrogate 
       Enumerate Dependents 
       Pause/Resume 
       Start 
       Stop 
       User-Defined Control 
       Read Permissions 
     [ALLOW] BUILTIN\Administrators 
       All 
     [ALLOW] NT AUTHORITY\INTERACTIVE 
       Query status 
       Query Config 
       Interrogate 
       Enumerate Dependents 
       User-Defined Control 
       Read Permissions 
     [ALLOW] NT AUTHORITY\SERVICE 
       Query status 
       Query Config 
       Interrogate 
       Enumerate Dependents 
       User-Defined Control 
       Read Permissions 

.

서비스 계정을 사용하여 powershell/WMI/ServiceController를 실행하면 서비스 계정이 INTERACTIVE 사용자로 바뀝니다. 따라서 서비스 상태를 쿼리 할 수있는 권한이 있습니다.

해결책은 서비스 계정 쿼리 상태 권한을 부여하는 것입니다.

0

이것은 순수한 PowerShell 대답이 아니지만, EXE, DLL 및 SERVICE에 관한 한 좋은 도구는 TASKLIST.EXE입니다.

/FI와/FO를 살펴보십시오. 다음 샘플에서는 검색 서비스에 대한 정보를 얻습니다.

tasklist /FI "SERVICES eq WSearch" /FO "CSV" 

PowerShell을 youcan 사용과 통합하려면

tasklist /FI "SERVICES eq WSearch" /FO "CSV" | ConvertFrom-Csv 
+0

답장을 보내 주셔서 감사합니다. 서비스 PID를 얻고 tasklist/FI "PID eq {PID}"/ SVC/NH와 같은 tasklist를 실행하려고합니다. 서비스 이름은 * N/A *입니다. BTW, 서비스 계정으로 powershell에서 tasklist를 실행하면 올바른 서비스 이름을 반환 할 수 있습니다. 그래서 당신의 솔루션은 실패합니다. 너무. – DeepNight

+0

올바르게 부르시겠습니까? 당신이 사용하는 정확한 구문을 줄 수 있습니까? – JPBlanc

+0

'tasklist/FI "PID eq 2524"/ SVC "콘솔에서"sqlservr.exe 2524 MSSQLSERVER "가"sqlservr.exe 2524 N/A "를 반환합니다. 서비스 디버그 출력에 있습니다. – DeepNight