tags:

views:

190

answers:

3

This is the scenario:

I have a service (#1) running as LOCAL SYSTEM, and it will eventually run a process (#2) that updates an application (#3). This process (#2), the updater, must run as LOCAL SYSTEM also, no problem here, since it needs to rewrite some files (#3).

When the updater starts as LOCAL SYSTEM, it will kill any running instance of my application (#3). After the files being update, I need to start the updated application (#3) again as the current logged account.

How could I manage this? Is there anything conceptually wrong in my idea?

UPDATED The updater kills the app just to replace the files.

A: 

If you have access to the user's credentials, you can use Process.Start with a ProcessStartInfo specifying the username and password of the user.

If you don't know the credentials, then I am not sure it can be done.

A work around could be to have the service communicate with your program, asking it to shutdown itself, but before doing so, it should start a seperate tiny program. This should be running in the background, but it will be running with the current user's credentials. When you are finished, ask the background program to start your main program again, then exit.

driis
A: 

One problem is knowing the "logged in user". XP and up support fast user switching, where more than 1 user may be logged on at the same time (vista and up support this feature even if the machine is a domain member).

Here is a link to a Raymond Chen blog article discussing the issue: http://blogs.msdn.com/oldnewthing/archive/2006/08/22/712677.aspx

JMarsch
Downvoters: please comment if you vote me down.
JMarsch
+2  A: 

I don't think there's a way for the service to get its hands on the WindowsIdentity.Token handle it would need to call the CreateProcessAsUser() API function. Unless the app itself provides it.

There's a better way, you don't have to terminate the app to replace its executable files. All you have to do is rename them. You can then put the updates in place and signal the app to restart itself. Another nice advantage of this approach is that the app voluntarily shuts down (including notifying the user) instead of getting rudely aborted. Clean up the renamed files when you see the process terminated.

Hans Passant
How could I easily signal the app to restart itself?
jonaspp
This thread is quite a down-voting fest. Is that you hitting the down vote?
Hans Passant
No, I up voted your reply... there is someone messing around...
jonaspp
There's lots of ways, a good topic for a new thread.
Hans Passant
I will follow your suggestion and create a new thread! Thanks
jonaspp