Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > TService запускается в WinXP, но WinServer2008


Автор: prgmdelphi 27.6.2014, 15:48
Добрый день. Ранее для определенных задач был написан собственный сервис (наследник от TService). Все было хорошо сервис без проблем работал в WinXP, но встала задача запустить его на Windows Server 2008. Сервис установился в службы, но вот при попытке его запуска выдается сообщение мол нет доступа код ошибки 5. В реестре для пользователей этого сервиса назначил максимальные права, все равно ошибка доступа. Вот думаю может что-то в Win Server 2008 изменилось и теперь требуется другой подход работы с сервисами?
Не вдаваясь в подробности, логика работы сервиса у меня была такой - если запуск MyService.exe происходил с параметром /INSTALL или /UNINSTALL то все сводилось к вызову некого моего метода Execute, который собственно создавал TMyService - наследник TService, а именно:
Код

if not SvcMgr.Application.DelayInitialize or SvcMgr.Application.Installing then
  SvcMgr.Application.Initialize;
SvcMgr.Application.CreateForm(TMyService, MyService);
SvcMgr.Application.Run;

Но помимо базовых параметров /INSTALL или /UNINSTALL  были свои собственные параметры /START /STOP (старт и остановка сервиса). Они позволяли пользователю управлять сервисом из под командной строки, например, MyService.exe /START приводил к запуску сервиса.
Старт сервиса делался в целом так (не стал здесь приводить целый класс, поэтому упростил код, чтобы минимизировать размер):
Код

 ServiceControlManager := OpenSCManagernil, nil, SC_MANAGER_ALL_ACCESS);
 if (ServiceControlManager <> 0) then
 begin
   ServiceHandle := OpenService(ServiceControlManager, 'MyService', SERVICE_ALL_ACCESS);
   if (ServiceHandle <> 0) then 
     WinSvc.StartService(ServiceHandle, 0, ServiceArgVectors); // ServiceArgVectors == nil
 end;

Так вот при вызове WinSvc.StartService-возвращается, что мол нет доступа.

Автор: kami 27.6.2014, 16:03
Цитата(prgmdelphi @  27.6.2014,  15:48 Найти цитируемый пост)
 В реестре для пользователей этого сервиса назначил максимальные права, 

Это как? Сервис запускается под учеткой конкретного пользователя?
Обычно они инсталлируются и работают под LocalService.
Может, эта служба еще и отображать что-то на рабочем столе пытается (т.е. установлено Interactive)? smile

Добавлено через 2 минуты
А если попытаться запустить сервис из под пользователя (пусть даже и админа) без повышения прав - конечно будет Access Denied.
Да и кроме того - зачем эти Start|Stop? Чем не устраивает net start myservicename ?

Автор: prgmdelphi 27.6.2014, 18:09
Цитата(kami @  27.6.2014,  16:03 Найти цитируемый пост)
Это как?

Очень просто - когда инсталируется сервис в реестре создается группа с именем нашего сервера
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\имя_сервиса
так вот на эту папке можно назначать права.

Когда мой сервис отказался запускаться, то я и попробовал добавить прав, но все равно это не помогло.
Цитата(kami @  27.6.2014,  16:03 Найти цитируемый пост)

Может, эта служба еще и отображать что-то на рабочем столе пытается (т.е. установлено Interactive)? smile

Нет


[quote=kami, 27.6.2014,  16:03, post2614979]А если попытаться запустить сервис из под пользователя (пусть даже и админа) без повышения прав - конечно будет Access Denied.
без повышения прав - права на эту группу дал "Полный доступ" даже обычным пользователям, все равно не помогает

Цитата(kami @  27.6.2014,  16:03 Найти цитируемый пост)

Да и кроме того - зачем эти Start|Stop? Чем не устраивает net start myservicename ? 

Нужны

Автор: PointerToNil 28.6.2014, 08:12
дык, может быть, у пользователя, который запускает MyService.exe /START, нет прав на запуск сервисов? 

и причем тут права на ветку реестра? (это её вы группой назвали?) не при ее чтении/записи же ошибка-то возникает

Автор: prgmdelphi 28.6.2014, 12:16
А ларчик просто открывался...
нужно прогу (Far, cmd и т.п.), в которой мы будем запускать наш сервис MyService.exe /START запустить через меню от админа, даже если твой пользователь сам админ.
Да и еще немаловажно, чтобы на папке где храниться наш файл MyService.exe был доступ, а именно по умолчанию добавлена группа "Администраторы" и полные правы. В противном случае уже ничего не поможет

Автор: kami 30.6.2014, 08:02
Цитата(kami @  27.6.2014,  16:03 Найти цитируемый пост)
 если попытаться запустить сервис из под пользователя (пусть даже и админа) без повышения прав - конечно будет Access Denied.

Цитата(prgmdelphi @  28.6.2014,  12:16 Найти цитируемый пост)
нужно прогу (Far, cmd и т.п.), в которой мы будем запускать наш сервис MyService.exe /START запустить через меню от админа, даже если твой пользователь сам админ.


<offtop>
 - Алло, техподдержка? У меня компьютер пишет "нажмите любую клавишу"!!! Что делать?
 - Ну, а вы нажимали?
 - Нет, как-то не догадался...
</offtop>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)