Как получить действительный токен пользователя для CreateProcessAsUser? - PullRequest
5 голосов
/ 07 апреля 2009

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

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

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

1 Ответ

3 голосов
/ 07 апреля 2009

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

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

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

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

РЕДАКТИРОВАТЬ: Обновлено, чтобы включить Windows 2000. Поскольку вы запускаете службу под учетной записью SYSTEM, она может открыть дескриптор для самого процесса (при необходимости процесс может отправить свой идентификатор процесса). Затем он может открыть токен, прикрепленный к этому процессу, продублировать его и использовать полученный токен для запуска (или перезапуска) целевого приложения.

...