# Spawning Processes into Interactive Sessions

Starting a Windows process using .NET is normally an easy thing.  
You call Process.Start() with a little setup, and the process runs.

But, that starts a process in the same Windows session as the thread that calls Process.Start().

This, of course, doesn’t work for a Windows Service, since a service runs in a non-interactive Windows session (session 0).

For a Windows Session to spawn processes into interactive user sessions, a few steps are required.

Specifically, we have to:

- Identify the target session
- Retrieve the primary access token
- Duplicate the primary token
- Copy environment variables
- Assign the working directory
- Create the process

Here’s a library that I’ve pieced together, that abstracts the calls and ceremony needed to start a process in an arbitrary Window session, without handle leakage.

[LeeWhite187/OGA.ProcessExtensions.Windows.Lib](https://github.com/LeeWhite187/OGA.ProcessExtensions.Windows.Lib "https://github.com/LeeWhite187/OGA.ProcessExtensions.Windows.Lib")

It was adapted from [ng-pe/cassia](https://github.com/ng-pe/cassia "https://github.com/ng-pe/cassia") and [murrayju/CreateProcessAsUser](https://github.com/murrayju/CreateProcessAsUser "https://github.com/murrayju/CreateProcessAsUser")

See the repository page for example usage.