0

Erstellen eines Token OpenThreadToken() mit und übergeben Sie dann zu CreateProcessAsUser versagt mit:CreateProcessAsUser mit 1349 Fehler: Der Typ des Tokens ist ungeeignet für seine versuchte Verwendung

1349: Der Typ des Tokens ist ungeeignet für seine versuchte Verwendung.

Es ist erfolgreich auf einer Maschine, aber auf andere win2008r2 fehlgeschlagen.

Die DesiredAccess, die OpenThreadToken übergeben wird: TOKEN_QUERY|TOKEN_IMPERSONATE|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY

+0

Does Open gelingen? Wenn nicht, was ist das Ergebnis von GetLastError? –

+0

Ja, das OpenThreadToken ist erfolgreich. – user5327778

Antwort

1

existieren 2 TOKEN_TYPE - TokenPrimary und TokenImpersonation. CreateProcessAsUser akzeptieren nur TokenPrimary. von einer anderen Seite, Thread, wenn Token haben - immer TokenImpersonation Token-Typ. so Token von OpenThreadToken zurückgegeben wird, ist TokenImpersonation Sie anrufen müssen DuplicateTokenEx(.., TokenPrimary,); und diese neue Token

--- EDIT CreateProcessAsUser passieren ---

wirklich beginnen, von Windows 7 können wir verwenden, und obwohl TokenImpersonation als Parameter CreateProcessAsUser in MSDN über das primäre Token geschrieben. aber in XP/2003 einen anderen Code für CreateProcessAsUser verwendet - genannte direkte NtSetInformationProcess(,ProcessAccessToken,); ->PspSetPrimaryToken ->PspAssignPrimaryToken ->STATUS_BAD_TOKEN_TYPE

+0

Aber ich sehe dieses Problem auf nur einer Maschine, es gibt andere Maschine weiter. Gibt es irgendeinen Registrierungseintrag, der das Problem auf dieser Maschine verursachen kann. – user5327778

+0

jeder Registry-Eintrag hier unabhängig. Token, das von OpenThreadToken zurückgegeben wird, darf nicht mit CreateProcessAsUser irgendwo arbeiten (kann nur xp sein, wo eine andere Implementierung von CreateProcessAsUser - zuerst erstellt Prozess als Versuch Token zuweisen). und Sie zeigen nicht selbst Code – RbMm

+0

gibt es eine andere Möglichkeit als DuplicateTokenEx(), ein Identitätswechsel Token in primäre Token zu konvertieren? – user5327778

0

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.)

Verwandte Themen