2016-09-09 3 views
0

Ich verwende einen WindowsService unter Windows Server 2012 und muss die Identität eines Domänenadministratorbenutzers annehmen (der auch zur lokalen Administratorgruppe auf dem Computer hinzugefügt wird).Wie LogonUser() aufgerufen wird, um ein uneingeschränktes vollständiges Token in einem Windows-Dienst mit aktivierter Benutzerkontensteuerung abzurufen?

UAC ist auf dem System aktiviert, und LogonUser wird mit den Anmeldeinformationen mit LOGON32_LOGON_INTERACTIVE aufgerufen. Es scheint, dass ein eingeschränktes Token anstelle eines vollständigen Tokens zurückgegeben wird.

Dies verursacht die administrative Aufgabe, die ich versuche zu scheitern.

Wie kann LogonUser in dieser Situation richtig aufgerufen werden, sodass anstelle eines eingeschränkten Tokens ein vollständiges Token zurückgegeben wird?

PS: Ich stieß auf eine verwandte Frage hier How can I get elevated permissions (UAC) via impersonation under a non-interactive login? , aber es zeigt nicht die genauen Anrufe, die gemacht werden müssen, um das volle Token zu erhalten.

Antwort

4

Sie können ein ungefiltertes Token von LogonUser() erhalten, indem Sie die Option LOGON32_LOGON_BATCH anstelle der Option LOGON32_LOGON_INTERACTIVE verwenden.

Es gibt einen Beispielcode in this answer, der die Verwendung von LOGON32_LOGON_BATCH und die LogonUser() - Funktion zeigt, um ein Verwaltungstoken zu erhalten.


Nachtrag:

Wenn Sie SeTcbPrivilege haben, haben Sie eine weitere Option: Sie LOGON32_LOGON_INTERACTIVE verwenden können, wenn Logonuser() und verwenden Sie dann die TokenLinkedToken Option in GetTokenInformation() aufgerufen wird ein Handle auf das zu erhalten erhöhtes Token, das mit dem gefilterten Token verknüpft ist.

SeTcbPrivilege wird auch als "Als Teil des Betriebssystems handeln" bezeichnet und ist normalerweise nur verfügbar, wenn Sie im lokalen Systemkontext ausgeführt werden.

Wenn Sie nicht SeTcbPrivilege haben, können Sie immer noch GetTokenInformation() aufrufen, um eine Kopie des verknüpften Token zu holen, aber in diesem Fall, dass Sie ein Identitätstoken auf SecurityIdentification Ebene bekommen, so dass es nicht von Nutzen ist, wenn Sie wollen, sind Erstellen Sie einen neuen Prozess. (Kredit an RbMm, um darauf hinzuweisen.)

+0

Wird dies ein primäres Token oder ein imitiertes sein? – Dev28

+0

Nur 'LOGON32_LOGON_NETWORK' erzeugt ein Identitätswechsel-Token. Alle anderen Optionen, einschließlich 'LOGON32_LOGON_BATCH', erzeugen ein primäres Token. (Natürlich können Sie immer ein Identitätswechsel-Token in ein primäres Token oder umgekehrt konvertieren.) –

+0

Siehe auch http://StackOverflow.com/a/35027525/886887 –

Verwandte Themen