Передается ли маркер безопасности Windows между процессами? - PullRequest
9 голосов
/ 25 февраля 2010

Представьте, что у меня есть существующий процесс, работающий под Windows от имени конкретного пользователя. Будет ли разрешено, чтобы этот процесс взял свой текущий токен (с чем-то вроде OpenThreadToken и DuplicateTokenEx), передал его другому процессу на том же компьютере (возможно, через сетевой сокет или другой IPC), а затем ожидал, что этот процесс сможет использовать его для вызова CreateProcessAsUser?

Из документации, которую я прочитал (http://msdn.microsoft.com/en-us/library/ms682429%28VS.85%29.aspx), Я не видел ничего, что бы запрещало это, но, возможно, токен может использоваться только тем потоком или процессом, который его создал.

(Зачем вам? Я хочу, чтобы веб-запрос пришел в IIS, прошел проверку подлинности, чтобы IIS организовал олицетворение удаленного пользователя, а затем передал маркер олицетворения другому процессу сервера (на том же компьютере), чтобы серверный процесс может выполнять некоторые проверки безопасности в контексте удаленного пользователя)

Ответы [ 3 ]

8 голосов
/ 11 марта 2010

Да, это возможно. Вы можете использовать DuplicateHandle, чтобы получить дескриптор, действительный для целевого процесса (отправьте новое значение дескриптора целевому процессу, чтобы он знал его). Однако целевой процесс должен по-прежнему иметь права на использование токена соответствующим образом. Например. SE_IMPERSONATE для олицетворения пользователя и SE_ASSIGN_PRIMARY для использования CPAU. Конечно, есть некоторые исключения, которые вы можете прочитать в MSDN для ImpersonateLoggedOnUser и CPAU.

5 голосов
/ 25 февраля 2010

Я не пробовал, но, похоже, это тот же вопрос , который задают здесь .Описание, кажется, имеет смысл.Передайте идентификатор процесса через любой механизм, который вы выберете (например, IPC), затем вызовите OpenProcess , OpenProcessToken и, наконец, ImpersonateLoggedOnUser .Полученный дескриптор может быть передан CreateProcessAsUser.Ну ... я знаю, что это можно передать этой функции, но не знаю, получит ли она желаемый результат.Интересный вопрос, хотя.

4 голосов
/ 26 февраля 2010

Почему бы просто не использовать именованные каналы, а затем вызвать ImpersonateNamedPipeUser () - это безопасно, надежно и просто! Обратите внимание, что процесс, выполняющий олицетворение ДОЛЖЕН , имеет привилегию олицетворения.

...