У меня есть приложение, которое работает как обычный пользователь, а служба работает как локальная система. Я хочу, чтобы приложение могло сообщить службе снова запустить приложение, как только служба выполнила некоторые другие действия. (Таким образом, приложение не будет работать, пока служба делает это «вещь».) Чтобы служба могла запускать приложение в качестве пользователя, который его впервые запустил, ему нужен токен пользователя. Приложение отправляет токен службе, прежде чем она завершит работу, но маркер/дескриптор недействителен, когда служба пытается его использовать. (Первое, что он делает, это DuplicateTokenEx получить первичный токен.)Как получить действительный токен пользователя для CreateProcessAsUser?
Является ли токен пользователя всегда действительным только в процессе, который называется OpenProcessToken?
Есть ли другой способ, которым это можно было бы сделать? Я не хочу, чтобы пользователь должен был «войти» в приложение с помощью logonuser. Это было бы просто глупо. Думаю, я мог бы передать дескриптор процесса для «explorer.exe» из приложения в службу, который служба могла бы использовать для получения токена пользователя, но для этого требовалось бы право доступа PROCESS DUP HANDLE. Я не в восторге от этого решения, но, возможно, это способ сделать это?
Спасибо, я перейду к первой статье, создав токен с ZwCreateToken. Это немного грязно, чтобы упаковать все, что мне нужно в сообщении, но, видимо, работало для других. –
В первой статье есть некоторые ошибки, вторая выглядит неплохо.Но я не уверен, почему вы должны использовать ZwCreateToken (недокументированный, неподдерживаемый и не полностью стабильный метод), когда есть документированные способы делать то, что вы хотите. –
Извините, я имел в виду второй. Не удалось найти и первое. Я делаю что-то вроде http://www.apnilife.com/E-Books_apnilife/Windows%20Programming_apnilife/Windows%20NT%20Undocumented%20APIs/1996%20Ch08_apnilife.pdf. Вы имеете в виду CreateToken? –