Das Ziel-Thread wird zum Zeitpunkt des Anrufs Identitätswechsel, so dass Sie das falsche Zeichen zu bekommen. Die Verwendung von OpenProcessToken() anstelle von OpenThreadToken() sollte das Problem beheben. Wenn Sie aus irgendeinem Grund nur die Thread-ID und nicht die Prozess-ID haben, wird GetProcessIdOfThread() die Lücke schließen.
Wenn Sie aus irgendeinem Grund das Identitätswechsel-Token verwenden möchten, müssen Sie DuplicateTokenEx() verwenden, um es in ein primäres Token zu konvertieren. Aber das ist wahrscheinlich nicht das, was Sie tun möchten, weil es eine Race-Bedingung einführt, da Sie normalerweise nicht wissen können, wann der Ziel-Thread sich als der richtige Benutzer ausgibt. Außerdem wird es überhaupt nicht funktionieren, wenn sich herausstellt, dass sich der Thread auf anonymer Ebene imitiert.
(Diese Race-Bedingung ist wahrscheinlich auch, warum es scheint auf einigen Maschinen zu arbeiten, andere aber nicht, obwohl es auch, dass der Identitätswechsel stattfindet, auf bestimmten Windows-Versionen nur sein könnte.)
Does Open gelingen? Wenn nicht, was ist das Ergebnis von GetLastError? –
Ja, das OpenThreadToken ist erfolgreich. – user5327778