Ответ Роджера Липскомба, чтобы использовать WTSEnumerateSessions , чтобы найти правильный рабочий стол, затем CreateProcessAsUser , чтобы запустить приложение на этом рабочем столе (вы передаете ему дескриптор рабочего стола как часть структура STARTUPINFO ) правильная.
Однако я бы настоятельно рекомендовал не делать этого. В некоторых средах, таких как серверы терминалов со многими активными пользователями, определить, какой рабочий стол является «активным», нелегко и даже невозможно.
Но самое главное, если приложение внезапно появится на рабочем столе пользователя, это вполне может произойти в неподходящее время (либо потому, что пользователь просто этого не ожидает, либо потому, что вы пытаетесь запустить приложение, когда сеанс еще не полностью инициализирован, в процессе закрытия или как угодно).
Более общепринятым подходом было бы создание ярлыка для небольшого клиентского приложения для вашей службы в глобальной группе запуска. Затем это приложение будет запускаться вместе с каждым сеансом пользователя и может использоваться для запуска других приложений (если это необходимо) без каких-либо манипуляций с учетными данными пользователя, сеансами и / или рабочими столами.
Кроме того, этот ярлык может быть перемещен / отключен администраторами по желанию, что значительно упростит развертывание вашего приложения, поскольку оно не отклоняется от стандартов, используемых другими приложениями Windows ...