Programann unter anderem Benutzernamen starten
-
Also Situation wie folgt:
Der Benutzer "User123" ist eingeloggt, er startet mein Programm das per Manifest Adminrechte fordert, die der User123 nicht hat. Er gibt einen ihm bekannten Adminname und Passwort ein. Das Programm läuft.
In meiner Funktion hole ich mir den Token des angemeldeten Users (User123), aber der Versuch im Programm "CreateProcessAsUser" aufzurufen scheitert mit dem Fehlercode/Fehlermeldung:
error code = 1314
error message = Dem Client fehlt ein erforderliches Recht.Hier der vollständige Code:
boolean ExeProggyAsDesktopUser(void){ HWND hWnd; DWORD id; HANDLE hProcess; boolean back = FALSE; HANDLE hToken, hNewToken; STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; if((hWnd = GetShellWindow()) == 0){ MessageBox(NULL, "GetShellWindow", "Error", MB_OK | MB_ICONERROR); return FALSE; } if(GetWindowThreadProcessId(hWnd, &id) == 0){ MessageBox(NULL, "GetWindowThreadProcessId", "Error", MB_OK | MB_ICONERROR); return FALSE; } if((hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id)) == NULL){ MessageBox(NULL, "OpenProcess", "Error", MB_OK | MB_ICONERROR); return FALSE; } if(OpenProcessToken(hProcess, (TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_IMPERSONATE | TOKEN_EXECUTE), &hToken) == 0){ MessageBox(NULL, "OpenProcessToken", "Error", MB_OK | MB_ICONERROR); CloseHandle(hProcess); return FALSE; } CloseHandle(hProcess); if(DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenPrimary, &hNewToken) == 0){ MessageBox(NULL, "OpenProcessToken", "Error", MB_OK | MB_ICONERROR); return FALSE; } si.cb = sizeof(STARTUPINFO); if(CreateProcessAsUser(hNewToken,"C:\\Program Files (x86)\\Windows NT\\Accessories\\wordpad.exe", "", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) == 0){ MessageBox(NULL, "CreateProcessAsUser", "Error", MB_OK | MB_ICONERROR); CloseHandle(hNewToken); return FALSE; } CloseHandle(hNewToken); return TRUE; }
Wenn ich mein Programm normal als angemeldert Benutzer (User123) starte (geändertes Manifest) wird "Wordpad.exe" aufgerufen.
Was muss ich machen damit die Funktion wie gewünscht ausgeführt wird?
-
Damit CreateProcessAsUser funktioniert müssen folgende Rechte vorhanden sein:
• Act as part of the operating system
• Create a token object
• Log on as a batch jobMit Sicherheit fehlt das letzte recht.
Mal ne Frage: Was versprichst Du Dir davon? Es löst kein UAC Problem....
-
Das Ausführen von Wordpad.exe war nur das Arbeitsbeispiel. Ich habe ein kleines Tool geschrieben das mir in der Firma bei administrativen Aufgaben an anderen Rechnern helfen soll unter anderen soll z.B.
folgender Inhalt einer Batch-Datei programmiertechnisch ausgeführt werden (dient dazu den Icon-Cache des angemeldeten Benutzers zu leeren).
@echo off taskkill /f /IM explorer.exe CD /d %userprofile%\AppData\Local DEL IconCache.db /a Start /Wait explorer.exe
Ich will natürlich explorer.exe nicht als Admin ausführen sondern als der angemeldeter Benutzer. Mein Programm benötigt aber Adminrechte weil es eine ganze Sammlung von Funktionen bereitstellt die teilweise als Admin und teilweise als angemeldeter Benutzer ausgeführt werden sollen.
In der Regel greif ich mit Teamviewer auf die Rechner in unserer Firma zu, der Benutzer ist noch angemeldet und ich führ halt den Kram aus der notwendig ist. Hierfür hab ich mein selbstgestrickets Tool gebastelt. Mit einigen Klicks bin ich durch und es kann weiter gehn.
-
Und wie willst Du ohne Kennwort des Benutzers an das Token kommen, wenn Dein Programm als Admin läuft, also unter einem anderen Token?
-
Mein Code oben holt doch schon das Token des Benutzers. Zumindest hab ich über den Weg auch den Benutzernamen erhalten und die Registry SID des Benutzers.
Brauch ich dafür ein anderes Token?
-
Ok. "CreateProcessWithTokenW" macht genau das was ich brauche, vorausgesetzt irgendein Process des aktuell eingeloggten Users läuft noch irgendwo und ich komm an sein Token ran.
Aber ich hab auch noch nie gesehen das "explorer.exe" der einzige User Process ist, daher extrem unwarscheinlich, dass es fehlschlägt.