Перечислите сервис и статус сервисов под Win-7 - PullRequest
4 голосов
/ 06 апреля 2010

У меня есть приложение для мониторинга служб, которое отслеживает состояние приложения трех других серверов - вы знаете, что такое зеленый, красный статус, запуск, остановка и т. Д.

Проблема в том, что в Windows 7 отображается неправильное состояние, даже если пользователь является администратором.

Кнопки «Пуск», «Стоп» отключены, а кнопка «Установка» включена, цвет статуса серый, что также неверно. Кнопка «Пуск» должна быть активирована, когда статус службы отображается зеленым - приложения работают.

Если приложение запускается с параметром «Запуск от имени администратора», оно ведет себя нормально.

Приложение написано на Delphi 7 и отлично работает в других версиях Windows. Эта строка кода:

OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_ALL_ACCESS);

всегда возвращает 0 под Win7, вызывая проблему.

Любые идеи и, если возможно, любой обходной путь, кроме «Запуск от имени администратора».

1 Ответ

8 голосов
/ 06 апреля 2010

Диспетчер служб можно открыть, не требуя прав администратора, если запрашивается ограниченный доступ. Эта строка кода:

ManagerHandle := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE,
  SC_MANAGER_ENUMERATE_SERVICE);

открывает базу данных активных служб с помощью диспетчера служб, даже если она используется с ограниченной учетной записью пользователя. Возвращенный дескриптор можно затем использовать для вызова EnumServicesStatusEx() для получения информации о запущенных сервисах.

Передача SC_MANAGER_ALL_ACCESS в качестве параметра dwDesiredAccess подразумевает передачу SC_MANAGER_CREATE_SERVICE и как указано в документации:

Только процессы с правами администратора могут открывать дескриптор базы данных, который может использоваться функцией CreateService.

Таким образом, если вы ограничиваете свою программу действиями, которые могут выполнять обычные пользователи, тогда ваш код должен выполняться без изменений в Windows 7. Все остальное должно выполняться либо установщиком, либо специальной программой, которая запускается с повышенными правами.

Кстати, это не новое требование Windows 7, ваше заявление

Приложение написано на Delphi 7 и отлично работает в других версиях Windows.

показывает только то, что вы никогда должным образом не тестировали приложение на ограниченных учетных записях в более ранних версиях ОС. В Windows NT уже (почти 20 лет назад) пользователю с ограниченными правами не было разрешено открывать диспетчер служб с полными правами доступа, поэтому код точно так же потерпит неудачу.

...