2009-04-07 7 views
5

У меня есть приложение, которое работает как обычный пользователь, а служба работает как локальная система. Я хочу, чтобы приложение могло сообщить службе снова запустить приложение, как только служба выполнила некоторые другие действия. (Таким образом, приложение не будет работать, пока служба делает это «вещь».) Чтобы служба могла запускать приложение в качестве пользователя, который его впервые запустил, ему нужен токен пользователя. Приложение отправляет токен службе, прежде чем она завершит работу, но маркер/дескриптор недействителен, когда служба пытается его использовать. (Первое, что он делает, это DuplicateTokenEx получить первичный токен.)Как получить действительный токен пользователя для CreateProcessAsUser?

Является ли токен пользователя всегда действительным только в процессе, который называется OpenProcessToken?

Есть ли другой способ, которым это можно было бы сделать? Я не хочу, чтобы пользователь должен был «войти» в приложение с помощью logonuser. Это было бы просто глупо. Думаю, я мог бы передать дескриптор процесса для «explorer.exe» из приложения в службу, который служба могла бы использовать для получения токена пользователя, но для этого требовалось бы право доступа PROCESS DUP HANDLE. Я не в восторге от этого решения, но, возможно, это способ сделать это?

ответ

2
+0

Спасибо, я перейду к первой статье, создав токен с ZwCreateToken. Это немного грязно, чтобы упаковать все, что мне нужно в сообщении, но, видимо, работало для других. –

+0

В первой статье есть некоторые ошибки, вторая выглядит неплохо.Но я не уверен, почему вы должны использовать ZwCreateToken (недокументированный, неподдерживаемый и не полностью стабильный метод), когда есть документированные способы делать то, что вы хотите. –

+0

Извините, я имел в виду второй. Не удалось найти и первое. Я делаю что-то вроде http://www.apnilife.com/E-Books_apnilife/Windows%20Programming_apnilife/Windows%20NT%20Undocumented%20APIs/1996%20Ch08_apnilife.pdf. Вы имеете в виду CreateToken? –

3

У вас есть несколько вопросов здесь, так что я постараюсь рассмотреть их по отдельности, и вы можете исправить меня, если я не понял:

  1. У вас появляется служба и пользовательское приложение, которое не может выполнять определенные функции одновременно. Для этого у вас есть служба, останавливающая приложение, выполнение специальных функций, а затем перезапуск приложения. Если это правильно, то, на мой взгляд, у вас есть недостаток дизайна. Вместо того, чтобы останавливаться, а затем перезапускать приложение, вы должны координировать доступ к общему ресурсу посредством взаимного исключения с использованием именованного мьютекса и/или с использованием метода IPC, такого как именованные каналы, для связи намерений.

  2. Является ли токен пользователя действительным только в процессе, который называется OpenProcessToken? Да, маркер маркера, который вы получили, является индексом в таблице дескрипторов процесса, он не передается напрямую. Вам нужно будет использовать DuplicateHandle, который может быть тем, что вы хотите, но может быть грязным.

  3. Вы хотите найти лучший способ получить токен пользователя для запуска приложения на сеанс пользователя (интерактивный?). Если это так, лучший способ - извлечь токен пользователя и использовать его. Вы можете проверить this article и образец кода, он находится на C#, но его следует относительно легко перенести на выбранный вами язык.

EDIT: Обновление включает Windows 2000. Так как вы работаете службу под учетной записью системы он может открыть дескриптор самого процесса (при необходимости этот процесс может послать свой идентификатор процесса). Затем он может открыть токен, прикрепленный к этому процессу, дублировать его и использовать результирующий токен для запуска (или повторного запуска) целевого приложения.

+0

1. Может показаться дефектом дизайна. Дело в том, что служба может захотеть обновить приложение: это может быть даже не одно и то же приложение, которое должно быть запущено. 2. Согласен, это так. Вместо этого я попытаюсь создать новый токен. 3. Должен работать в 2000 году, забыл упомянуть, что ... –

+0

Почему служба не просто вызывает OpenProcessToken и сам DuplicateTokenEx, а не передает процесс в службу? –

+0

Не будет ли созданный процесс запущен как локальная система в этом случае? Если я это сделаю, я мог бы просто вызвать CreateProcess и не беспокоиться о токенах пользователя. –

Смежные вопросы