Сейчас на форуме: Kybyx (+3 невидимых)

 eXeL@B —› Оффтоп —› Winapi CreateService
Посл.ответ Сообщение

Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 30 октября 2014 11:42
· Личное сообщение · #1

предыстория мытарств чайника в поисках истины:

жила была Windows XP. замечательная система, но некий гражданин Билли Г. решил что в новом виндовсе начальника безопасности не хватает и ввел такую бяку (благословение) как UAC. и вот наш чайник установив свою программу на висте\семерке\восьмерке понял, что его шедевр работать не будет. он решил схитрить и добавил обязательно требование администраторских прав при запуске приложения. однако UAC его перехитрил и просто перестал запускать из автозапуска это приложение. наш чайник тогда придумал грабли - без прав администратора, но при клике мышкой на иконке программы в систем трее предлагает повысить права и перезапускает с администраторскими правами. однако наш чайник начал чуствовать, что мыши коляться, плачут но продолжают жрать кактус. и решил он им помочь.

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

однако он через какое-то время наткнулся на статьи о запуске своего приложения как сервисную службу. надежда затеплилась вновь! но увы... в описании http://msdn.microsoft.com/en-us/library/windows/desktop/ms682450(v=vs.85).aspx остался непонятным момент с использованием
lpServiceStartName [in, optional]
The name of the account under which the service should run. If the service type is SERVICE_WIN32_OWN_PROCESS, use an account name in the form DomainName\UserName. The service process will be logged on as this user. If the account belongs to the built-in domain, you can specify .\UserName.

откуда брать этот самый DomainName\UserName? и правильно ли что я его ищу, а проблема в чем: приложение при запуске находит путь до моих документов, оттуда читает какие-то конфигурационные файлы. например путь до папки "документс сеттингс\Администратор", однако если добавить службу с флагом NULL в команде CreateService - то само приложение запускается от LocalService чтоли... и соответственно путь до моих документов выглядит иначе - примерно "документс сеттингс\LocalService", а там моих документов как бы и нет... и соответственно приложение работать не хочет. посему правильно ли надеяться на этот самый параметр lpServiceStartName? то есть запустить приложение от имени пользователя, а не системы, чтобы определение пути до моих документов был верен.

и второй момент - вист, семерок и восьмерок под рукой пока нет, для ХР это винапи CreateService работает, а будет ли работать на этих системах, а то может там какойнибудь сертификат нужен дополнительный и только время зазря теряю?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 30 октября 2014 12:04
· Личное сообщение · #2

Будет работать в новых ОС. А что непонятного в DomainName\UserName? Брать и прописывать имя домена и имя админа на компе, чтобы от них запускать. Как вариант-запускать от LocalSystem и имперсонироваться потом в админа.



Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 30 октября 2014 12:37
· Личное сообщение · #3

DomainName тоже самое что имя компьютера? с UserName вроде разобрался - GetUserName... в итоге вышло примерно так: "MAIN\Администратор"

а как теперь это значение указать в команде?
CreateService_(schSCManager, @ServiceName.s,@DisplayName.s, dwDesiredAccess,dwServiceType,dwStartType,dwErrorControl,@PathToServiceEXE.s,0,0,0,"MAIN\Администратор",0)
ругается. пишет неверные параметры. если вместо "MAIN\Администратор" указать 0 - работает. предположим имя и домейн я получил не верно, то можно проверить это указав кошерное имя типа NT AUTHORITY\LocalService или NT AUTHORITY\NetworkService - но и с ними пишет неверные параметры. это должна быть текстовая переменная или указатель? в описании этого я не понял...

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



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 30 октября 2014 13:48
· Личное сообщение · #4

SeregaZ пишет:
однако UAC его перехитрил и просто перестал запускать из автозапуска

Есть воркараунд: запускаться из RunOnce и каждый раз пересоздавать параметр. Тогда запускается от админа и молча.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 30 октября 2014 20:30
· Личное сообщение · #5

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

предварительно причина нашлась в совокупности параметров:
dwServiceType.l=#SERVICE_WIN32_OWN_PROCESS | #SERVICE_INTERACTIVE_PROCESS
If the service type specifies SERVICE_INTERACTIVE_PROCESS, the service must run in the LocalSystem account.

то есть получается когда сразу два параметра указаны - то можно запустить только под этим локалом. для DomainName\UserName получается можно использовать только один параметр #SERVICE_WIN32_OWN_PROCESS без второго.

в итоге служба в списке появляется, но стартануть не может. пишет
Ошибка 1069: Служба не запущена из-за ошибки входа в систему

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

все упирается в пароль для учетной записи? нет пароля - не даст запустить под DomainName\UserName?


 eXeL@B —› Оффтоп —› Winapi CreateService

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0

   Для печати Для печати