Мишень нить выдает себя во время разговора, поэтому вы получаете неправильный маркер. Использование OpenProcessToken() вместо OpenThreadToken() должно решить проблему. Если по какой-то причине у вас есть только идентификатор потока, а не идентификатор процесса, GetProcessIdOfThread() преодолеет разрыв.
В качестве альтернативы, если у вас есть причина для использования маркера олицетворения, вам нужно будет использовать DuplicateTokenEx(), чтобы преобразовать его в первичный токен. Но это вряд ли будет тем, что вы хотите сделать, потому что оно вводит условие гонки, так как вы, как правило, не сможете узнать, когда целевой поток олицетворяет правильного пользователя. Кроме того, он не будет работать вообще, если поток окажется олицетворением на анонимном уровне.
(Это состояние гонки, вероятно, также, почему это, кажется, работает на других некоторых машинах, но не так, хотя это также может быть то, что подражание происходит только на некоторых версиях Windows.)
ли OpenThreadToken успеха? Если не результат GetLastError? –
Да, OpenThreadToken преуспевает. – user5327778