Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Порядок загрузки сервисов


Автор: Sheff 24.11.2007, 00:26
Всем привет!
Столкнулся с вот какой проблемой: есть сервис, запускающийся автоматом при старте системы, зависящий от сервиса winmgmt (т.е от WMI).
Задача - заставить мой сервис запускаться до входа какого-либо юзера в систему. Понятно, что до winlogon'а у меня загрузиться не получится, т.к все сервисы грузятся после его запуска (согласно Русиновичу), но хотелось бы загрузить свой сервис как можно скорее, так чтобы он уже работал, когда юзер зайдёт в свой аккаунт. Сейчас ситуация следующая: если немного подождать на экране выбора пользователя, а потом зайти в систему под каким-либо юзером, то сервис оказывается запущеннным, но если действовать быстро, т.е как только появляется экран выбора юзера сразу же кликнуть по какому-нибудь, то оказывается, что мой сервис ещё не запущен и запускается он через секунд так 10-15. Такого быть не должно, мне нужно чтобы сервис гарантированно уже был запущен, когда юзер попадает на свой десктоп. Как бы это сделать ? Можно конечно поместить мой сервис в какую-нибудь группу сервисов, например в "Boot" или "System", но это не подходит, т.к мой сервис использует WMI, а сервис WMI группы не имеет, поэтому запускается фиг знает когда. Конечно, можно сменить группу WMI, но это уже хак, т.к изменять жизненно важные параметры системы - последнее дело. Изменив порядок загрузки WMI ненароком можно добиться того что другие сервисы, зависящие от WMI, перестанут работать. Существует ли какое-нибудь решение моей задачи ? Какие будут предложения ?

Автор: W4FhLF 24.11.2007, 07:44
Загрузка winmgmt зависит от службы RPCSS, т.е. winmgmt будет грузиться после неё. В этом ты можешь убедиться посмотрев в раздел HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\winmgmt на ключ DependOnService. Сам RPCSS принадлежит к группе COM Infrastructure, он в ней единственный сервис. Порядок загрузки по группам ты можешь посмотреть вот здесь: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder. Просто проанализируй все эти параметры, поидее тебе должны помочь параметры DependOnService и DependOnGroup. Т.е. создаёшь DependOnService со значением winmgmt и служба будет грузится сразу после winmgmt.  

Автор: Sheff 24.11.2007, 09:42
W4FhLF, всё это я знаю, я так и делаю, ставлю DependOnService - winmgmt, это не помогает, т.к служба конечно грузится после WMI, но сам WMI грузится довольно-таки поздно, так что до логина юзера сделать загрузку моего сервиса не получается

Автор: W4FhLF 24.11.2007, 09:51
Sheff, не понимаю тогда твоей позиции. Твоя задача не позволяет грузится до того, как произойдёт логин и использовать WMI, значит что-то одно надо исключить, это ведь очевидно. 

Автор: Sheff 24.11.2007, 10:57
W4FhLF, наоборот, мне нужно сделать так чтобы мой сервис грузился после загрузки WMI, но до входа в десктоп, неужели это невозможно ?

Автор: W4FhLF 24.11.2007, 12:10
"вход в десктоп" - какую службу ты имеешь ввиду?

Автор: Sheff 24.11.2007, 12:12
W4FhLF, я имею ввиду когда юзер "кликает на иконке", т.е логинится. Вот до этого момента я обязан запустить мою службу.

Автор: W4FhLF 24.11.2007, 13:58
Хм, тебе служба не поможет. 

За авторизацию пользователя в системе целиком отвечает winlogon, а он грузится ещё до пользовательскиз служб. Он сам запускает SCM (service.exe) после загрузки компонентов, которые учавствуют в входе, этим объясняется:

Цитата(Sheff @  24.11.2007,  00:26 Найти цитируемый пост)
Сейчас ситуация следующая: если немного подождать на экране выбора пользователя, а потом зайти в систему под каким-либо юзером, то сервис оказывается запущеннным, но если действовать быстро, т.е как только появляется экран выбора юзера сразу же кликнуть по какому-нибудь, то оказывается, что мой сервис ещё не запущен и запускается он через секунд так 10-15.


Тебе нужен другой вариант. Могу предложить такой.
Winlogon получает аутентификацонные данные через Graphical Identification and Authentification DLL, по дефолту это либа msgina.dll, но ты можешь установить свою GINA DLL, установив параметр HKLM\Software\Microsoft\WIndows NT\Current Version\ WinLogon\GinaDLL.
Тогда твоя DLL будет иметь возможность управлять авторизацией и входом в винду. 

Автор: Sheff 24.11.2007, 16:20
W4FhLF, да про подмену джины мне известно, да вообще можно проще сделать: написать сервис ядра. Между прочим, часть этого моего сервиса как раз и есть сервис ядра, просто в проекте уже поздно что-то менять, нужно сделать так чтобы заработало через сервисы, но я подозревал что это невозможно :( W4FhLF, спасибо огромное за помощь smile Тема закрыта

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