📢 We are actively seeking collaborators to help maintain and improve this project!
This library was created 10+ years ago when I was actively working on Windows services. I have since moved on to other things, and I'm not in a position to easily maintain this project, which is still actively used by the community. If you are interested in helping, please reach out!
This uses the Win32 apis to:
- Find the currently active user session
- Spawn a new process in that session
This allows a process running in a different session (such as a windows service) to start a process with a graphical user interface that the user must see.
Note that the process must have the appropriate (admin) privileges for this to work correctly. For WTSQueryUserToken you will need the SE_TCB_NAME privilege, which is typically only held by Services running under the LocalSystem account ( SO Link ).
using murrayju.ProcessExtensions;
// ...
ProcessExtensions.StartProcessAsCurrentUser("calc.exe");
The second argument is used to pass the command line arguments as a string. Depending on the target application, argv[0]
might be expected to be the executable name, or it might be the first parameter. See this stack overflow answer for details. When in doubt, try it both ways.
The DemoService
project uses .NET Framework 4.8. Building the demo will copy the batch files to the build target.
Similarly, the DemoModernService
project uses .NET 8.0, and a build will copy the batch files to the build target.
For either version, CD to the bin directory and run createService
to install and start the service. It will launch calc.exe
as soon as it starts. After that, run deleteService
to stop and uninstall the service.