Получить описание услуги? - PullRequest
4 голосов
/ 04 февраля 2012

Как получить описание службы Windows, как показано ниже?

enter image description here

Я пытался с помощью реестра Windows, но большинство службпохоже, что описание отсутствует, либо значение описания хранится в dll - так что это неправильный подход.

Пример:

Служба времени Windows (W32Time), описание в реестре отображается как

@% SystemRoot% \ system32 \ w32time.dll, -201

Тем не менее фактическое описание, как видно в службах.msc:

Поддерживает синхронизацию даты и времени на всех клиентах и ​​серверах в сети.Если эта служба остановлена, синхронизация даты и времени будет недоступна.Если эта служба отключена, все службы, которые явно зависят от нее, не запустятся.

-

Я искал на веб-сайте MSDN и обнаружил следующее:

SERVICE_DESCRIPTION структура

lpDescription

Описание услуги.Если этот элемент НЕДЕЙСТВИТЕЛЕН, описание остается неизменным.Если это значение является пустой строкой (""), текущее описание удаляется.

Описание службы не должно превышать размер значения реестра типа REG_SZ.

Этот элемент может указывать локализованную строку в следующем формате:

@ [путь]dllname, -strID

Строка с идентификатором strID загружается из dllname;путь не является обязательным.Для получения дополнительной информации см. RegLoadMUIString ....

-

pszOutBuf [out, необязательно]

Указатель набуфер, который получает строку.

Строки следующей формы получают специальную обработку:

@ [path] \ dllname, -strID

Загружается строка с идентификатором strIDот имени dllname;путь не является обязательным.Если параметр pszDirectory не равен NULL, к каталогу добавляется путь, указанный в данных реестра.Обратите внимание, что имя dllname может содержать переменные среды, которые необходимо развернуть.

Что, я думаю, подсказывает, почему просмотр реестра показал описание W32Time как @% SystemRoot% \ system32 \ w32time.dll, -201

Если я правильно понимаю, мне нужно прочитать имя dll в памяти и извлечь strID, где хранится описание Сервиса?

Это все меня смущает, я был бы признателен, если бы кто-то мог помочь.

Все, что мне нужно, это получить описание услуги, она, конечно, не может быть такой сложной, как эта?

Спасибо:)

Ответы [ 5 ]

4 голосов
/ 04 февраля 2012

Звоните QueryServiceConfig2 (вы также найдете там пример C).

Все, что вам нужно сделать со службами, должно быть сделано через Service Manager API . Данные реестра должны рассматриваться как «частные» для ОС.

3 голосов
/ 04 февраля 2012

Во всех версиях Delphi, JEDI JCL содержит все необходимое для получения понятных описаний сервисов и все остальное, что связано с API управления сервисами.

Класс TJclSCManager в модуле JclSvcCtrl.pas содержит свойство Services, которое включает в себя имя и описание каждой зарегистрированной службы, а также позволяет запускать, останавливать, включать и отключать службы.

Обновление : Другой ответ здесь от ldsandon указывает, что Delphi RTL, очевидно, включает это уже в XE2, в модуле WinSvc. Смотрите ответ ниже о QueryServiceConfig2. Спасибо лдсандону за указание на этот факт.

2 голосов
/ 04 февраля 2012

Использование WMI - это еще один способ прямого использования Windows API, например, с помощью (бесплатного) генератора кода API

WMI Delphi Code Creator

Инструмент WMI Delphi Code Creator позволяет вам генерировать Object Pascal и код C ++ для доступа к WMI (инструментарий управления Windows) классы, события и методы.

1 голос
/ 04 февраля 2012

Вы используете Unicode? Замечания для функции RegLoadMUIString говорят о том, что поддерживается только версия Unicode.

Функция RegLoadMUIString поддерживается только для Unicode. Хотя обе версии этой функции Unicode (W) и ANSI (A) объявлены, функция RegLoadMUIStringA возвращает ERROR_CALL_NOT_IMPLEMENTED. Приложения должны явно вызывать RegLoadMUIStringW или указывать Unicode как набор символов в вызовах вызова платформы (PInvoke).

Вы пытались звонить RegLoadMUIStringW напрямую?

0 голосов
/ 07 февраля 2012

Вы также можете проверить GLibWMI библиотека . Бесплатная (и включенная исходная) библиотека для работы с WMI. Включите компонент с именем TServiceInfo . Также включена демонстрация для работы с услугами.

С этим компонентом вы можете получить доступ в Win32_Service Class; Вы можете проверить свойства и структуру здесь .

Привет

...