Home > Archive > VC Language > June 2005 > How to make sure a Service starts BEFORE a user logs on?
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
How to make sure a Service starts BEFORE a user logs on?
|
|
| Polaris 2005-05-27, 4:03 pm |
| Hi:
I have a regular Windows Service program (not a kernel driver) which must
start BEFORE a user logs into his machine (XP or W2K). It works most of the
time, but sometimes, I noticed that it started AFTER I log on the machine;
especially if I logged in the machine fast right after a reboot.
Is there a way in the service program, I can do something to make sure that,
after reboot, the service starts before a user logs in the machine (no
matter how fast the user is trying to complete his logon process)?
Thanks In Advance !
Polaris
| |
| Ray Trent 2005-05-27, 4:03 pm |
| Services can, of course, take an arbitrary and unpredictable amount of
time to "start up". Off the top of my head, the only way I can think of
to do what you want here would be to write a GINA and synchronize its
passing on of credentials with completion of your service startup.
Ugly job, and nasty if there turns out to be a bug in your code :-).
Why does your service need to run before a user logs on? This sounds
suspiciously like you're asking the wrong question.
Polaris wrote:
> Hi:
>
> I have a regular Windows Service program (not a kernel driver) which must
> start BEFORE a user logs into his machine (XP or W2K). It works most of the
> time, but sometimes, I noticed that it started AFTER I log on the machine;
> especially if I logged in the machine fast right after a reboot.
>
> Is there a way in the service program, I can do something to make sure that,
> after reboot, the service starts before a user logs in the machine (no
> matter how fast the user is trying to complete his logon process)?
>
> Thanks In Advance !
> Polaris
>
>
--
.../ray\..
| |
| Polaris 2005-05-27, 8:59 pm |
| Thanks for the info.
Within the service program, I need to "detect" the event that the machine
has JUST rebooted. So I look for (each second) the change of logged on user
count: right after reboot, the logged on user count should be one (which is
the "System" account, assuming the service starts before any user has logged
on the machine). After the user logs on the machine, the service will notice
that the user count increased to 2 and get a "conclution" that the machine
must have JUST been rebooted. It works fine as long as the user did not log
on to the machine before the service starts.
May be there is other way to detect a reboot event?
Polaris
"Ray Trent" <ratrent@nospam.nospam> wrote in message
news:OHb4mguYFHA.2160@TK2MSFTNGP10.phx.gbl...
> Services can, of course, take an arbitrary and unpredictable amount of
> time to "start up". Off the top of my head, the only way I can think of to
> do what you want here would be to write a GINA and synchronize its passing
> on of credentials with completion of your service startup.
>
> Ugly job, and nasty if there turns out to be a bug in your code :-).
>
> Why does your service need to run before a user logs on? This sounds
> suspiciously like you're asking the wrong question.
>
> Polaris wrote:
>
> --
> ../ray\..
| |
| Robert Moir 2005-05-27, 8:59 pm |
| Polaris wrote:
> Thanks for the info.
>
> Within the service program, I need to "detect" the event that the
> machine has JUST rebooted. So I look for (each second) the change of
> logged on user count: right after reboot, the logged on user count
> should be one (which is the "System" account, assuming the service
> starts before any user has logged on the machine). After the user
> logs on the machine, the service will notice that the user count
> increased to 2 and get a "conclution" that the machine must have JUST
> been rebooted. It works fine as long as the user did not log on to
> the machine before the service starts.
> May be there is other way to detect a reboot event?
Given that you're actually detecting the user logging on and off, which
isn't the same thing at all as a reboot event, you could try watching the
system event log for "EventLog" to log a 6009 event closely followed by a
6005 event.
Or you could set the Net Logon service to have your service as a dependancy.
| |
| Roland Frank 2005-05-27, 8:59 pm |
| Hi Polaris,
just a stupid thought maybe, but how likely is it
that some user restarts your service?
So, isn't start of your service information enough
that the machine JUST rebootet?
Roland
> Thanks for the info.
>
> Within the service program, I need to "detect" the event that the machine
> has JUST rebooted. So I look for (each second) the change of logged on user
> count: right after reboot, the logged on user count should be one (which is
> the "System" account, assuming the service starts before any user has logged
> on the machine). After the user logs on the machine, the service will notice
> that the user count increased to 2 and get a "conclution" that the machine
> must have JUST been rebooted. It works fine as long as the user did not log
> on to the machine before the service starts.
>
> May be there is other way to detect a reboot event?
>
> Polaris
>
> "Ray Trent" <ratrent@nospam.nospam> wrote in message
> news:OHb4mguYFHA.2160@TK2MSFTNGP10.phx.gbl...
>
>
>
>
| |
| Ray Trent 2005-05-27, 8:59 pm |
| Yes, there are tons of better ways to determine that the machine has
just booted. Probably the easiest really reliable way is to write a
non-unloadable kernel driver that starts during boot. Its DriverEntry
routine will be called exactly.
If you need a service, another poster suggested just using the start of
the service as a flag for this. That works too and is probably even
easier if you already have a service that does something you want it to
do. Services aren't normally restarted, and you can prevent that with
access controls if you're worried about a non-administrator restarting
it. If you're worried about an admin restarting your service, well,
there's not a lot you can do about that in the general case, so don't try.
BTW, detecting a "reboot" (as in a warm boot vs. a cold boot) is
somewhat harder (and a lot harder if not impossible if it has to
determine this with 100% reliability), but it doesn't sound like that's
what you're trying to do.
In any event, the "logged on user count" can be 1 in a large number of
circumstances, so I wouldn't use this as a key for anything.
Polaris wrote:
> Thanks for the info.
>
> Within the service program, I need to "detect" the event that the machine
> has JUST rebooted. So I look for (each second) the change of logged on user
> count: right after reboot, the logged on user count should be one (which is
> the "System" account, assuming the service starts before any user has logged
> on the machine). After the user logs on the machine, the service will notice
> that the user count increased to 2 and get a "conclution" that the machine
> must have JUST been rebooted. It works fine as long as the user did not log
> on to the machine before the service starts.
>
> May be there is other way to detect a reboot event?
>
> Polaris
>
> "Ray Trent" <ratrent@nospam.nospam> wrote in message
> news:OHb4mguYFHA.2160@TK2MSFTNGP10.phx.gbl...
>
>
>
>
--
.../ray\..
| |
| Stefan Kuhr 2005-05-27, 8:59 pm |
| Hi Polaris,
Polaris wrote:
>
> Thanks for the info.
>
> Within the service program, I need to "detect" the event that the machine
> has JUST rebooted. So I look for (each second) the change of logged on user
> count: right after reboot, the logged on user count should be one (which is
> the "System" account, assuming the service starts before any user has logged
> on the machine). After the user logs on the machine, the service will notice
> that the user count increased to 2 and get a "conclution" that the machine
> must have JUST been rebooted. It works fine as long as the user did not log
> on to the machine before the service starts.
>
> May be there is other way to detect a reboot event?
My suggestion is a winlogon notification package for the startup event.
This is really easy to create and reliable and gives you exactly the
event you are looking for: A machine startup. However, winlogon
notification packages are not an option if you target NT4.
--
Stefan
| |
| Philip Doragh 2005-05-28, 3:59 pm |
| "Ray Trent" <ratrent@nospam.nospam> wrote in message
news:OHb4mguYFHA.2160@TK2MSFTNGP10.phx.gbl...
> Services can, of course, take an arbitrary and unpredictable amount of
> time to "start up". Off the top of my head, the only way I can think of to
> do what you want here would be to write a GINA and synchronize its passing
> on of credentials with completion of your service startup.
>
> Ugly job, and nasty if there turns out to be a bug in your code :-).
>
> Why does your service need to run before a user logs on? This sounds
> suspiciously like you're asking the wrong question.
There are all kinds of reasons to start before the user logins... especially
if the service is providing a feature that helps in the login process.
There is no need to try to find out reboots and the like... there is a
simple and architected way to have your service start before WinLogon. The
way is to tell the Service manager that your service is a member of a group
that is a DependOnGroup for WinLogon. Look at information about the
following Service registry key values: DependOnService, DependOnGroup and
Group.
Phil Doragh
| |
| Andrew Frantsuzov 2005-06-01, 4:03 pm |
| Why not track the WMI
Win32_OperatingSystem
LastBootTime
http://msdn.microsoft.com/library/d...atingsystem.asp
for an InstanceModificationEvent as a permanent consumer
http://msdn.microsoft.com/library/d...eive
.asp
http://msdn.microsoft.com/library/d...t_all_times.asp
I am sure there is a way to track reboots using WMI and receive permanent
events.
HTH,
Andrew Frantsuzov
"Polaris" <etpolaris@hotmail.com> wrote in message
news:uOuHKutYFHA.2756@tk2msftngp13.phx.gbl...
> Hi:
>
> I have a regular Windows Service program (not a kernel driver) which must
> start BEFORE a user logs into his machine (XP or W2K). It works most of
> the time, but sometimes, I noticed that it started AFTER I log on the
> machine; especially if I logged in the machine fast right after a reboot.
>
> Is there a way in the service program, I can do something to make sure
> that, after reboot, the service starts before a user logs in the machine
> (no matter how fast the user is trying to complete his logon process)?
>
> Thanks In Advance !
> Polaris
>
|
|
|
|
|