2014-01-25 4 views
2

Я хочу получить имя службы внутри службы. Основная идея - получить идентификатор процесса и сравнить идентификатор процесса с сервисами, перечисленными API WMI, ServiceCotroller или EnumServicesStatusEx().Получить имя службы внутри службы

Проблема в том, что служба работает под учетной записью домена (это не локальный администратор). Когда я хочу перечислить службы внутри запущенной службы, запущенная служба сама отсутствует в перечислении!

Если я переведу учетную запись службы локальному администратору, найденная работа будет найдена. Так что это не проблема с кодом. (Если проблема с кодом, поведение должно быть одинаковым: служба не найдена.)

Если я извлечу логику в консольное приложение (или с помощью powershell) и запустим приложение или powershell в учетной записи службы, служба также будет найдена. Так что это не проблема разрешения. (Если проблема с разрешением, поведение должно быть одинаковым: служба не найдена.)

Служба НЕ МОЖЕТ быть перечислина, если учетная запись службы НЕ является администратором и службой INSIDE. Это очень проволочная проблема.

Я проверяю документацию для EnumServicesStatusEx из MSDN и обнаруживает, что локальный администратор имеет дополнительный SC_MANAGER_LOCK, чем локальный аутентифицированный пользователь. Это причина? Но я НЕ МОЖЕТ связывать блокировку с перечислением сервиса.

Или кто-нибудь, пожалуйста, укажите способ запроса имени службы внутри службы.

Спасибо.

BTW, Это на Windows 2008 R2.

У меня проблема: How to get name of windows service from inside the service itself. 1st answer не подходит для меня. Я хочу предоставить общую библиотеку и не иметь никакого контроля для установщика. 2nd answer та же идея со мной. Думаю, он должен быть таким же с моим результатом.

ответ

0

Это разрешение вопрос.

Run PsService от Sysinternals нравится:

psservice.exe security InstrumentationTestService 

и я получил следующий результат:

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. Он возвращает имя службы * N/A *. BTW, если я запустил список задач в powershell с учетной записью службы, он может вернуть правильное имя службы. Таким образом, ваше решение не удалось. слишком. – DeepNight

+0

Вы не забудете назвать это правильно? Можете ли вы дать точный синтаксис, который вы используете? – JPBlanc

+0

'tasklist/FI" PID eq 2524 "/ SVC' return" sqlservr.exe 2524 MSSQLSERVER "в консоли возвращает« sqlservr.exe 2524 N/A »в служебном отладочном выходе. Так подключен. – DeepNight

Смежные вопросы