https://github.com/murrayju/CreateProcessAsUser
Creates a process in a different Windows session
https://github.com/murrayju/CreateProcessAsUser
Last synced: 11 days ago
JSON representation
Creates a process in a different Windows session
- Host: GitHub
- URL: https://github.com/murrayju/CreateProcessAsUser
- Owner: murrayju
- License: mit
- Created: 2014-05-20T18:15:07.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2024-02-10T16:54:54.000Z (about 1 year ago)
- Last Synced: 2025-04-05T03:12:31.862Z (15 days ago)
- Language: C#
- Size: 39.1 KB
- Stars: 378
- Watchers: 32
- Forks: 119
- Open Issues: 16
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- jimsghstars - murrayju/CreateProcessAsUser - Creates a process in a different Windows session (C# #)
README
# CreateProcessAsUser

---
### 🚧 Looking for maintainers 🚧
> :loudspeaker: **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:
1. Find the currently active user session
2. Spawn a new process in that sessionThis 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](https://github.com/murrayju/CreateProcessAsUser/blob/0381db2e8fb36f48794c073e87f773f7ca1ae039/ProcessExtensions/ProcessExtensions.cs#L197) you will need the __SE_TCB_NAME__ privilege, which is typically only held by Services running under the LocalSystem account ( [SO Link](https://stackoverflow.com/a/1289126/1872399) ).
## Usage
```C#
using murrayju.ProcessExtensions;
// ...
ProcessExtensions.StartProcessAsCurrentUser("calc.exe");
```### Parameters
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](https://stackoverflow.com/a/14001282) for details. When in doubt, try it both ways.## Demo Projects
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.