0

Создание маркера с помощью OpenThreadToken(), а затем передавать его CreateProcessAsUser терпит неудачу с:CreateProcessAsUser неудачу с 1349: Тип маркера не подходит для его попытки использования

1349: Тип маркера не подходит для его попытка использования.

Успешно на одной машине, но не работает на других win2008r2.

DesiredAccess, который передается OpenThreadToken является: TOKEN_QUERY|TOKEN_IMPERSONATE|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY

+0

ли OpenThreadToken успеха? Если не результат GetLastError? –

+0

Да, OpenThreadToken преуспевает. – user5327778

ответ

1

существуют 2 TOKEN_TYPE - TokenPrimary и TokenImpersonation. CreateProcessAsUser принимаем только TokenPrimary. с другой стороны, поток, если есть токен - всегда есть TokenImpersonation токен. поэтому маркер, возвращенный OpenThreadToken является TokenImpersonation вам нужно позвонить DuplicateTokenEx(.., TokenPrimary,); и передать этот новый маркер CreateProcessAsUser

--- EDIT ---

действительно начинаются с Windows 7 мы можем использовать и TokenImpersonation в качестве параметра CreateProcessAsUser хотя в MSDN написал о первичном токере. но в XP/2003 используется другой код для CreateProcessAsUser - прямой называется NtSetInformationProcess(,ProcessAccessToken,); ->PspSetPrimaryToken ->PspAssignPrimaryToken ->STATUS_BAD_TOKEN_TYPE

+0

Но я вижу эту проблему только на одной машине, она проходит на другой машине. Есть ли запись в реестре, которая может создать проблему на этой машине. – user5327778

+0

любая запись реестра здесь не связана. токен, возвращаемый OpenThreadToken, не должен работать с CreateProcessAsUser где угодно (может быть, только xp, где другая реализация CreateProcessAsUser - сначала создайте процесс, чем попробуйте назначить ему токен). и вы не показываете код self – RbMm

+0

есть ли другой способ, кроме DuplicateTokenEx(), преобразовать токен олицетворения в первичный токен? – user5327778

0

Мишень нить выдает себя во время разговора, поэтому вы получаете неправильный маркер. Использование OpenProcessToken() вместо OpenThreadToken() должно решить проблему. Если по какой-то причине у вас есть только идентификатор потока, а не идентификатор процесса, GetProcessIdOfThread() преодолеет разрыв.

В качестве альтернативы, если у вас есть причина для использования маркера олицетворения, вам нужно будет использовать DuplicateTokenEx(), чтобы преобразовать его в первичный токен. Но это вряд ли будет тем, что вы хотите сделать, потому что оно вводит условие гонки, так как вы, как правило, не сможете узнать, когда целевой поток олицетворяет правильного пользователя. Кроме того, он не будет работать вообще, если поток окажется олицетворением на анонимном уровне.

(Это состояние гонки, вероятно, также, почему это, кажется, работает на других некоторых машинах, но не так, хотя это также может быть то, что подражание происходит только на некоторых версиях Windows.)

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