This shouldn't really be done like this from Vista onwards as services are designed not to be able to interact with the desktop. Here's a more in-depth document about the subject.
http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx
Typically, you would put the desktop executable in user startup folders or similar and have it communicate with the service.
Here's the paragraph that affects you:
For more complex interactions, developers should move their UI code into an agent that runs in the user’s session and handles all UI requirements. The agent communicates with the service through RPC or named pipes. If the user initiates the UI interaction by using Control Panel, Internet Explorer, or a similar UI experience, that UI experience should start the agent. The agent then handles all UI interactions. If UI is required but is not initiated by the user, the service must request the agent to start any required UI, instead of attempting to launch that UI by itself. In the rare situation where the service must initiate a user interaction and the agent is not already running, the service should call the CreateProcessAsUser API to start the agent. The agent can then initiate all UI interactions. It is important for developers to carefully review all possible usage scenarios and consider moving all UI code into an agent that runs in the user session.