2012-02-03 2 views
4

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

enter image description here

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

Пример:

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

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

Тем не менее фактическое описание, приведенное в разделе Services.msc:

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

-

Я искал на сайте MSDN и наткнулся на это:

SERVICE_DESCRIPTION structure

lpDescription

Описание сервиса. Если этот элемент равен NULL, описание не изменяется. Если это значение является пустой строкой (""), текущее описание удаляется.

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

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

@ [путь] DllName, -strID

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

-

pszOutBuf [вне, опционально]

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

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

@ [путь] \ DllName, -strID

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

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

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

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

Все, что мне нужно - это получить описание Сервиса, оно, конечно, не может быть таким сложным, как это может быть?

Thanks :)

+3

Что вы хотите сказать спасибо, вы пытаетесь быть саркастическим или чем-то еще? Я задал вопрос, на который я не был уверен, мне нужна была помощь и помощь. Я читал на MSDN и до сих пор не понял. Если бы я не отложил то, что я исследовал, это будет выглядеть для многих, что я просто искал кого-то другого, чтобы сделать эту работу для меня. Это не то, что я хочу, я просто хотел получить совет о том, как сделать что-то, на что я думал, для этого сайта. Не нужно даже саркастически относиться к этому. –

+0

Фактически я не был [пытается быть] саркастическим. В любом случае, вы приняли ответ, в котором работники JEDI работали для вас. Это четко указывает. – OnTheFly

+0

Windows может использовать ресурсы для хранения локализованных данных (например, сообщения журнала событий используют один и тот же механизм). Описание сервиса может быть локализовано таким же образом, и это стало еще более важным, поскольку язык Windows можно переключать, поэтому приложения не могут выполнять задачи локализации только при настройке. Вам нужно будет прочитать ресурсы DLL, используя правильную локаль для вашей системы. Но если вы используете API Service Manager, Windows сделает это за вас - и это будет «опубликованный» способ. Внутреннее хранение этих данных может измениться, API-интерфейсы более стабильны. –

ответ

3

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

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

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

+0

Отлично спасибо Уоррен, я посмотрю на это :) –

+0

Если вы не хотите, чтобы зависимость от джедая вы можете вызвать API-интерфейс менеджера управления win32. –

+0

Также можно извлечь только несколько единиц из джедаев в папку и избежать необходимости переписывать обертки API. –

1

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

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

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

4

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

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

+1

+1 I второй заключительный абзац –

2

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

WMI Delphi Code Creator

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

+0

+1, WMI, безусловно, выглядит интересно –

+0

Просто будьте осторожны, что WMI проходит через COM, потому что он предназначен для использования инструментами, которые не могут напрямую вызвать Windows API (языки скриптов и т. Д.). Это может быть проще в использовании (хотя и несколько «тяжелее»), в то время как API обычно дает лучший контроль и улучшает коды ошибок, когда что-то идет не так. –

+0

Огромная информация и спасибо за предостережение, я читал о WMI на сайте Википедии, с которым вы связались, и, конечно же, есть много информации для переваривания! –

0

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

С помощью этого компонента вы можете получить доступ к классу Win32_Service; Вы можете проверить the properties and structure here.

С уважением