Einzelnen Beitrag anzeigen

psyone

Registriert seit: 19. Okt 2007
5 Beiträge
 
RAD-Studio 2009 Arc
 
#1

CreateProcessAsUser ERROR_PRIVILEGE_NOT_HELD

  Alt 29. Sep 2009, 10:13
Hallo,

ich möchte mein Programm, dass per UAC Prompt Adminrechte erlangt hat, ein anderes Programm starten lassen, dass keine Adminrechte haben soll. Theoretisch müsste ich dafür einfach nur CreateProcessAsUser mit dem LinkedToken meiner Anwendung aufrufen, glaube ich.

Dazu gehe ich so vor:
- Token meiner Anwendung holen (OpenProcess, OpenProcessToken mit PROCESS_ALL_ACCESS, TOKEN_ALL_ACCESS)
- Umwandeln in PrimaryToken (DuplicateTokenEx mit TOKEN_ALL_ACCESS)
- LinkedToken holen (GetTokenInformation)
- CreateProcessAsUser mit dem LinkedToken

Klappt soweit auch alles, aber CreateProcessAsUser liefert den Fehler ERROR_PRIVILEGE_NOT_HELD.
MSDN sagt dazu "Typically, the process that calls the CreateProcessAsUser function must have the SE_INCREASE_QUOTA_NAME privilege and may require the SE_ASSIGNPRIMARYTOKEN_NAME privilege if the token is not assignable."
SE_INCREASE_QUOTA_NAME ist verfügbar und ich aktiviere es auch. SE_ASSIGNPRIMARYTOKEN_NAME ist nicht verfügbar und kann daher nicht aktiviert werden.

Meine Schlussfolgerung: das LinkedToken "is not assignable", denn wenn ich CreateProcessAsUser mit dem uneingeschränkten Token aufrufe klappt es ja auch. Daher die Frage: Wie mache ich mein LinkedToken assignable oder umgehe das Problem auf andere Weise?


Da ich den Nutzer nicht nach seinem Passwort fragen kann/will, kann ich auch nicht auf die diversen Logon Funktionen zurückgreifen. Das Token des eigentlich aktiven Benutzers werde ich vermutlich in meiner per UAC mit Adminrechten ausgestatteten Anwendung nicht bekommen. Einen Dienst, der sich um alles kümmert kann ich in diesem Fall nicht verwenden. Den Umweg über eine COM DLL, die statt meiner Anwendung die Adminrechte erhält, möchte ich möglichst vermeiden.

Ich habe mir auch die JWSCL angesehen. Damit kann ich das gleiche Ergebnis mit deutlich weniger Code erzielen, das Grundproblem bleibt jedoch bestehen. Hier könnte ich mir als Alternative vorstellen ein eingeschränktes Token komplett neu zu bauen und dieses statt dem LinkedToken zu verwenden. Leider weiß icht nicht welche SIDs ich dafür in die RestrictedSIDList eintragen muss.


Über den ein oder anderen Denkanstoß würde ich mich sehr freuen.
  Mit Zitat antworten Zitat